您好,登錄后才能下訂單哦!
在機器人技術(shù)和自動化中,控制環(huán)是一個控制系統(tǒng)狀態(tài)的不終止的循環(huán)
這是一個控制環(huán)的例子:"房間里的溫度自動調(diào)節(jié)器"
當你設(shè)置了溫度,告訴了溫度自動調(diào)節(jié)器你的"期望狀態(tài)",房間的實際溫度是"當前狀態(tài)"。通過對設(shè)備的開關(guān)控制,溫度自動調(diào)節(jié)器讓其當前狀態(tài)無限接近于期望狀態(tài)。
控制器通過 k8s的apiserver 去監(jiān)控集群的公共狀態(tài),并致力于將當前狀態(tài)轉(zhuǎn)變?yōu)樗谕臓顟B(tài)。
kubernetes 之Pod控制器(Controller)
Controller是kubernetes中用于對Pod進行管理的控制器,通過該控制器可以讓Pod始終維持在一個用戶原本設(shè)定或期望的狀態(tài)下。如節(jié)點宕機或Pod因其他原因死亡,則在其他節(jié)點起一個相同的Pod來替代該Pod。
[root@node1 controllers]# cat replicaset-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-httpd
labels:
app: myapp
release: canary
environment: qa
spec:
containers:
- name: myapp-container
image: httpd
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
[root@node1 controllers]#
Kubernetes 最小運行單元 Pod,了解Pod是什么你需要了解容器
容器本質(zhì)實際上是一個進程,是一個視圖被隔離,資源受限的進程。
容器的設(shè)計本身是"單進程"模型,不是容器里只能起一個進程,因為容器的應(yīng)用等于進程,只能管理PID=1的進程。(Linux 容器的"單進程"模型,指的是容器的生命周期等同于 PID=1 的進程的生命周期,而不是說容器里不能創(chuàng)建多進程),也可以啟動多個進程,但是只有PID=1的進程被容器所管理,這時其它進程則處于tuoguan狀態(tài)。如果這個時候PID=1的這個進程出問題了被kill掉了或者是fail了沒人知道,然后其它的進程資源怎么辦呢?就沒人管,沒人回收......
所以往往在容器當中運行一個復(fù)雜程序是比較苦難的,但kubernetes的控制器的脫引而出,為它奠定了其在容器當中運行多個應(yīng)用的歷史地位,至少現(xiàn)階段是的。
Pod 是什么
讓Kubernetes集群能跑起來的基礎(chǔ)組件就叫 Pod。
Pod = "進程組"
在 Kubernetes 里面,Pod 實際上正是 Kubernetes 項目為你抽象出來的一個可以類比為進程組的概念。
簡單點就是在kubernets當中會把多個應(yīng)用定義為多個容器,然后把多個容器運行在一個Pod資源里面,你也可以說是多個容器的組合就叫做 Pod。當Kubernetes把定義在一個Pod組合里的容器運行起來后,你會看到多個容器在運行。它們會同時去共享系統(tǒng)底層的某些資源(共享同一個底層的net、uts、ipc、等...),而這些資源都屬于 Pod。
Pod 在 Kubernetes 里面只有一個邏輯單位,Pod 是 Kubernetes 分配資源的一個單位。因為里面的容器要共享某些資源,所以Pod 它也是 Kubernetes 的原子調(diào)度單位。
Pod 的工作特點
Kubernetes 中Pod 的運行方式
[root@node1 controllers]# cat pod-tomcat-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: web-2
namespace: default
spec:
initContainers:
- image: ik8s.io/sample:v2
imagePullPolicy: IfNotPresent
name: war
command: [ "cp", "/sample.war", "/app" ]
volumeMounts:
- mountPath: /app
name: app-volume
containers:
- image: ik8s.io/tomcat:8.0
imagePullPolicy: IfNotPresent
name: tomcat8
command: [ "sh", "-c", "/root/apache-tomcat-8.0.5/bin/start.sh" ]
volumeMounts:
- mountPath: /root/apache-tomcat-8.0.5/webapps
name: app-volume
ports:
- containerPort: 8080
hostPort: 8008
volumes:
- name: app-volume
emptyDir: {}
[root@node1 controllers]#
利用DeployMents控制器實現(xiàn)滾動更新及灰度應(yīng)用發(fā)布
[root@node1 controllers]# kubectl explain deploy
[root@node1 controllers]# kubectl explain deploy.spec
[root@node1 controllers]# kubectl explain deploy.spec.strategy
此示例中會告訴您怎么實現(xiàn)一組應(yīng)用的滾動更新,版本回退,Pod數(shù)量更新等。
[root@node1 controllers]# cat deployment-myapp-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
[root@node1 controllers]#
[root@node1 controllers]# kubectl apply -f deployment-myapp-demo.yaml
deployment.apps/myapp-deployment created
[root@node1 controllers]#
[root@node1 controllers]# kubectl delete -f deployment-myapp-demo.yaml
deployment.apps "myapp-deployment" deleted
[root@node1 controllers]#
[root@node1 controllers]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-deployment-5b776d9cf7-29s7b 1/1 Running 0 9m26s
myapp-deployment-5b776d9cf7-8hb8c 1/1 Running 0 9m26s
[root@node1 controllers]#
[root@node1 controllers]# kubectl logs myapp-deployment-5b776d9cf7-8hb8c
[root@node1 controllers]#
[root@node1 controllers]# kubectl describe pods myapp-deployment-5b776d9cf7-8hb8c
.............
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/myapp-deployment-5b776d9cf7-8hb8c to node2
Normal Pulled 10h kubelet, node2 Container image "nginx" already present on machine
Normal Created 10h kubelet, node2 Created container myapp
Normal Started 10h kubelet, node2 Started container myapp
[root@node1 controllers]#
# 更新當前副本集為5個
[root@node1 controllers]# kubectl patch deployment myapp-deploy -p '{"spec":{"relicas":5}}'
# 實時查看更新狀態(tài)
[root@node1 controllers]# kubectl get pods -w
# 更新容器鏡像版本至最新
[root@node1 controllers]# kubectl set image deployment/myapp-deployment nginx=nginx:latest
# 查看滾動更新歷史
[root@node1 controllers]# kubectl rollout history deployment myapp-deployment
# 查看ReplicaSet空間image版本號狀態(tài)
[root@node1 controllers]# kubectl get rs -l app=myapp -o wide
# 查看image字段
[root@node1 controllers]# kubectl describe pods myapp-deployment-5b776d9cf7-8hb8c | grep 'Image'
# 查看其更新的過程是怎么更新的,做了什么
[root@node1 controllers]# kubectl describe deployment/myapp-deployment
# 命令幫助
[root@node1 controllers]# kubectl explain deploy.spec.strategy.rollingUpdate
# 先打補丁,更改當前更新策略,以模擬金絲雀發(fā)布
[root@node1 controllers]# kubectl patch deployment myapp-deployment -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
# 查看
[root@node1 controllers]# kubectl describe deploy myapp-deployment
# 再更新(金絲雀發(fā)布)
[root@node1 controllers]# kubectl set image deployment myapp-deployment myapp=nginx:v1 && kubectl rollout pause deployment myapp-
Waiting for deployment "myapp-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
# 查看歷史版本,使用 "--record" 參數(shù)可看到每個版本所使用的命令
[root@node1 controllers]# kubectl rollout history deployment myapp-deployment
# 回滾不加版本號,默認回退到上一個版本
[root@node1 controllers]# kubectl rollout undo deployment myapp-deployment
# 使用 "--to-reversion=[N]" 回滾到指定版本
[root@node1 controllers]# kubectl rollout undo deploy myapp-deployment --to-reversion=1
# 如以上沒問題,再次執(zhí)行更新操作
[root@node1 controllers]# kubectl rollout resume deploy myapp-deployment
利用DaemonSet 運行指定一個Pod副本,把系統(tǒng)某個目錄作為存儲卷
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。