k8s之三、pod 生命周期/ 探针/ 调度策略/ 副本ReplicaSet / 控制器Deployment
k8s在主容器的启动之后和停止之前提供了两个钩子函数,进行容器启动后 和 容器停止后的相关操作。容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则随机分配到其他节点中。容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则创建失败。创建当前pod容器前 先创建 依赖的其他 containers 容器。容器创建除了不会分配到以下指定的 pod,随机分发到其他 pod 中。相当
pod 生命周期官方文档
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/
一、容器初始化
创建当前pod容器前 先创建 依赖的其他 containers 容器
## 创建容器 (需等待初始化操作完成在创建容器)
containers:
- name: mayikt-main-container
image: nginx:1.17.9
ports:
- name: nginx-port
containerPort: 80
## 初始化操作 (睡眠40秒),实际可修改为等待指定服务启动成功
initContainers:
- name: mayikt-mysql
image: busybox:1.30
command: [ "/bin/sh","-c","sleep 40;"]
二、钩子函数
k8s在主容器的启动之后和停止之前提供了两个钩子函数,进行容器启动后 和 容器停止后的相关操作
- 1.post-start: 容器创建之后执行 (相关命令),如果失败了则会自动重启容器, 容器创建后立即执行,注意由于是异步执行,它无法保证一定在 ENTRYPOINT 之前运行。如果失败,容器会被杀死,并根据 RestartPolicy 决定是 否重启
- 2.pre-stop : 容器终止之前执行 (相关命令) 例如 杀死进程等 容器终止前执行,常用于资源清理。执行完成之后容器将成功终止,如果失败,容器同样也会被杀死。在其完成之前 会阻塞删除容器的操作
钩子的回调函数支持三种方式
2.1、Exec命令 模式
执行 linux 命令
spec:
containers:
- name: main-container
image: nginx:1.17.1
lifecycle:
postStart:
exec: # 容器创建之后执行(相关命令)修改nginx 页面
command: ["/bin/sh","-c","echo mayikt > /usr/share/nginx/html/index.html"]
preStop:
exec: # 容器停止之后 执行停止nginx服务
command: [" /usr/sbin/nginx","-s" , "quit" ]
2.2、TCPSocket 模式
对指定端口发起请求检查
lifecycle:
# 容器创建之后执行
postStart:
tcpSocket:
port: 8080
2.3、HTTPGet 模式
发起一个http请求
lifecycle:
postStart:
# 容器创建之后执行
httpGet:
path: /init # URI地址
port: 80 # 端口号
host: 192.168.110.1 # 主机地址
scheme: HTTP # 支持的协议,http或https
# http://192.168.110.1/init
三、容器探针
相当于容器的心跳检测,发现容器挂掉了可以主动进行重启
- livenessProbe 存活探针(可用性探针): 用于检测容器实例当前是否处于正常运行的状态,如果不是为运行状态,k8s则会重启容器;
- readinessProbe 就绪探针(就绪性探针): 就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能接受实例,k8s不会转发到该实例
3.1、Exec命令 模式
spec:
containers:
- name: main-container
image: nginx:1.17.1
livenessProbe: # 存活探针(可用性探针)
exec: # 执行一个pwd
command: ["/bin/pwd" ,"/"]
3.2、TCPSocket 模式
livenessProbe: ## 存活探针(可用性探针)
tcpSocket: ## 底层会尝试访问容器ip:8080
port: 8080
3.3、HTTPGet 模式
livenessProbe:
httpGet: #访问指定的scheme://host:port/path
scheme: HTTP # 支持的协议,http或者https
port: 80 # 端口号
path: /mayikt # URI地址 该地址不存在 会报错404
3.4、探针探测时间和次数指定
livenessProbe:
httpGet: #访问指定的scheme://host:port/path
scheme: HTTP #支持的协议,http或者https
port: 80 #端口号
path: /mayikt #URI地址 该地址不存在 会报错404
initialDelaySecands: 10 # 容器启动后10s开始探测
failureThreshold: 2 # 探测2次认为是失败
3.5、重启策略配置
- 1.Always: 出现问题时 自动重启该容器,默认方式。
- 2.OnFailure : 容器终止运行且退出码不为0时重启
- 3.Never :不论状态为何,都不重启该容器
spec:
containers:
- name: nginx
image: nginx:1.17.9
--------------
restartPolicy: Never # 设置重启策略为Never 无论状态如何 不会重启
四、pod调度策略
4.1、运行到指定 node 节点
spec:
containers:
- name: nginx-container
image: nginx:1.17.9
nodeName: node1 #指定该pod运行在node1 节点
4.2、运行到指定 lable 标签的节点
containers:
- name: nginx
image: nginx:1.17.9
nodeSelector:
nodev: v2 #指定调度到具有node=v2标签 node节点上
4.3、策略和亲和性
策略
- 硬策略: 通过指定的规则,如果没有找到具体运行的Node节点 则会报错
- 软策略: 优先走指定的规则, 如果没有找到具体运行的Node节点 则采用自动随机方式运行在node节点上。
亲和性
- 1.nodeAffinity(node亲和性) : pod根据node标签选择器 决定pod运行在那个node节点上
- 2.podAffinity(pod亲和性): pod根据参照pod标签选择器 解决多个pod运行在同一个node节点上
- 3.podAntiffinity(pod反亲和性): pod根据参照pod标签选择器 解决多个pod不允许在同一个node节点上
operator关系符
- 支持Exists, DoesNotExist, In, NotIn, Gt, Lt
4.3.1、node亲和性 + 硬限制
容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则创建失败
spec:
containers:
- name: nginx
image: nginx:1.17.9
------------------------------------------------------------------------
affinity: # 设置亲和性
nodeAffinity: # 亲和性node 设置
requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
nodeSelectorTerms:
- matchExpressions: # 匹配nodev的值在[v3,v4 ]中的标签 node节点
- key: nodev
operator: In
values: ["v3" , "v4"]
4.3.2、node亲和性 + 软限制
容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则随机分配到其他节点中
------------------------------------------------------------------------
affinity: # 亲和性设置
nodeAffinity: # 设置node亲和性
preferredDuringSchedulingIgnoredDuringExecution: # 软限制
- weight: 1
preference:
matchExpressions: # 匹配当前node节点标签是否有 ["v3" , "v4"]
- key: nodev
operator: In
values: ["v3" , "v4"]
4.3.3、pod 亲和性 + 硬限制
容器直接创建在指定 pod 中
------------------------------------------------------------------------
affinity: #亲和性设置
podAffinity: #设置pod亲和性
requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
- labelSelector:
matchExpressions: # 匹配podinfo的值在 [mayikt-pod03]中的标签
- key: podinfo
operator: In
values: ["pod01"]
topologyKey: kubernetes.io/hostname
4.3.4、pod 反亲和性 + 硬限制
容器创建除了不会分配到以下指定的 pod,随机分发到其他 pod 中
------------------------------------------------------------------------
affinity: #亲和性设置
podAntiAffinity: #设置pod反亲和性
requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
- labelSelector:
matchExpressions: # 匹配podinfo的值在 [mayikt-pod03]中的标签
- key: podinfo
operator: In
values: ["pod01"]
topologyKey: kubernetes.io/hostname
五、副本 ReplicaSet
创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能
5.0、前置相关命令
# 创建命名空间
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
# 查看执行命名空间下pods
kubectl get pods -n mayikt-sit
# 查看指定命名空间下的 pods 详情
kubectl describe pods -n mayikt-sit
# 查看执行命名空间下副本集
kubectl get rs mayikt-rp -n mayikt-sit -o wide
5.1、副本yml配置
yml
apiVersion: apps/v1
kind: ReplicaSet
# 命名空间
metadata:
name: mayikt-rp
namespace: mayikt-sit
spec:
# 创建副本数量
replicas: 3
# 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签)
selector:
matchLabels:
app: nginx-pod
# 副本配置
template:
# 副本中的容器标签
metadata:
labels:
app: nginx-pod
# 副本中的对应容器
spec:
containers:
- name: nginx
image: nginx:1.17.9
命令
# 执行yml文件
kubectl create -f mayikt-pod-controller01.yml
5.2、弹性扩容缩容
执行命令
会进入yml vi编辑模式, 修改 replicas 副本数量,保存后自动进行扩容缩容
kubectl edit rs mayikt-rp -n mayikt-sit
5.3、更新镜像
同扩容缩容操作,编辑副本 image 版本即可
kubectl edit rs mayikt-rp -n mayikt-sit
5.4、删除镜像
k8s删除ReplicaSet前,会将ReplicaSet的replicasclear调整为0,等待所有的Pod被删除后,在执行RS对象的删除。
kubectl delete rs mayikt-rp -n mayikt-sit
六、pod控制器 Deployment
Deployment 是 ReplicaSet 的二次封装,在原基础功能上增加的 滚动更新 和 版本回退
6.0、前置相关命令
# 创建命名空间
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
# 查看指定命名空间下pods
kubectl get pods -n mayikt-sit
kubectl get pods -n mayikt-sit -w
# 查看指定命名空间下的 pods 详情
kubectl describe pods -n mayikt-sit
# 查看执行命名空间下副本集
kubectl get deploy -n mayikt-sit -o wide
# 查看执行命名空间下副本
kubectl get rs -n mayikt-sit
6.1、Deployment yml配置
apiVersion: apps/v1
kind: Deployment
# 命名空间配置
metadata:
name: mayikt-deployment
namespace: mayikt-sit
spec:
# 副本数量
replicas: 3
# 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签)
selector:
matchLabels:
app: nginx-pod
# 副本配置
template:
# 副本中的容器标签
metadata:
labels:
app: nginx-pod
# 副本中的对应容器
spec:
containers:
- name: nginx
image: nginx:1.17.9
命令
# 执行yml文件
kubectl create -f mayikt-pod-controller01.yml
6.2、弹性扩容缩容
直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容
kubectl scale deploy mayikt-deployment --replicas=6 -n mayikt-sit
6.3、更新镜像
直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容
6.3.1、副本策略说明
- Recreate 先杀掉所有已存在的Pod,在创建出新的Pod
- RollingUpdate(滚动更新) 杀死一部分, 就启动一部分 存在两个版本Pod---- 同时支持版本回退
RollingUpdate 下两个属性:
maxUnavailable: 用来指定在升级过程中不可用Pod的最大数量,默认为25%。
maxSurge: 用来指定在升级过程中 可以超过期望的Pod的最大数量,默认为25%。
6.3.2、重建更新配置
yml 中 spec 配置
spec:
strategy: # 策略
type: Recreate # 重建更新
replicas: 3
6.3.3、滚动更新配置
yml 中 spec 配置
spec:
strategy: # 策略
type: RollingUpdate # 滚动更新
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
replicas: 3
6.3.4、更新命令
更新时根据配置策略来决定是 重建更新 还是 滚动更新
kubectl set image deploy mayikt-deployment nginx=nginx:1.17.8 -n mayikt-sit
6.4、版本回退
# 首次执行yml创建时需加上--record 让其支持版本回退
kubectl create -f mayikt-pod-controller04.yml --record
# 查看版本更新状态
kubectl rollout status deploy mayikt-deployment -n mayikt-sit
# 查看历史更新记录
kubectl rollout history deploy mayikt-deployment -n mayikt-sit
# 版本回退 to-revision=1 的1是对应的历史更新记录的版本号
kubectl rollout undo deployment mayikt-deployment --to-revision=1 -n mayikt-sit
# 查看执行命名空间下副本集
kubectl get deploy -n mayikt-sit -o wide
更多推荐
所有评论(0)