侧边栏壁纸
博主头像
小周的知识站 博主等级

行动起来,活在当下

  • 累计撰写 80 篇文章
  • 累计创建 12 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录
K8S

Pod 控制器Deployment

Administrator
2024-07-16 / 0 评论 / 0 点赞 / 10 阅读 / 0 字

Pod 控制器Deployment

为了更好的解决服务编排问题,k8s在v1.2版本开始,引入了Deployment(Deploy)控制器,该pod控制器不会去直接管理pod,而是通过管理ReplicaSet来间接的管理pod,所以Deployment比ReplicaSet功能更强大

Deployment功能如下:

  • 支持RS(ReplicaSet)的所有功能

  • 支持发布的停止、继续

  • 支持版本滚动更新和版本回退

案例:通过deploy创建基本的pod

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 3       #创建pod的副本数量,默认为1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.17.0


创建deploy
# kubectl create -f deplo_nginx.yml


查看deploy详细信息
# kubectl get deploy -n test
# kubectl get deploy -n test -o wide

UP-TO-DATE:最新版本的pod数量
AVAILABLE:当前可用的pod数量



查看rs控制器信息,应为deploy通过控制rs管理pod,所以rs控制器也会被创建出来(rs的名称在deploy基础上随机添加)
# kubectl get rs -n test 



查看pod信息(pod名称是在rs基础上随机添加)
# kubectl get po -n test


过滤Pod标签
# kubectl describe pod -n test | grep Labels

删除deploy
# kubectl delete -f deploy_nginx.yml

1 Pod 镜像拉取策略

imagePullPolicy用于设置镜像拉取策略,K8S支持三种拉取策略,可通过下边命令查看:

# kubectl explain pod.spec.containers.imagePullPolicy
- Always       总是从远程仓库拉取镜像
- IfNotPresent 本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
- Never        只使用本地镜像,从不去远程仓库拉取,本地如果没有就报错

默认值说明:如果镜像标签为具体版本号,默认策略是IfNotPresent,如果镜像标签为latest,默认策略是Always

2 Pod 镜像拉取策略 Never

案例:创建pod,并指定镜像拉取策略为Never,只使用本地镜像,从不去远程仓库拉取,本地如果没有就报错。

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       指定一个本地不存的镜像版本
          imagePullPolicy: Never    设置镜像拉取策略



创建pod
# kubectl create -f deploy_nginx.yml


查看pod信息
# kubectl get pod -n test


查看pod详细描述信息
# kubectl describe pod -n test


删除deploy
# kubectl delete -f deploy_nginx.yml

3 Pod 镜像拉取策略 IfNotPresent

案例:创建pod,并指定镜像拉取策略为IfNotPresent,本地有则使用本地镜像,本地没有则从远程仓库拉取镜像

基于上边的案例,将策略改为IfNotPresent即可

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       
          imagePullPolicy: IfNotPresent    设置镜像拉取策略



创建pod
# kubectl create -f deploy_nginx.yml


查看pod信息
# kubectl get pod -n test


查看pod详细信息
# kubectl describe pod -n test


删除deploy
# kubectl delete -f deploy_nginx.yml

4 Pod 端口设置

ports属性用于配置容器需要暴露的端口列表

通过下边命令可以获取ports可以使用的子属性

# kubectl explain pod.spec.containers.ports
containerPort	容器要监听的端口(必须)
name			端口名称,如果指定,必须保证名称在该pod中是唯一的(一般不省略)
hostPort		容器要在主机上公开的端口(一般省略)
hostIP			要将外部端口帮定到的主机IP(一般省略)
protocol		端口协议,必须是TCP、UDP或SCTP,默认为TCP

案例:创建Pod并指定容器暴露80端口

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:                #定义容器端口
          - containerPort: 80   端口(必须为数组类型)
            protocol: TCP       端口协议



创建pod
# kubectl create -f deploy_nginx.yml


查看pod信息
# kubectl get pod -n test



查看pod描述信息
# kubectl describe pod  -n test
...

    Port:           80/TCP



访问pod中的容器需要访问pod的IP加容器端口
# curl 10.244.2.30:80


删除deploy
# kubectl delete -f deploy_nginx.yml

5 Pod 资源配额

resources属性用于限制Pod中的容器对系统的资源的使用量(资源配额),避免容器出现问题大量吞噬系统资源,K8S目前提供了对内存CPU的资源限额

当我们对Pod中的容器配置资源限额以后,如果容器超出资源使用量,K8S则会认为该容器出现故障,则重新启动该容器。

resources属性提供了两个子属性用于资源限制,可通过下边命令查看

# kubectl explain pod.spec.containers.resources

limits    #资源上限:限制容器运行时最大的资源使用量,当容器超出该使用量时,容器会被终止,并进行重启

requests  #资源下限:用于限制容器需要的最小资源,如果环境资源不够,容器将无法启动

案例:创建pod并设置容器资源的上下限

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       
          imagePullPolicy: IfNotPresent   #设置镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: T
            CP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)



创建pod
# kubectl create -f deploy_nginx.yml


查看pod信息
# kubectl get pod -n test


查看pod描述信息
# kubectl describe pod -n test
...

    Limits:
      cpu:     2
      memory:  2G
    Requests:
      cpu:        1
      memory:     10M
      

删除deploy
# kubectl delete -f deploy_nginx.yml

6 Pod 多容器创建方式

案例:将nginx与mysql放在同一个Pod中运行

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       #指定一个本地不存的镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)


        - name: mysql
          image: mysql:5.7     #镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:                 #定义端口
          - containerPort: 3306  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)



创建Pod
# kubectl create -f deploy_nginx.yml


查看Pod信息
# kubectl get pod -n test


查看Pod描述信息
# kubectl describe pod   -n test

#原因分析:MySQL以容器的方式运行需要设置环境变量(root密码)



删除该Pod
# kubectl delete -f deploy_nginx.yml

7 Pod 环境变量

evn属性是用于设置容器环境变量的列表,环境变量的定义要根据容器具体需求定义,本章节只讲解如何定义环境变量

可通过下方命令获取env文档帮助

# kubectl explain pod.spec.containers.env

 name   定义环境变量名称
 value  定义变量值

案例:为上述案例中的MySQL添加环境变量设置root密码

# vim pod-ngx_mysql.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       #指定一个本地不存的镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)


        - name: mysql
          image: mysql:5.7     #镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:                 #定义端口
          - containerPort: 3306  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)
          env:                             定义环境变量
          - name: "MYSQL_ROOT_PASSWORD"    变量名称(必须为数组类型)
            value: "123456"                #值




创建Pod
# kubectl create -f deploy_nginx.yml



查看Pod信息
# kubectl get pod -n test



查看Pod详细描述
# kubectl describe pod  -n test

7 Pod 环境变量

evn属性是用于设置容器环境变量的列表,环境变量的定义要根据容器具体需求定义,本章节只讲解如何定义环境变量

可通过下方命令获取env文档帮助
​
# kubectl explain pod.spec.containers.env
​
 name   定义环境变量名称
 value  定义变量值
​


案例:为上述案例中的MySQL添加环境变量设置root密码

# vim pod-ngx_mysql.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.20.0       #指定一个本地不存的镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)
​
​
        - name: mysql
          image: mysql:5.7     #镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:                 #定义端口
          - containerPort: 3306  #端口
            protocol: TCP      #端口协议
          resources:           #定义资源限额
            limits:            #资源最大限额
              cpu: 2           #cpu核数最大限制(可以为整数或小数)
              memory: 2G       #内存最大限制(单位可以使用Gi、Mi、G、M等形式)
            requests:          #资源最低限额
              cpu: 1           #所需最低cpu核数
              memory: 10M      #所需最低内存资源(如果不足10M,容器无法启动)
          env:                             定义环境变量
          - name: "MYSQL_ROOT_PASSWORD"    变量名称(必须为数组类型)
            value: "123456"                #值
​
​
​
​
创建Pod
# kubectl create -f deploy_nginx.yml
​
​
​
查看Pod信息
# kubectl get pod -n test
​
​
​
查看Pod详细描述
# kubectl describe pod  -n test
​


8 Pod 容器进入方式

格式:kubectl exec -n 命名空间 -it pod名称 -c 容器名称 -- /bin/bash

kubectl exec -h #命令帮助

案例:进入上述案例中创建的mysql容器

# kubectl exec -n test -it deploy-nginx-579696c576-jfqz6 -c mysql -- /bin/bash
​
进入数据库
root@deploy-nginx-579696c576-jfqz6:/# mysql -uroot -p123456
​


案例:进入上述案例中创建的nginx容器

# kubectl exec -n test -it deploy-nginx-579696c576-jfqz6 -c nginx -- /bin/bash
​
​
查看网页根目录
root@deploy-nginx-579696c576-jfqz6:/# ls /usr/share/nginx/
​


9 Pod 容器执行命令方式

格式为: kubectl exec pod名 -c 容器名 -- 命令

注意:

  • -c 容器名为可选项,如果是1个pod中1个容器,则不用指定;

  • 如果是1个pod中多个容器,不指定默认为第1个。

# kubectl exec -n test deploy-nginx-579696c576-jfqz6 -c nginx -- ls /usr/share/nginx/html
​
# kubectl exec -n test deploy-nginx-579696c576-jfqz6 -c mysql -- ls /var/lib/mysql
​

删除deploy

# kubectl delete -f deploy_nginx.yml
​


10 Pod 调度概述

在默认情况下,一个Pod被调度到哪个Node节点运行是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的,但是在实际工作中,我们想要控制某些Pod调度到指定的Node节点,就需要用到Pod调度

K8S提供了四种调度方式:

  • 自动调度:Pod运行在哪个Node节点上,完全由Scheduler经过算法分配(默认的调度策略)

  • 定向调度:NodeName、NodeSelector

  • 亲和性调度与反亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity

  • 污点(容忍)调度:Taints、Toleration

11 Pod 定向调度 NodeName

定向调度是通过在Pod上声明NodeName或者NodeSelector,以此将Pod调度到指定的节点上,但是定向调度属于强制调度,即使指定的Node节点不存在,也会向该节点进行调度,只不过Pod运行失败而已

定向调度方式其实是直接跳过了Schedule的调度逻辑,直接将Pod调度到指定名称的节点

案例:创建pod,并通过NodeName将Pod调度到worker01节点

# vim pod-nodename.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        nodeName: worker01   定义调度策略,并指定worker01节点
        containers:
        - name: nginx
          image: nginx:1.20.0       #指定一个本地不存的镜像版本
          imagePullPolicy: IfNotPresent    #设置镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议


    
创建pod
# kubectl create -f deploy_nginx.yml


查看pod详细信息
# kubectl get pod -n test -o wide


删除deploy

11 Pod 定向调度 NodeSelector

NodeSelector用于将Pod调度添加了指定标签的node节点上,该调度规则也是强制调度

案例:先为worker02节点打标签,然后创建一个pod,并通过nodeSelector进行调度

为node1与node2节点打标签
# kubectl label node worker02 node=worker02


查看节点标签
# kubectl get node worker02 --show-labels


创建Pod并通过NodeSelector进行调度
# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        nodeSelector:          定义nodeSelector
          node: worker02       指定节点标签
        containers:
        - name: nginx
          image: nginx:1.20.0       #指定一个本地不存的镜像版本
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议



创建pod
# kubectl create -f deploy_nginx.yml


查看pod详细信息
# kubectl get pod -n test
# kubectl get pod -n test -o wide


删除deploy
# kubectl delete -f deploy_nginx.yml

12 Pod 污点 Taints概述

前面的调度方式都是站在Pod的角度上,通过在Pod上添加属性,来确定Pod是否要调度到指定的node上,其实我们也可以站在node的角度上,通过在node上添加污点属性,来决定是否允许Pod调度过来

node被设置上污点以后,就和Pod之间存在了一种相互排斥的关系,进而拒绝Pod调度进来,甚至可以将已经存在的Pod驱逐出去。

污点的格式:key=value:污点,key和value是污点的标签,目前支持如下三个污点:

  • PreferNoSchedule:尽量避免调度(软限制),除非没有其他节点可调度

  • NoSchedule:拒绝调度(硬限制),但不会影响当前已经存在的Pod

  • NoExecute:拒绝调度,同时也会将节点上已经存在的

提示:如果通过定向调度的方式去创建Pod,那么定向调度的优先级要高于污点。

使用kubectl设置和去除污点的命令实例如下:

设置污点
kubectl taint nodes worker01 key:污点

去除污点
kubectl taint nodes worker01 key:污点-

去除所有污点
kubectl taint nodes worker01 key-

13 Pod 污点之 PreferNoSchedule

实验准备:

1)为了演示污点的效果更加明显,暂时停止worker02节点,将worker02节点关机即可,关机后验证节点状态。

# kubectl get nodes
...
worker02   NotReady  
​


2)将前边案例配置文件中定向调度删除后在进行创建,否则看不到效果。

# vim deploy_nginx.yml

3)为worker01设置污点,名称为:worker01:PreferNoSchedule

[root@master01 ~]# kubectl taint node worker01 worker01:PreferNoSchedule


查看污点信息
[root@master01 ~]#  kubectl describe node worker01 | grep Taints

Taints:     worker01:PreferNoSchedule



创建Pod验证
[root@master01 ~]# kubectl create -f deploy_nginx.yml


查看Pod所在节点健康状态
[root@master01 ~]# kubectl get pod -n test -o wide


删除deploy
[root@master01 ~]# kubectl delete -f deploy_nginx.yml


删除PreferNoSchedule污点
[root@master01 ~]# kubectl taint node worker01 worker01:PreferNoSchedule-

14 Pod 污点之 NoSchedule

设置worker01污点为:worker01:NoSchedule

[root@master01 ~]# kubectl taint node worker01 worker01:NoSchedule


查看污点信息
[root@master01 ~]# kubectl describe node worker01 | grep Taints
Taints:             worker01:NoSchedule



创建Pod
[root@master01 ~]# kubectl create -f deploy_nginx.yml



查看Pod所在节点健康状态
[root@master01 ~]# kubectl get pod -n test -o wide
#提示:可以发现当前的pod状态为Pending(挂起状态)



删除deploy
[root@master01 ~]# kubectl delete -f deploy_nginx.yml

提示:使用kubeadm搭建的集群,默认就会给master节点添加一个污点,所以pod不会被调度到master节点。

#  kubectl describe node master01 | grep Taints
Taints:   node-role.kubernetes.io/master:NoSchedule
​
#  kubectl describe node master02 | grep Taints
Taints:   node-role.kubernetes.io/master:NoSchedule
​
#  kubectl describe node master03 | grep Taints
Taints:   node.kubernetes.io/unreachable:NoExecute
​

15 Pod 调度容忍 Toleration

上一小结介绍了污点的作用。可以通过在worker节点添加污点用于拒绝Pod调度上来,但如果我们非要将一个Pod调度到一个有污点的node上,通过容忍(忽略)可以实现

容忍的配置项说明:

可通过下边命令查看容器的配置项
# kubectl explain pod.spec.tolerations
effect				容忍的污点
key					容忍的污点的key

案例:继上述案例,创建pod并添加容忍,然后将pod调度到worker01节点

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test

spec:
    replicas: 1
    selector:                   #标签选择器(基于选择器匹配Pod)
      matchLabels:              #标签类型
        app: deploy-nginx       #匹配pod的标签(表示deploy管理带有此标签的Pod)

    template:                   #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx     #pod的标签

      spec:
        tolerations:            添加容忍
        - key: "worker01"       污点的key(必须引起来)
          effect: NoSchedule    污点类型
        containers:
        - name: nginx
          image: nginx:1.17.0   #指定镜像
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:                #定义端口
          - containerPort: 80   #端口
            protocol: TCP       #端口协议



创建pod
# kubectl create -f deploy_nginx.yml



查看pod详细信息
# kubectl describe pod -n test


删除deploy并删除yaml文件中的容忍配置项
# kubectl delete -f deploy_nginx.yml


删除污点
# kubectl taint node worker01 worker01:NoSchedule-

Pod或者ns出现异常,可以尝试通过下边的方式进行删除

# kubectl delete pod pod名称 -n ns名称 --force --grace-period=0

16 Pod 容器探测介绍

容器探测类似于对容器进行健康检查,用来探测容器中的程序是否可以正常工作,如果探测到容器出现故障,k8s会尝试重启容器,如果重启失败,k8s不会将流量分配给该容器,不承担业务流量。

k8s提供了两种探针来实现容器的探测,可通过下边命令查看:

# kubectl explain pod.spec.containers  

livenessProbe	存活性探针,用于检测容器当前是否处于正常运行状态,如果不是,容器将会被重启。

readinessProbe	就绪性探针,用于检测容器当前是否可以接收请求,如果不能,k8s不会转发流量。

以上两种探针目前均支持多种探测方式,可通过下边命令查看:

# kubectl explain pod.spec.containers.livenessProbe
# kubectl explain pod.spec.containers.readinessProbe
FIELDS:
exec					命令探测方式
tcpSocket				端口探测方式
httpGet					URL请求探测方式
initialDelaySeconds		容器启动后等待多少秒执行第一次探测
timeoutSeconds			探测超时时间,默认1秒,最小可设置1秒
failureThreshold		连续探测失败多少次才被认定失败,默认3次为失败,最小可设置1
periodSeconds			执行探测频率,默认是10秒,最小可设置1秒
successThreshold		连续探测成功多少次才被认定为成功,默认1次

17 Pod 容器探测 exec

方式一:exec命令探测方式,在容器内执行一次命令,如果命令执行的退出码为0,则认位程序正常,否则不正常。

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.0       #镜像版本
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          livenessProbe:       存活性探针
            exec:              命令探测方式
              command: [/bin/ls,/etc/hello.txt]  探测一个不存在的文件
​
​
               
创建Pod
# kubectl create -f deploy_nginx.yml
​
​
查看Pod信息
# kubectl get pod -n test
​
​
查看Pod详细信息
# kubectl describe pod -n test
​
​
删除deploy
# kubectl delete -f deploy_nginx.yml
​
​
​
探测一个存在的文件
# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.0       #镜像版本
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          livenessProbe:       存活性探针
            exec:              命令探测方式
              command: [/bin/ls,/usr/share/nginx/html/index.html]  探测一个存在的文件
​
​
​
创建Pod
# kubectl create -f deploy_nginx.yml
​
​
查看Pod详细信息
# kubectl describe pod -n test
​
​
删除Deploy
# kubectl delete -f deploy_nginx.yml
​

18 Pod 容器探测 tcpSocket

方式二:tcpSocket端口探测方式,访问容器的端口,如果能够建立连接,则认位程序正常,否则不正常。

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.0       #镜像版本
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          livenessProbe:       存活性探针
            tcpSocket:         端口探测方式
              port: 8080       探测一个不存在的端口
​
提示:删除前边的探测方式,探测方式不能指定超过2种类型
​
​
​
创建pod
# kubectl create -f deploy_nginx.yml
​
​
查看pod描述信息
# kubectl describe pod -n test
...
Liveness probe failed: dial tcp 10.244.1.10:8080: connect: connection refused
#提示:活性探针失败,8080拒绝连接
​
​
删除deploy
# kubectl delete -f deploy_nginx.yml
​
​
探测一个存在的端口
# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 1
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.0       #镜像版本
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
          livenessProbe:       存活性探针
            tcpSocket:         端口探测方式
              port: 80         探测一个存在的端口
​
​
​
创建pod
# kubectl create -f deploy_nginx.yml
​
​
​
查看pod详细信息
# kubectl describe -f deploy_nginx.yml
​
​
删除deploy
# kubectl delete -f deploy_nginx.yml
​

19 Pod 容器重启策略

容器一旦出现了问题,K8s就会对容器所在的pod进行重启,重启操作是由pod的重启策略决定的,pod的重启策略有三种,可通过下边命令查看

[root@master ~]# kubectl explain pod.spec.restartPolicy
​

Always:容器失效时,自动重启该容器,默认策略

OnFailure:容器终止运行且退出码不为0时重启(异常终止)

Never:无论容器状态如何,都不重启该容器

重启策略适用于pod中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作延时时长为10s、20s、40s、80s、160s、300s,最长延时为300s,以后重启延时均为300s,直至重启成功

20 Deploy Pod数量扩缩容

案例:通过Deploy对pod数量进行扩缩容

创建Pod
# kubectl create -f deploy_nginx.yml
# kubectl get pod -n test
​
​
通过edit(修改配置文件)方式扩容pod数量
# kubectl get deploy -n test
# kubectl edit deploy deploy-nginx -n test
...
  replicas: 2    #修改pod数量
​
​
查看pod信息
# kubectl get pod -n test
​
​
删除deploy
# kubectl delete -f deploy_nginx.yml
​

21 Deploy Pod版本更新策略

Deploy支持两种镜像更新的策略:通过strategy属性进行配置

kubectl explain deploy.spec.strategy

  • Recreate:重建更新策略,一次性将所有旧版本pod全部重建成新版本pod

  • RollingUpdat:滚动更新策略(默认策略),先删除一部分旧版本pod,在更新成新版本pod

下面是对strategy属性的详细描述
​
strategy:          #指定新的pod替换旧的pod策略,支持两个属性
  type:            #指定策略类型,支持两种策略
    Recreate:      #在创建出新pod之前会先删掉所有已经存在的pod
    RollingUpdat:  #滚动更新,先删除一部分,就启动一部分pod,在更新过程中,存在两个版本pod
  rollingUpdate:   #当type为RollingUpdat时生效,用于为RollingUpdat设置参数,支持两个属性
    maxUnavailable:  #用来指定在升级过程中最多可删除的pod数量,默认为25%
    maxSurge:        #用来指定在升级过程中最多可新建的pod数量,默认为25%
​

22 Pod版本更新 Recreate

案例:通过Recreate对Pod进行重建更新

修改deploy_nginx.yml文件设置Pod更新策略
​
# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    strategy:           Pod更新策略
      type: Recreate    重建更新
    replicas: 3         指定Pod数量
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.0       
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
​
​
​
创建pod
# kubectl create -f deploy_nginx.yml
​
​
另外开一个终端动态观察pod的信息
# kubectl get pod -n test -w
​
​
更新镜像版本
# kubectl edit deploy deploy-nginx -n test
...
    spec:
      containers:
      - image: nginx:1.18.1    指定新版本
​
​
提示:观察pod的重建过程
#第一步:将Running的pod先终止(Terminating)
​
#第二步:接下来Pod处于等待状态(Pending)
​
#第三步:重新创建容器(ContainerCreating)
​
#第四步:新的容器被创建且以成功运行(Running )
​
​
查看镜像版本
# kubectl get deploy -n test -o wide
​
​
删除depoly
# kubectl delete -f deploy_nginx.yml
​

23 Pod版本更新 RollingUpdate

案例:通过RollingUpdat对Pod进行滚动更新(默认策略,无需指定,只需要将前边配置文件中的其他更新策略删除即可)

# vim deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
    name: deploy-nginx
    namespace: test
spec:
    replicas: 6 
    selector:         #标签选择器(基于选择器匹配Pod)
      matchLabels:    #标签类型
        app: deploy-nginx    #匹配pod的标签(表示deploy管理带有此标签的Pod)
    template:         #pod的配置模板
      metadata:
        labels:
          app: deploy-nginx   #pod的标签
      spec:
        containers:
        - name: nginx
          image: nginx:1.18.1
          imagePullPolicy: IfNotPresent    #镜像拉取策略
          ports:               #定义端口
          - containerPort: 80  #端口
            protocol: TCP      #端口协议
​
​
​
创建pod(--record 记录整个deploy更新历史)
# kubectl create -f deploy_nginx.yml --record
​
​
​
​
另外一个终端动态查看pod信息
# kubectl get pod -n test -w
​
​
​
更新镜像版本
# kubectl edit deploy deploy-nginx -n test
    spec:
      containers:
      - image: nginx:1.20.0
​
​
​
​
查看RS信息
# kubectl get rs -n test -o wide
​
提示:当pod滚动更新后,rs也会随之跟着更新,原有rs中的pod会被删除,但是原有的rs并不会删除,用于做版本回退
​
​
显示当前升级版本的状态
# kubectl rollout status deploy deploy-nginx -n test
​

24 Deploy Pod版本回退

Deploy支持版本升级过程中的暂停、继续、回退等功能,具体功能如下:

kubectl rollout 版本升级相关功能,支持下面的选项:

  • status #显示当前升级状态

  • history #显示升级历史记录

  • pause #暂停版本升级过程

  • resume #继续已经暂停的版本升级过程

  • restart #重启版本升级过程

  • undo #回滚到上一级版本(可以通过--to-revision回滚到指定版本)

案例:多次更新镜像版本,随后对镜像版本进行回退

更新镜像版本
# kubectl edit deploy deploy-nginx -n test
    spec:
      containers:
      - image: nginx:1.20.1



更新镜像版本
# kubectl edit deploy deploy-nginx -n test
    spec:
      containers:
      - image: nginx:1.21.0




查看升级历史记录
# kubectl rollout history deploy deploy-nginx -n test



查看具体版本详细信息:--revision=版本编号
# kubectl rollout history deploy deploy-nginx --revision=2 -n test



查看当前所有版本(通过rs可以查看)
# kubectl get rs -o wide -n test



查看当前使用版本(查看deploy)
# kubectl get deploy -o wide -n test



版本回退:通过--to-revision=1,可直接回滚到1版本,如果省略这个选项,就是回退到上个版本
# kubectl rollout undo deploy deploy-nginx --to-revision=2 -n test




查看当前使用的版本
# kubectl get deploy -o wide -n test




查看升级历史记录
# kubectl rollout history deploy deploy-nginx -n test

提示:新版本就是原先的1版本

0
K8S
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区