Pod控制器應用進階四(Pod更新,擴縮容)
阿新 • • 發佈:2018-11-09
vim deploy-demo.yaml [[email protected] test]# cat deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 2 selector: matchLabels: app: myapp release: canary template: metadata: labels: app: myapp release: canary spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80
kubectl apply -f deploy-demo.yaml
apply宣告式建立,也可以建立,也可以更新
kubectl get pods [[email protected] test]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 2d myapp-deploy-69b47bc96d-2k2ck 1/1 Running 0 8s myapp-deploy-69b47bc96d-pm48p 1/1 Running 0 8s readiness-httpget-container 1/1 Running 0 23h
檢視建立:
kubectl get deploy
[[email protected] test]# kubectl get deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
myapp-deploy 2 2 2 2 31s
kubectl get rs
[[email protected] test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-69b47bc96d 2 2 2 52s
如果想更新的話,直接編輯deploy-demo.yaml檔案即可
replicas=5
執行:
kubectl apply -f deploy-demo.yaml
注意:apply是可以執行多次的
[[email protected] test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-69b47bc96d 5 5 5 9m
[[email protected] test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
myapp-deploy-69b47bc96d-58dj7 1/1 Running 0 10s
myapp-deploy-69b47bc96d-8lsjj 1/1 Running 0 10s
myapp-deploy-69b47bc96d-9rrhl 1/1 Running 0 9m
myapp-deploy-69b47bc96d-9xz65 1/1 Running 0 9m
myapp-deploy-69b47bc96d-pr94f 1/1 Running 0 10s
readiness-httpget-container 1/1 Running 0 23h
執行的容器更新版本:
vim deploy-demo.yaml
image: ikubernetes/myapp:v2
kubectl apply -f deploy-demo.yaml 直接就會重新生成容器,全部更新
檢視更新後的狀態:
kubectl get rs
[[email protected] test]# kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-67f6f6b4dc 5 5 5 17s
myapp-deploy-69b47bc96d 0 0 0 11m
kubectl get rs -o wide
[[email protected] test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 5 5 5 1m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-69b47bc96d 0 0 0 11m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=2560367528,release=canary
檢視歷史的滾動記錄
kubectl rollout history deployment myapp-deploy
[[email protected] test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
如果想返回上面的一個版本:
[[email protected] test]# kubectl rollout undo deployment myapp-deploy
deployment.extensions/myapp-deploy
[[email protected] test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 0 0 0 5m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-69b47bc96d 5 5 5 16m myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=2560367528,release=canary
K8S 應用的靈活更新
先啟動一個監控視窗:
kubectl get pods -l app=myapp -w
再啟動一個執行更新的視窗:
[[email protected] test]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy
deployment.extensions/myapp-deploy image updated
deployment.extensions/myapp-deploy paused
監控端:顯示現在映象,建立容器 #金絲雀釋出
也可以使用這個命令來檢視更新:
[[email protected] test]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
更新完成3個,共5個
系統沒有繼續更新:執行下面的繼續更新
[[email protected] test]# kubectl rollout resume deployment myapp-deploy
deployment.extensions/myapp-deploy resumed
五個全部更新完成
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated
檢視歷史的版本:
kubectl get rs -o wide
[[email protected] test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 0 0 0 4m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-6bdcd6755d 5 5 5 3m myapp ikubernetes/myapp:v3 app=myapp,pod-template-hash=2687823118,release=canary
通過上面發現,系統的版本都更新到了v3版,原來的版本已經暫停了
日誌上顯示,下載映象,刪除一個,建立一個,可以控制節奏
回滾版本:
先檢視版本:
[[email protected] test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
1 <none>
2 <none>
回滾到第一個版本:
[[email protected] test]# kubectl rollout undo deployment myapp-deploy --to-revision=1
deployment.extensions/myapp-deploy
檢視是否回滾成功:
[[email protected] test]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-67f6f6b4dc 5 5 5 9m myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=2392926087,release=canary
myapp-deploy-6bdcd6755d 0 0 0 8m myapp ikubernetes/myapp:v3 app=myapp,pod-template-hash=2687823118,release=canary
已經回滾成功
繼續檢視版本:
[[email protected] test]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION CHANGE-CAUSE
2 <none>
3 <none>
部署redis專案
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
#redis日誌的儲存器
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filb-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local
#redis服務名
#namespace 名稱空間
#svc.cluster.local地址
- name: REDIS_LOG_LEVEL
value: info
連結方式都是service 主機名
在docker pull ikubernetes/filebeat:5.6.5-alpine
進入redis容器:
kubectl exec -it redis-5b5d6fbbbd-hb4pm -- /bin/sh
/data # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 :::6379 :::* LISTEN
/data # nslookup redis.default.svc.cluster.local
在容器中使用這個容器解析到這裡
/data # nslookup redis.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name: redis.default.svc.cluster.local
Address 1: 10.103.208.232 redis.default.svc.cluster.local
容器內部:redis測試連線:
redis-cli -h redis.default.svc.cluster.local
/data # redis-cli -h redis.default.svc.cluster.local
redis.default.svc.cluster.local:6379> keys *
(empty list or set)
退出容器後檢視:
[[email protected] test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
filb-ds-7tjbh 1/1 Running 0 9m
filb-ds-v566t 1/1 Running 0 9m
myapp-deploy-67f6f6b4dc-6sbwc 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-cv4cv 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-lc4sp 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-msdfm 1/1 Running 0 3h
myapp-deploy-67f6f6b4dc-tvxpb 1/1 Running 0 3h
readiness-httpget-container 1/1 Running 0 1d
redis-5b5d6fbbbd-hb4pm 1/1 Running 0 9m
進入filb容器
[[email protected] test]# kubectl exec -it filb-ds-7tjbh -- /bin/sh
/ # ps aux
PID USER TIME COMMAND
1 root 0:00 /usr/local/bin/filebeat -e -c /etc/filebeat/filebeat.yml
11 root 0:00 /bin/sh
15 root 0:00 ps aux
檢視容器內的環境變數
printenv
檢視容器內的環境變數
/ # printenv
KUBERNETES_SERVICE_PORT=443
REDIS_PORT=tcp://10.103.208.232:6379
KUBERNETES_PORT=tcp://10.96.0.1:443
REDIS_SERVICE_PORT=6379
REDIS_PORT_6379_TCP_ADDR=10.103.208.232
HOSTNAME=filb-ds-7tjbh
SHLVL=1
HOME=/root
REDIS_PORT_6379_TCP_PORT=6379
NGINX_PORT_80_TCP=tcp://10.111.8.112:80
REDIS_PORT_6379_TCP_PROTO=tcp
MYAPP_SERVICE_HOST=10.101.151.96
MYAPP_SERVICE_PORT=80
MYAPP_PORT=tcp://10.101.151.96:80
REDIS_PORT_6379_TCP=tcp://10.103.208.232:6379
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
MYAPP_PORT_80_TCP_ADDR=10.101.151.96
NGINX_SERVICE_HOST=10.111.8.112
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
REDIS_LOG_LEVEL=info
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_PORT_80_TCP_PORT=80
MYAPP_PORT_80_TCP_PROTO=tcp
NGINX_SERVICE_PORT=80
NGINX_PORT=tcp://10.111.8.112:80
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
REDIS_SERVICE_HOST=10.103.208.232
MYAPP_PORT_80_TCP=tcp://10.101.151.96:80
REDIS_HOST=redis.default.svc.cluster.local
NGINX_PORT_80_TCP_ADDR=10.111.8.112
FILEBEAT_VERSION=5.6.5
NGINX_PORT_80_TCP_PORT=80
NGINX_PORT_80_TCP_PROTO=tcp
通過上面環境資訊可以看出:
REDIS_HOST=redis.default.svc.cluster.local 連線資訊已經生效了
檢視解析設定
/ # nslookup redis.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name: redis.default.svc.cluster.local
Address 1: 10.103.208.232 redis.default.svc.cluster.local
[[email protected] ~]# kubectl get pods -l app=filebeat -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
filb-ds-7tjbh 1/1 Running 0 2h 10.244.2.52 node2 <none>
filb-ds-v566t 1/1 Running 0 2h 10.244.1.50 node1 <none>
[[email protected] ~]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
filb-ds 2 2 2 2 2 <none> 3h
[[email protected] ~]# kubectl set image daemonsets filb-ds filebeat=ikubernetes/filebeat:5.6.6-alpine
daemonset.extensions/filb-ds image updated
[[email protected] ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
client 1/1 Running 0 2d
filb-ds-2cqcv 1/1 Running 0 8m
filb-ds-p9tt2 1/1 Running 0 7m
myapp-deploy-67f6f6b4dc-6sbwc 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-cv4cv 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-lc4sp 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-msdfm 1/1 Running 0 6h
myapp-deploy-67f6f6b4dc-tvxpb 1/1 Running 0 6h
readiness-httpget-container 1/1 Running 0 1d
redis-5b5d6fbbbd-hb4pm 1/1 Running 0 3h