控制器的作用
• 管理Pod对象
• 使用标签与Pod关联
• 控制器实现了Pod的运维,例如滚动更新、伸缩、副本管理、维护Pod状态等
常用工作负载控制器
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
• Job : 一次性任务
• Cronjob : 定时任务
Deployment
功能
• 管理Pod和ReplicaSet
• 具有上线部署、副本设定、滚动升级、回滚等功能
• 提供声明式更新,例如只更新一个新的Image
使用流程

1636943814660.png
部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web
image: nginx:1.16
----------------------------------------------------------------------
[root@k8smaster control]# kubectl apply -f web.yaml
deployment.apps/web created
[root@k8smaster control]# kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
service/web exposed
[root@k8smaster control]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.105.130.47 <none> 80:31249/TCP 78s
[root@k8smaster control]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.153.21:6443 15d
web 10.244.249.50:80,10.244.249.53:80,10.244.249.62:80 2m5s
滚动升级
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web
image: nginx:1.17
----------------------------------------------------------------------
[root@k8smaster control]# kubectl describe deployment web
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 12m deployment-controller Scaled up replica set web-84b7cd6c7c to 3
Normal ScalingReplicaSet 3m11s deployment-controller Scaled up replica set web-6fbb9b87dd to 1
Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set web-84b7cd6c7c to 2
Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set web-6fbb9b87dd to 2
Normal ScalingReplicaSet 21s deployment-controller Scaled down replica set web-84b7cd6c7c to 1
Normal ScalingReplicaSet 21s deployment-controller Scaled up replica set web-6fbb9b87dd to 3
Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set web-84b7cd6c7c to 0

1636945487783.png
001 K8s对Pod升级的默认策略
002 通过使用新版本Pod逐步更新旧版本Pod
003 实现零停机发布,用户无感知
滚动更新策略:
spec:
replicas: 3
revisionHistoryLimit: 10 # RS历史版本保存数量
selector:
matchLabels:
app: web
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
maxSurge:滚动更新过程中最大Pod副本数,确保在更新时启动的Pod数量比期望(replicas)Pod数量最大多出25%
maxUnavailable:滚动更新过程中最大不可用Pod副本数,确保在更新时最大25% Pod数量不可用,即确保75% Pod数量是可用状态
水平扩缩容
001 修改yaml里replicas值,再apply
002 kubectl scale deployment web --replicas=5
-------------------------------------------------------------------------------
[root@k8smaster control]# kubectl scale deployment web --replicas=5
deployment.apps/web scaled
[root@k8smaster control]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-6fbb9b87dd-4dmfn 1/1 Running 0 7s
web-6fbb9b87dd-gf2dw 1/1 Running 0 14m
web-6fbb9b87dd-kswvb 1/1 Running 0 11m
web-6fbb9b87dd-pv4hc 1/1 Running 0 7s
web-6fbb9b87dd-smzgn 1/1 Running 0 11m
[root@k8smaster control]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 192.168.153.21:6443 15d
web 10.244.249.49:80,10.244.249.54:80,10.244.249.6:80 + 2 more... 22m
ReplicaSet
001 Pod副本数量管理,不断对比当前Pod数量与期望Pod数量
002 Deployment每次发布都会创建一个RS作为记录,用于实现回滚
003 kubectl get rs -o wide #查看RS记录
004 kubectl describe rs web-6fbb9b87dd 找出相应的镜像版本和升级版本
004 kubectl rollout history deployment web #版本对应RS记录
[root@k8smaster control]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
web-6fbb9b87dd 5 5 5 18m web nginx:1.16 app=nginx,pod-template-hash=6fbb9b87dd
web-84b7cd6c7c 0 0 0 27m web nginx:1.15 app=nginx,pod-template-hash=84b7cd6c7c
[root@k8smaster control]# kubectl describe rs web-6fbb9b87dd
deployment.kubernetes.io/revision: 2
Containers:
web:
Image: nginx:1.16
回滚
001 kubectl rollout history deployment/web # 查看历史发布版本
002 kubectl rollout undo deployment/web # 回滚上一个版本
003 kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
[root@k8smaster control]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
[root@k8s-master control]# kubectl rollout undo deployment web --to-revision=1
deployment.apps/web rolled back
[root@k8s-master control]# kubectl rollout undo deployment web
deployment.apps/web rolled back
删除
001 kubectl delete deploy/web
002 kubectl delete svc/web
[root@k8smaster control]# kubectl delete deploy web
deployment.apps "web" deleted
[root@k8smaster control]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d
web NodePort 10.105.130.47 <none> 80:31249/TCP 37m
[root@k8smaster control]# kubectl delete svc web
service "web" deleted
DaemonSet
功能
001 在每一个Node上运行一个Pod
002 新加入的Node也同样会自动运行一个Pod
应用场景
001 网络插件(kube-proxy、calico)、其他Agent
示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
spec:
selector:
matchLabels:
name: filebeat
template:
metadata:
labels:
name: filebeat
spec:
tolerations:
- effect: NoSchedule
operator: Exists
containers:
- name: log
image: elastic/filebeat:7.3.2
-----------------------------------------------------------------------------
001 配置污点容忍是可以分配到master节点上
[root@k8smaster DaemonSet]# kubectl apply -f filebeat.yaml
daemonset.apps/filebeat created
查看
[root@k8smaster DaemonSet]# kubectl get pod -n kube-system -o wide |grep filebeat
filebeat-4rl4r Running 10.244.249.4 k8snode1
filebeat-ppxxp Running 10.244.16.145 k8smaster
#查看daemonset
[root@k8smaster DaemonSet]# kubectl get daemonset -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR
filebeat 2 2 2 2 2
#删除 daemonset
[root@k8smaster DaemonSet]# kubectl delete daemonset filebeat -n kube-system
daemonset.apps "filebeat" deleted
Job
功能
001 一次性执行
002 应用场景:离线数据处理,视频解码等业务
示例
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
-----------------------------------------------------------------------------------
001 因为是一次性执行,无论成功还是失败,都不执行第二个,所以【restartPolicy: Never】
002 只执行一次,执行完状态是Completed
[root@k8smaster job]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pi-267pf 0/1 Completed 0 6m34s
[root@k8smaster job]# kubectl get job
NAME COMPLETIONS DURATION AGE
pi 1/1 4m57s 7m24s
[root@k8smaster job]# kubectl logs pi-267pf
3.1415926535897932384626433832795028841971693993751...
[root@k8smaster job]# kubectl delete job pi
job.batch "pi" deleted
CronJob
功能
001 用于实现定时任务
002 应用场景:通知,备份
示例
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello aliang
restartPolicy: OnFailure
---------------------------------------------------------------------------
[root@k8smaster CronJob]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 42s 74s
#每一分钟生成一个pod
[root@k8smaster CronJob]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-1636964640-nnfrr 0/1 Completed 0 2m17s
hello-1636964700-pbwkw 0/1 Completed 0 76s
hello-1636964760-klb6s 0/1 ContainerCreating 0 16s
#查看日志
[root@k8smaster CronJob]# kubectl logs hello-1636964760-klb6s
Mon Nov 15 08:26:21 UTC 2021
Hello aliang
#删除cronjob
[root@k8smaster CronJob]# kubectl delete cronjob hello
cronjob.batch "hello" deleted
网友评论