控制器Controller Manager
控制器确保pod资源符合预期的状态,pod资源出现故障时,尝试进行重启,当重启策略无效时,会重建pod。
1、分类
ReplicaSet
代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并支持滚动式自动扩容和缩容功能。
查看代码
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: # rs名称
namespace: dev
labels: # rs的标签
controller: rs
spec:
replicas: 4 # 副本数
selector:
matchLabels: # 指定管理哪些pod Labels匹配规则
app: nginx-pod
# matchExpression: # Expression匹配规则
- {key: app, operator: In, value: [nginx-pod]}
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx1
image: nginx:1.17.1
ports:
- containerPort: 80
Deployment
工作在rs之上,用于管理无状态应用,支持滚动更新和回滚功能,提供声明式配置。
DaemonSet
用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务,如ELK服务。
Job
只要完成任务就退出,不需要重启或重建。
CronJob
周期性任务控制,不需要持续后台运行。
StatefulSet
管理有状态应用。
2、Deployment
- 支持rs的所有功能
- 支持发布的停止和继续
- 支持版本的回退和滚动升级
kubectl scale deploy myblog --replicas=2 # 新增副本
kubectl edit rs rsName # 编辑rs
完整案例
查看代码
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: test
spec:
replicas: 1 # 指定pod副本
selector: # 指定pod选择器
matchLabels:
app: mysql
template:
metadata:
labels: # 给pod打标签
app: mysql
spec:
hostNetwork: true
volumes:
- name: mysql-data
hostPath: /opt/mysql/data
nodeSelector:
component: mysql
containers:
- name: mysql
image: mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: myblog
key: MYSQL_USER
- name: MYSQL_ROOT_PASSWD
valueFrom:
secretKeyRef:
name: myblog
key: MYSQL_PASSWD
- name: MYSQL_DATABASE
value: 'myblog'
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 3306
initialDealySeconds: 15
periodSeconds: 20
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
查看代码
apiVersion: apps/v1
kind: Deployment
metadata:
name: rs-test
namespace: dev
labels:
controller: deploy
spec:
replicas: 3
revisionHistorylimit: 3 # 保留历史版本,默认10
paused: false # 暂停部署
progressDeadlineSeconds: 600
strategy: # 策略
type: RollingUpdate # 滚动更新策略
rollingUpdate:
maxSurge: 30% # 最大额度可存在的副本数,也可整数
maxUnavailable: 30% # 最大不可用状态的pod的最大值,同上
selector:
matchLabels:
app: nginx-pod
# matchExpressions:
# - {key: app, operator: In, values: [nginx-pod]}
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
3、pod驱逐
node资源不足的时候,把pod驱逐至其他节点。
1、kube-controller-manager:周期性检查节点状态,当节点处于NotReady状态超过一段时间,驱逐该节点上的所有pod。
pod-eviction-timeout:NotReady状态节点超过该时间,执行驱逐,默认5min,适用于k8s 1.13版本之前。
1.13版本之后,集群开启TainBasedEvictions和TaintNodesByCondition功能,即taint-based-evictions,即节点若失联或者其他异常,k8s自动为node打上污点,同时为pod添加下面配置:
toleration:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300 #pod独立设置驱逐容忍时间
2、kubelet,周期性检查本节点资源,资源不足,按照优先级驱逐部分pod。
4、服务更新
更新方法
- kubectl apply -f xxx.yaml # 修改yaml
- kubectl edit deploy myblog # 在线更新
- kubectl set image deploy myblog myblog(containerName)=172.17.1.1:5000/myblog:v2 --record
5、更新策略
滚动更新:先增后减。
过程:先创建rs1,rs1新增pod+1,旧版本rs0删除pod-1,rs1新增pod+1,rs0删除pod-1,最后pod都在rs1上,保留rs0。
spec:
replicas: 2 # 指定副本数
selector:
matchLabels:
app: myblog
stragegy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate # 指定更新方式,默认滚动更新
- maxSurge
最大激增数(最大存活数),更新过程中,最多可以比replicas预先设定值多出的pod数量,可设置固定值或者百分比,默认25%,向上取整,3.4取4。
- maxUnavailable
更新过程中,最多有几个pod处于无法服务的状态,可以固定值或百分比,默认25%,向下取整,3.6取3。
6、服务回滚
revision:更新应用时,k8s会记录当前版本号,即revision,若升级出现问题,可会滚到某个特定的revision,默认配置下k8s只会保留10个revision。
和镜像挂钩,记录操作rs的历史。
kubectl rollout history deploy myblog # 查看历史
kubectl create -f xxx.yaml --record
kubectl set image deploy myblog myblog=127.0.0.1:5000/myblog:v2 --record=true
标签:name,rs,myblog,Deployment,nginx,mysql,pod,k8s
From: https://www.cnblogs.com/20190707wdd/p/16876811.html