kubernetes核心概念 Controller
一、pod控制器controller
1.1 Controller作用及分類
controller用于控制pod
參考: https://kubernetes.io/zh/docs/concepts/workloads/controllers/
控制器主要分為:
- Deployments 部署無(wú)狀態(tài)應(yīng)用,控制pod升級(jí),回退
- ReplicaSet 副本集,控制pod擴(kuò)容,裁減
- ReplicationController(相當(dāng)于ReplicaSet的老版本,現(xiàn)在建議使用Deployments加ReplicaSet替代RC)
- StatefulSets 部署有狀態(tài)應(yīng)用,結(jié)合Service、存儲(chǔ)等實(shí)現(xiàn)對(duì)有狀態(tài)應(yīng)用部署
- DaemonSet 守護(hù)進(jìn)程集,運(yùn)行在所有集群節(jié)點(diǎn)(包括master), 比如使用filebeat,node_exporter
- Jobs 一次性
- Cronjob 周期性
1.2 Deployment
1.2.1 Replicaset控制器的功能
- 支持新的基于集合的selector(以前的rc里沒(méi)有這種功能)
- 通過(guò)改變Pod副本數(shù)量實(shí)現(xiàn)Pod的擴(kuò)容和縮容
1.2.2 Deployment控制器的功能
- Deployment集成了上線部署、滾動(dòng)升級(jí)、創(chuàng)建副本、回滾等功能
- Deployment里包含并使用了ReplicaSet
1.2.3 Deployment用于部署無(wú)狀態(tài)應(yīng)用
無(wú)狀態(tài)應(yīng)用的特點(diǎn):
- 所有pod無(wú)差別
- 所有pod中容器運(yùn)行同一個(gè)image
- 所有pod可以運(yùn)行在集群中任意node上
- 所有pod無(wú)啟動(dòng)順序先后之分
- 隨意pod數(shù)量擴(kuò)容或縮容
- 例如簡(jiǎn)單運(yùn)行一個(gè)靜態(tài)web程序
1.2.4 創(chuàng)建deployment類型應(yīng)用
1, 準(zhǔn)備YAML文件
[root@k8s-master1 ~]# vim deployment-nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx # deployment名
spec:
replicas: 1 # 副本集,deployment里使用了replicaset
selector:
matchLabels:
app: nginx # 匹配的pod標(biāo)簽,表示deployment和rs控制器控制帶有此標(biāo)簽的pod
template: # 代表pod的配置模板
metadata:
labels:
app: nginx # pod的標(biāo)簽
spec:
containers: # 以下為pod里的容器定義
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
2, 應(yīng)用YAML文件創(chuàng)建deployment
[root@k8s-master1 ~]# kubectl apply -f deployment-nginx.yml
deployment.apps/deploy-nginx created
3, 查看驗(yàn)證
[root@k8s-master1 ~]# kubectl get deployment # deployment可簡(jiǎn)寫成depoly
NAME READY UP-TO-DATE AVAILABLE AGE
deploy-nginx 1/1 1 1 19s
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-6c9764bb69-pbc2h 1/1 Running 0 75s
[root@k8s-master1 ~]# kubectl get replicasets # replicasets可簡(jiǎn)寫成rs
NAME DESIRED CURRENT READY AGE
deploy-nginx-6c9764bb69 1 1 1 2m6s
1.2.5 訪問(wèn)deployment
1,查看pod的IP地址
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-6d9d558bb6-88nr8 1/1 Running 0 39s 10.244.159.155 k8s-master1 <none> <none>
pod在k8s-master1節(jié)點(diǎn),pod的IP為10.244.159.155
2, 查看所有集群節(jié)點(diǎn)的網(wǎng)卡
[root@k8s-master1 ~]# ifconfig tunl0 |head -2
tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480
inet 10.244.159.128 netmask 255.255.255.255
[root@k8s-master2 ~]# ifconfig tunl0 |head -2
tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480
inet 10.244.224.0 netmask 255.255.255.255
[root@k8s-master3 ~]# ifconfig tunl0 |head -2
tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480
inet 10.244.135.192 netmask 255.255.255.255
[root@k8s-worker1 ~]# ifconfig tunl0 |head -2
tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480
inet 10.244.194.64 netmask 255.255.255.255
- 可以看到所有集群節(jié)點(diǎn)的IP都為
10.244.0.0/16
這個(gè)大網(wǎng)段內(nèi)的子網(wǎng)
3, 在任意集群節(jié)點(diǎn)上都可以訪問(wèn)此deploy里pod
# curl 10.244.159.155
結(jié)果是任意集群節(jié)點(diǎn)都可以訪問(wèn)這個(gè)POD,但集群外部是不能訪問(wèn)的
1.2.6 刪除deployment中的pod
1, 刪除pod(注意: 是刪除deployment中的pod)
[root@k8s-master1 ~]# kubectl delete pod deploy-nginx-6c9764bb69-pbc2h
pod "deploy-nginx-6c9764bb69-pbc2h" deleted
2, 再次查看,發(fā)現(xiàn)又重新啟動(dòng)了一個(gè)pod(節(jié)點(diǎn)由k8s-master1轉(zhuǎn)為k8s-worker1 了,IP地址也變化了)
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-6d9d558bb6-f2t6r 1/1 Running 0 28s 10.244.194.94 k8s-worker1 <none> <none>
也就是說(shuō)**pod的IP不是固定的,比如把整個(gè)集群關(guān)閉再啟動(dòng),pod也會(huì)自動(dòng)啟動(dòng),但是IP地址也會(huì)變化**
既然IP地址不是固定的,所以需要一個(gè)固定的訪問(wèn)endpoint給用戶,那么這種方式就是service.
1.2.7 pod版本升級(jí)
查看幫助
[root@k8s-master1 ~]# kubectl set image -h
1, 升級(jí)前驗(yàn)證nginx版本
[root@k8s-master1 ~]# kubectl describe pods deploy-nginx-6d9d558bb6-f2t6r | grep Image:
Image: nginx:1.15-alpine
[root@k8s-master1 ~]# kubectl exec deploy-nginx-6d9d558bb6-f2t6r -- nginx -v
nginx version: nginx/1.15.12
2, 升級(jí)為1.16版
[root@k8s-master1 ~]# kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record
deployment.apps/deploy-nginx image updated
說(shuō)明:
-
deployment deploy-nginx
代表名為deploy-nginx的deployment -
nginx=nginx:1.16-alpine
前面的nginx為容器名 -
–record 表示會(huì)記錄
容器名怎么查看?
-
kubectl describe pod pod名
查看 -
kubectl edit deployment deployment名
來(lái)查看容器名 -
kubectl get deployment deployment名 -o yaml
來(lái)查看容器名
3, 驗(yàn)證
如果升級(jí)的pod數(shù)量較多,則需要一定時(shí)間,可通過(guò)下面命令查看是否已經(jīng)成功
[root@k8s-master1 ~]# kubectl rollout status deployment deploy-nginx
deployment "deploy-nginx" successfully rolled out
驗(yàn)證 pod
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-5f4749c8c8-nskp9 1/1 Running 0 104s 更新后,后面的id變了
驗(yàn)證版本
[root@k8s-master1 ~]# kubectl describe pod deploy-nginx-5f4749c8c8-nskp9 |grep Image:
Image: nginx:1.16-alpine 升級(jí)為1.16了
[root@k8s-master1 ~]# kubectl exec deploy-nginx-5f4749c8c8-nskp9 -- nginx -v
nginx version: nginx/1.16.1 升級(jí)為1.16了
練習(xí): 再將nginx1升級(jí)為1.17版
[root@k8s-master1 ~]# kubectl set image deployment deploy-nginx nginx=nginx:1.17-alpine --record
deployment.apps/deploy-nginx image updated
1.2.8 pod版本回退
1, 查看版本歷史信息
[root@k8s-master1 ~]# kubectl rollout history deployment deploy-nginx
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
1 <none> 原1.15版
2 kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record=true
3 kubectl set image deployment deploy-nginx nginx=nginx:1.17-alpine --record=true
2, 定義要回退的版本(還需要執(zhí)行才是真的回退版本)
[root@k8s-master1 ~]# kubectl rollout history deployment deploy-nginx --revision=1
deployment.apps/deploy-nginx with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=6c9764bb69
Containers:
nginx:
Image: nginx:1.15-alpine 可以看到這是要回退的1.15版本
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
3, 執(zhí)行回退
[root@k8s-master1 ~]# kubectl rollout undo deployment deploy-nginx --to-revision=1
deployment.apps/deploy-nginx rolled back
4, 驗(yàn)證
[root@k8s-master1 ~]# kubectl rollout history deployment deploy-nginx
deployment.apps/deploy-nginx
REVISION CHANGE-CAUSE
2 kubectl set image deployment deploy-nginx nginx=nginx:1.16-alpine --record=true
3 kubectl set image deployment deploy-nginx nginx=nginx:1.17-alpine --record=true
4 <none> 回到了1.15版,但revision的ID變了
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-6c9764bb69-zgwpj 1/1 Running 0 54s
[root@k8s-master1 ~]# kubectl describe pod deploy-nginx-6c9764bb69-zgwpj |grep Image:
Image: nginx:1.15-alpine 回到了1.15版
[root@k8s-master1 ~]# kubectl exec deploy-nginx-6c9764bb69-zgwpj -- nginx -v
nginx version: nginx/1.15.12 回到了1.15版
1.2.9 副本擴(kuò)容
查看幫助
[root@k8s-master1 ~]# kubectl scale -h
1, 擴(kuò)容為2個(gè)副本
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=2
deployment.apps/deploy-nginx scaled
2, 查看
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-6d9d558bb6-4c64l 1/1 Running 0 27s 10.244.159.157 k8s-master1 <none> <none>
deploy-nginx-6d9d558bb6-hkq2b 1/1 Running 0 71s 10.244.194.95 k8s-worker1 <none> <none>
在兩個(gè)node節(jié)點(diǎn)上各1個(gè)pod
3, 繼續(xù)擴(kuò)容(我們這里只有2個(gè)node,但是可以大于node節(jié)點(diǎn)數(shù)據(jù))
[root@master ~]# kubectl scale deployment deploy-nginx --replicas=4
deployment.extensions/nginx1 scaled
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
deploy-nginx-6d9d558bb6-4c64l 1/1 Running 0 87s 10.244.159.157 k8s-master1 <none> <none>
deploy-nginx-6d9d558bb6-586dr 1/1 Running 0 31s 10.244.135.197 k8s-master3 <none> <none>
deploy-nginx-6d9d558bb6-hkq2b 1/1 Running 0 2m11s 10.244.194.95 k8s-worker1 <none> <none>
deploy-nginx-6d9d558bb6-kvgsc 1/1 Running 0 31s 10.244.224.13 k8s-master2 <none> <none>
1.2.10 副本裁減
1, 指定副本數(shù)為1進(jìn)行裁減
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=1
deployment.apps/deploy-nginx scaled
2, 查看驗(yàn)證
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
deploy-nginx-6d9d558bb6-hkq2b 1/1 Running 0 2m56s
1.2.11 多副本滾動(dòng)更新
1, 先擴(kuò)容多點(diǎn)副本
[root@k8s-master1 ~]# kubectl scale deployment deploy-nginx --replicas=16
deployment.apps/deploy-nginx scaled
2, 驗(yàn)證
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx1-7d9b8757cf-2hd48 1/1 Running 0 61s
nginx1-7d9b8757cf-5m72n 1/1 Running 0 61s
nginx1-7d9b8757cf-5w2xr 1/1 Running 0 61s
nginx1-7d9b8757cf-5wmdh 1/1 Running 0 61s
nginx1-7d9b8757cf-6szjj 1/1 Running 0 61s
nginx1-7d9b8757cf-9dgsw 1/1 Running 0 61s
nginx1-7d9b8757cf-dc7qj 1/1 Running 0 61s
nginx1-7d9b8757cf-l52pr 1/1 Running 0 61s
nginx1-7d9b8757cf-m7rt4 1/1 Running 0 26m
nginx1-7d9b8757cf-mdkj2 1/1 Running 0 61s
nginx1-7d9b8757cf-s79kp 1/1 Running 0 61s
nginx1-7d9b8757cf-shhvk 1/1 Running 0 61s
nginx1-7d9b8757cf-sv8gb 1/1 Running 0 61s
nginx1-7d9b8757cf-xbhf4 1/1 Running 0 61s
nginx1-7d9b8757cf-zgdgd 1/1 Running 0 61s
nginx1-7d9b8757cf-zzljl 1/1 Running 0 61s
nginx2-559567f789-8hstz 1/1 Running 1 114m
3, 滾動(dòng)更新
[root@k8s-master1 ~]# kubectl set image deployment deploy-nginx nginx=nginx:1.17-alpine --record
deployment.apps/deploy-nginx image updated
4, 驗(yàn)證
[root@k8s-master1 ~]# kubectl rollout status deployment deploy-nginx
......
Waiting for deployment "deploy-nginx" rollout to finish: 13 of 16 updated replicas are available...
Waiting for deployment "deploy-nginx" rollout to finish: 14 of 16 updated replicas are available...
Waiting for deployment "deploy-nginx" rollout to finish: 15 of 16 updated replicas are available...
deployment "deploy-nginx" successfully rolled out
1.2.12 刪除deployment
如果使用 kubectl delete deployment deploy-nginx
命令刪除deployment,那么里面的pod也會(huì)被自動(dòng)刪除
1.3 Replicaset
1, 編寫YAML文件
[root@master ~]# vim rs-nginx.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
namespace: default
spec: # replicaset的spec
replicas: 2 # 副本數(shù)
selector: # 標(biāo)簽選擇器,對(duì)應(yīng)pod的標(biāo)簽
matchLabels:
app: nginx # 匹配的label
template:
metadata:
name: nginx # pod名
labels: # 對(duì)應(yīng)上面定義的標(biāo)簽選擇器selector里面的內(nèi)容
app: nginx
spec: # pod的spec
containers:
- name: nginx
image: nginx:1.15-alpine
ports:
- name: http
containerPort: 80
2, 應(yīng)用YAML文件
[root@k8s-master1 ~]# kubectl apply -f rs-nginx.yml
replicaset.apps/rs-nginx created
3, 驗(yàn)證
[root@k8s-master1 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-nginx 2 2 2 26s
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
rs-nginx-7j9hz 1/1 Running 0 44s
rs-nginx-pncsk 1/1 Running 0 43s
[root@k8s-master1 ~]# kubectl get deployment
No resources found.
找不到deployment,說(shuō)明創(chuàng)建rs并沒(méi)有創(chuàng)建deployment
二、pod控制器Controller進(jìn)階
2.1 DaemonSet
2.1.1 DaemonSet介紹
- DaemonSet能夠讓所有(或者特定)的節(jié)點(diǎn)運(yùn)行同一個(gè)pod。
- 當(dāng)節(jié)點(diǎn)加入到K8S集群中,pod會(huì)被(DaemonSet)調(diào)度到該節(jié)點(diǎn)上運(yùn)行,當(dāng)節(jié)點(diǎn)從K8S集群中被移除,被DaemonSet調(diào)度的pod會(huì)被移除
- 如果刪除DaemonSet,所有跟這個(gè)DaemonSet相關(guān)的pods都會(huì)被刪除。
- 如果一個(gè)DaemonSet的Pod被殺死、停止、或者崩潰,那么DaemonSet將會(huì)重新創(chuàng)建一個(gè)新的副本在這臺(tái)計(jì)算節(jié)點(diǎn)上。
- DaemonSet一般應(yīng)用于日志收集、監(jiān)控采集、分布式存儲(chǔ)守護(hù)進(jìn)程等
2.1.2 DaemonSet應(yīng)用案例
1, 編寫YAML文件
[root@master ~]# vim daemonset-nginx.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
name: nginx-ds
template:
metadata:
labels:
name: nginx-ds
spec:
tolerations: # tolerations代表容忍
- key: node-role.kubernetes.io/master # 能容忍的污點(diǎn)key
effect: NoSchedule # kubectl explain pod.spec.tolerations查看(能容忍的污點(diǎn)effect)
containers:
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
resources: # resources資源限制是為了防止master節(jié)點(diǎn)的資源被占太多(根據(jù)實(shí)際情況配置)
limits:
memory: 100Mi
requests:
memory: 100Mi
2, apply應(yīng)用YAML文件文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-503867.html
[root@k8s-master1 ~]# kubectl apply -f daemonset-nginx.yml
daemonset.apps/daemonset-nginx created
3, 驗(yàn)證文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-503867.html
[root@master ~]# kubectl get daemonset # daemonset可簡(jiǎn)寫為ds
[root@k8s-master1 ~]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset-nginx 4 4 4 4 4 <none> 114s
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-nginx-94z6d 1/1 Running 0 6s 10.244.194.104 k8s-worker1 <none> <none>
daemonset-nginx-hs9mk 1/1 Running 0 6s 10.244.135.206 k8s-master3 <none> <none>
daemonset-nginx-jrcf5 1/1 Running 0 6s 10.244.159.167 k8s-master1 <none> <none>
daemonset-nginx-sslpl 1/1 Running 0 6s 10.244.224.22 k8s-master2 <none> <none>
k8s集群中每個(gè)節(jié)點(diǎn)都會(huì)運(yùn)行一個(gè)pod
到了這里,關(guān)于kubernetes核心概念 controller的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!