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版本
评论区