第一步,撰寫首次部署所需的yaml檔案,包括三塊:命名空間定義、服務定義、部署定義,nginx的鏡像版本為 1.16.1
內容如下:
apiVersion: v1
kind: Namespace
metadata:
name: load-balance
---
kind: Service
apiVersion: v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30012
selector:
app: nginx-1161
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
replicas: 3
selector:
matchLabels:
app: nginx-1161
template:
metadata:
labels:
app: nginx-1161
spec:
containers:
- name: nginx
image: nginx:1.16.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
# 執行創建
$ kubectl apply -f ./nginx-deployment.yaml
namespace/load-balance created
service/nginx-1161 created
deployment.apps/nginx-1161 created
# 第一次創建的容器實體我們簡稱為“7d”
$ kubectl get pods -n load-balance
NAME READY STATUS RESTARTS AGE
nginx-1161-7d57d5c7c4-prk5p 1/1 Running 0 22m
nginx-1161-7d57d5c7c4-s4pqk 1/1 Running 0 22m
nginx-1161-7d57d5c7c4-v42kt 1/1 Running 0 22m
# 測驗訪問Nginx的主頁,成功回傳Nginx歡迎頁面的html代碼
$ curl http://192.168.223.201:30012/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
第二步,執行第一次滾動升級,修改Nginx鏡像的版本為1.18.0,增加滾動升級的模塊配置
apiVersion: v1
kind: Namespace
metadata:
name: load-balance
---
kind: Service
apiVersion: v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30012
selector:
app: nginx-1161
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
minReadySeconds: 5 # 增加配置
strategy: # 增加配置
type: RollingUpdate # 增加配置
rollingUpdate: # 增加配置
maxSurge: 1 # 增加配置
maxUnavailable: 1 # 增加配置
replicas: 3
selector:
matchLabels:
app: nginx-1161
template:
metadata:
labels:
app: nginx-1161
spec:
containers:
- name: nginx
image: nginx:1.18.0 # 配置修改
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
# 執行滾動升級
$ kubectl apply -f nginx-update-I-deployment.yaml
namespace/load-balance unchanged
service/nginx-1161 unchanged
deployment.apps/nginx-1161 configured
# 查看滾動升級的狀態
$ kubectl rollout status deployment nginx-1161 -n load-balance
deployment "nginx-1161" successfully rolled out
# 查看副本集(rs,即ReplicaSet)
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 3 3 3 84s
nginx-1161-7d57d5c7c4 0 0 0 26m
# 查看pods和服務
$ kubectl get pods,svc -n load-balance
NAME READY STATUS RESTARTS AGE
pod/nginx-1161-56dd96d66c-724rg 1/1 Running 0 119s
pod/nginx-1161-56dd96d66c-cnkn6 1/1 Running 0 81s
pod/nginx-1161-56dd96d66c-zhq4c 1/1 Running 0 119s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx-1161 NodePort 10.96.92.254 <none> 80:30012/TCP 28m
第三步,執行第二次滾動升級,修改image的版本為 1.20.1
apiVersion: v1
kind: Namespace
metadata:
name: load-balance
---
kind: Service
apiVersion: v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30012
selector:
app: nginx-1161
---
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: nginx-1161
name: nginx-1161
namespace: load-balance
spec:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
replicas: 3
selector:
matchLabels:
app: nginx-1161
template:
metadata:
labels:
app: nginx-1161
spec:
containers:
- name: nginx
image: nginx:1.20.1 # 配置修改
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
$ kubectl apply -f nginx-update-II-deployment.yaml
namespace/load-balance unchanged
service/nginx-1161 unchanged
deployment.apps/nginx-1161 configured
# kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 2 2 2 3m46s
nginx-1161-7cccdf449f 2 2 0 17s
nginx-1161-7d57d5c7c4 0 0 0 29m
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 2 2 2 4m2s
nginx-1161-7cccdf449f 2 2 1 33s
nginx-1161-7d57d5c7c4 0 0 0 29m
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 1 1 1 4m8s
nginx-1161-7cccdf449f 3 3 1 39s
nginx-1161-7d57d5c7c4 0 0 0 29m
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 1 1 1 4m13s
nginx-1161-7cccdf449f 3 3 2 44s
nginx-1161-7d57d5c7c4 0 0 0 29m
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 0 0 0 4m15s
nginx-1161-7cccdf449f 3 3 2 46s
nginx-1161-7d57d5c7c4 0 0 0 29m
# 至此,滾動升級全部完成(資料抓取時間延后,非升級速度慢)
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 0 0 0 26m
nginx-1161-7cccdf449f 3 3 3 23m
nginx-1161-7d57d5c7c4 0 0 0 52m
檢查歷史版本的詳細資訊:
$ kubectl rollout history deployment nginx-1161 -n load-balance --revision=3
deployment.apps/nginx-1161 with revision #3
Pod Template:
Labels: app=nginx-1161
pod-template-hash=7cccdf449f
Containers:
nginx:
Image: nginx:1.20.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
$ kubectl rollout history deployment nginx-1161 -n load-balance --revision=2
deployment.apps/nginx-1161 with revision #2
Pod Template:
Labels: app=nginx-1161
pod-template-hash=56dd96d66c
Containers:
nginx:
Image: nginx:1.18.0
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
$ kubectl rollout history deployment nginx-1161 -n load-balance --revision=1
deployment.apps/nginx-1161 with revision #1
Pod Template:
Labels: app=nginx-1161
pod-template-hash=7d57d5c7c4
Containers:
nginx:
Image: nginx:1.16.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
測驗回滾到上一個版本:
$ kubectl rollout undo deployment nginx-1161 -n load-balance --to-revision=2
deployment.apps/nginx-1161 rolled back
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 3 3 3 135m
nginx-1161-7cccdf449f 0 0 0 131m
nginx-1161-7d57d5c7c4 0 0 0 160m
如果不指定--to-revision,則默認回滾到上一個版本
$ kubectl rollout undo deployment nginx-1161 -n load-balance
deployment.apps/nginx-1161 rolled back
$ kubectl get rs -n load-balance
NAME DESIRED CURRENT READY AGE
nginx-1161-56dd96d66c 0 0 0 138m
nginx-1161-7cccdf449f 3 3 3 135m
nginx-1161-7d57d5c7c4 0 0 0 164m
個人理解的回滾機制:

通過測驗發現,不帶 --to-revision 引數的 undo 回滾,會進入死回圈,如上圖所示,會始終在V2和V3版本之間來回的切換,而無法回滾到最早的 nginx-1161-7d57d5c7c4 版本,不知道這算不算K8S回滾機制存在的一個Bug呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/293458.html
標籤:其他
下一篇:socket實作TCP/IP通信
