初识Kubernetes:(4)Kubernetes实战入门

news/2024/11/16 18:43:49/

初识Kubernetes:(4)Kubernetes实战入门

  • 1 前言
  • 2 Namespace
    • 2.1 概述
    • 2.2 应用示例
  • 3 Pod
    • 3.1 概述
    • 3.2 语法及应用示例
  • 4 Label
    • 4.1 概述
    • 4.2 语法及应用示例
  • 5 Deployment
    • 5.1 概述
    • 5.2 语法及应用示例
  • 6 Service
    • 6.1 概述
    • 6.2 语法及应用示例
      • 6.2.1 创建集群内部可访问的Service
      • 6.2.2 创建集群外部可访问的Service
      • 6.2.3 删除服务
      • 6.2.4 对象配置方式

1 前言

介绍如何在kubernetes集群中部署一个Nginx服务,并且能够对其访问。

2 Namespace

2.1 概述

  • Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。
  • 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。
  • 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。

在这里插入图片描述

kubernetes在集群启动之后,会默认创建几个namespace。

kubectl get namespace

在这里插入图片描述

default:所有未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
kube-system:所有由kubernetes系统创建的资源都处于这个命名空间。

2.2 应用示例

  • 示例:查看所有的命名空间
kubectl get namespace
kubectl get ns
  • 示例:查看指定的命名空间
kubectl get namespace default
kubectl get ns default
  • 示例:指定命名空间的输出格式
kubectl get ns default -o wide
kubectl get ns default -o json
kubectl get ns default -o yaml
  • 示例:查看命名空间的详情
kubectl describe namespace default
kubectl describe ns default

在这里插入图片描述

  • 示例:创建命名空间
kubectl create namespace dev
kubectl create ns dev
  • 示例:删除命名空间
kubectl delete ns dev
  • 示例:命令式对象配置

① 新建ns-dev.yaml:

apiVersion: v1
kind: Namespace
metadata:name: dev

② 通过命令式对象配置进行创建和删除:

kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml

3 Pod

3.1 概述

  • Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
  • Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器。

在这里插入图片描述

  • kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以通过下面的命令查看:
kubectl get pods -n kube-system

在这里插入图片描述

3.2 语法及应用示例

语法:创建并运行Pod

kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
  • 示例:在名称为dev的namespace下创建一个Nginx的Pod
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev

在这里插入图片描述

Tips:新版kubectl run 启动pod形式,不会自动创建deployment控制器了,因此,在对该pod进行删除时,不会自动重建

  • 语法: 查询所有Pod的基本信息
kubectl get pods [-n 命名空间的名称]
  • 示例:查询名称为dev的namespace下的所有Pod的基本信息
kubectl get pods -n dev

在这里插入图片描述

  • 语法:查看Pod的详细信息
kubectl describe pod pod的名称 [-n 命名空间名称]
  • 示例:查看名称为dev的namespace下的Pod的名称为nginx的详细信息
kubectl describe pod nginx -n dev

在这里插入图片描述

  • 语法:Pod的访问
# 获取Pod的IP
kubectl get pods [-n dev] -o wide# 通过curl访问
curl ip:端口
  • 示例:访问Nginx的Pod
kubectl get pods -n dev -o wide
curl 10.244.2.7:80

在这里插入图片描述

  • 语法:删除指定的Pod
kubectl delete pod pod的名称 [-n 命名空间]
  • 示例:删除Nginx的Pod
kubectl delete pod nginx -n dev

在这里插入图片描述

  • 示例:命令式对象配置

① 新建pod-nginx.yaml:

apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports: - name: nginx-portcontainerPort: 80protocol: TCP

② 执行创建和删除命令:

kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml

4 Label

4.1 概述

Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。

Label的特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等。
  • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。

可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。

一些常用的Label标签示例如下:
● 版本标签:“version”:”release”,”version”:”stable”。。。
● 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”。。。
● 架构标签:“tier”:”frontend”,”tier”:”backend”。。。

  • 标签定义完毕之后,还要考虑到标签的选择,这就要用到Label Selector,即:
    • Label用于给某个资源对象定义标识。
    • Label Selector用于查询和筛选拥有某些标签的资源对象。
  • 当前有两种Label Selector:
    • 基于等式的Label Selector。
      • name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象。
      • env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象。
    • 基于集合的Label Selector。
      • name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象。
      • name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象。
  • 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可。
    • name=salve,env!=production。
    • name not in (master,slave),env!=production。

4.2 语法及应用示例

  • 语法:为资源打标签
kubectl label pod xxx key=value [-n 命名空间]
  • 示例:为Nginx的Pod打上标签
kubectl label pod nginx version=1.0 -n dev

在这里插入图片描述

  • 语法:更新资源的标签
kubectl label pod xxx key=value [-n 命名空间] --overwrite
  • 示例:为Nginx的Pod更新标签
kubectl label pod nginx version=2.0 -n dev --overwrite

在这里插入图片描述

  • 语法:查看标签
kubectl get pod xxx [-n 命名空间] --show-labels
  • 示例:显示Nginx的Pod的标签
kubectl get pod nginx -n dev --show-labels

在这里插入图片描述

  • 语法:筛选标签
kubectl get pod -l key=value [-n 命名空间] --show-labels
  • 示例:筛选版本号是2.0的在名称为dev的namespace下的Pod
kubectl get pod -l version=2.0 -n dev --show-labels

在这里插入图片描述

  • 语法:删除标签
kubectl label pod xxx key- [-n 命名空间]
  • 示例:删除名称为dev的namespace下的Nginx的Pod上的标签
kubectl label pod nginx version- -n dev

在这里插入图片描述

  • 示例:命令式对象配置
    ① 新建pod-nginx.yaml:
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: devlabels:version: "3.0"env: "test"        
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports: - name: nginx-portcontainerPort: 80protocol: TCP

② 执行创建和删除命令:

kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml

5 Deployment

5.1 概述

  • 在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。
  • Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod。
  • 在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。

在这里插入图片描述

5.2 语法及应用示例

特别注意:在v1.18版之后,kubectl run nginx --image=nginx --replicas=2 --port=80,会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例。

  • 语法:创建指定名称的deployement
kubectl create deployment xxx [-n 命名空间]
kubectl create deploy xxx [-n 命名空间]
  • 示例:在名称为test的命名空间下创建名为nginx的deployment
kubectl create deployment nginx --image=nginx:1.17.1 -n test

在这里插入图片描述

  • 语法:根据指定的deplyment创建Pod
kubectl scale deployment xxx [--replicas=正整数] [-n 命名空间]
  • 示例:在名称为test的命名空间下根据名为nginx的deployment创建4个Pod
kubectl scale deployment nginx --replicas=4 -n dev

在这里插入图片描述

  • 语法:命令式对象配置

① 创建一个deploy-nginx.yaml,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: dev
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:1.17.1name: nginxports:- containerPort: 80protocol: TCP

② 执行创建和删除命令:

kubectl create -f deploy-nginx.yaml
kubectl delete -f deploy-nginx.yaml
  • 语法:查看创建的Pod
kubectl get pods [-n 命名空间]
  • 示例:查看名称为dev的namespace下通过deployment创建的3个Pod
kubectl get pods -n dev

在这里插入图片描述

  • 语法:查看deployment的信息
kubectl get deployment [-n 命名空间]
kubectl get deploy [-n 命名空间]
  • 示例:查看名称为dev的namespace下的deployment
kubectl get deployment -n dev

在这里插入图片描述

  • 语法:查看deployment的详细信息
kubectl describe deployment xxx [-n 命名空间]
kubectl describe deploy xxx [-n 命名空间]
  • 示例:查看名为dev的namespace下的名为nginx的deployment的详细信息
kubectl describe deployment nginx -n dev

在这里插入图片描述

  • 语法:删除deployment
kubectl delete deployment xxx [-n 命名空间]
kubectl delete deploy xxx [-n 命名空间]
  • 示例:删除名为dev的namespace下的名为nginx的deployment
kubectl delete deployment nginx -n dev

在这里插入图片描述


6 Service

6.1 概述

我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题:

  • Pod的IP会随着Pod的重建产生变化。

  • Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问。
    在这里插入图片描述

  • 这样对于访问这个服务带来了难度,因此,kubernetes设计了Service来解决这个问题。

  • Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡。

在这里插入图片描述

6.2 语法及应用示例

6.2.1 创建集群内部可访问的Service

  • 语法:暴露Service
kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的
  • 示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx1
kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test

在这里插入图片描述

  • 语法:查看Service
kubectl get service [-n 命名空间] [-o wide]
  • 示例:查看名为test的命名空间的所有Service
kubectl get service -n test

在这里插入图片描述

6.2.2 创建集群外部可访问的Service

  • 语法:暴露Service
kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个外部也可以访问的Service
  • 示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx2
kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev

在这里插入图片描述

minikube需要执行:
minikube service svc-nginx2 -n dev --url
再通过对应的ip端口访问

  • 语法:查看Service
kubectl get service [-n 命名空间] [-o wide]
  • 示例:查看名为test的命名空间的所有Service
kubectl get service -n test

在这里插入图片描述

6.2.3 删除服务

  • 语法:删除服务
kubectl delete service xxx [-n 命名空间]
  • 示例:删除服务
kubectl delete service svc-nginx1 -n test

在这里插入图片描述

6.2.4 对象配置方式

  • 示例:对象配置方式

① 新建svc-nginx.yaml,内容如下:

apiVersion: v1
kind: Service
metadata:name: svc-nginxnamespace: dev
spec:clusterIP: 10.109.179.231ports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: ClusterIP

② 执行创建和删除命令:

kubectl  create  -f  svc-nginx.yaml
kubectl  delete  -f  svc-nginx.yaml

http://www.ppmy.cn/news/7715.html

相关文章

了解Java语法体系 -(适合初学者了解)

文章目录前言1. Java工具的安装2. Java数据类型认识2.1 基本类型与引用类型2.2 变量:2.3 数组:3. 方法4. 类和对象5. 继承多态6. 抽象接口7. 字符串类的使用总结✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 前言 本篇通过对Ja…

【SpringMVC】SpringMVC校验

校验理解 项目中,通常使用较多是前端的校验,比如页面中js校验。对于安全要求较高点建议在服务端进行校验。 服务端校验: 控制层conroller:校验页面请求的参数的合法性。在服务端控制层conroller校验,不区分客户端类…

【ESP-Matter】matter协议学习笔记--以乐鑫方案为例

matter协议学习笔记--以乐鑫方案为例0. 写在前边的话1. matter 协议基本概念2. 设备间的本地自动化交互2.1 同步控制的实例:2.2 异步通知(订阅、报告)3. 桥接设备4. thread 边界路由器5. 专业名词0. 写在前边的话 以下学习笔记均参考乐鑫官方…

一文了解什么是NFT

一、什么是NFT NFT 是我们可以用来代表独特物品所有权的代币。他们让我们对艺术品、收藏品甚至房地产等事物进行代币化。资产的所有权由以太坊区块链保护——没有人可以修改所有权记录或复制/粘贴新的 NFT。 NFT 代表不可替代的代币。Non-fungible 是一个经济学术语&#xff…

Java数组,list,set相互转换

1.list转为set List listnew ArrayList<>(new HashSet()); 2.set转为list Set setnew HashSet<>(new ArrayList()); 3.数组转为list int a{1,2,3,4}; List listArrays.asList(a); 4.数组转set int a{1,2,3,4,5,6}; Set setnew HashSet<>(Arrays.asLis…

Spark 之 Join

broadcast join spark.sql.autoBroadcastJoinThreshold 所配置的值&#xff0c;默认是10M&#xff0c;当某一张表的大小小于这个值时&#xff0c;将这张表收集到driver&#xff0c;然后广播到每一个executor上&#xff0c;这样的好处就是&#xff0c;大表进行join的时候&#…

【nowcoder】笔试强训Day12

目录 一、选择题 二、编程题 2.1二进制插入 2.2 查找组成一个偶数最接近的两个素数 一、选择题 1.以下方法&#xff0c;哪个不是对add方法的重载? public class Test {public void add( int x,int y,int z){} } A. public int add(int x,int y,float z){return 0;} B.…

解决医疗健康领域的网络安全和云技术技能差距

说明信息 近年来&#xff0c;网络安全事件 频发&#xff0c;事件造成的影响也日益增大&#xff0c;对于医疗健康行业&#xff0c;网络安全的重要性凸显。随着医疗信息化的普及&#xff0c;医疗设备与相关系统的安全性已经关系到医疗机构 业务的正常运营。勒索软件&#xff0c;…