1. 程式人生 > >Pod控制器應用進階四(Pod更新,擴縮容)

Pod控制器應用進階四(Pod更新,擴縮容)

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