kubernetes使用命令列的方式管理Kubernetes資源

2020-08-12 17:25:41

瞭解Kubernetes的朋友,可能都聽過這樣一句話:Kubernetes中一切皆是資源!

一、資源的建立與刪除

[root@master ~]# kubectl run test --image=nginx:latest --replicas=5
//基於nginx的映象建立一個deployment型別的控制組,名稱爲test,並指定副本數量爲5
[root@master ~]# kubectl get deployments.     
//檢視deployment控制器
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
test   5/5     5            5           6m26s
//可以看到deployment的name是我們指定的test
[root@master ~]# kubectl get replicasets.     
//檢視replicasets這個控制器
NAME              DESIRED   CURRENT   READY   AGE
test-66cbf74d74   5         5         5       7m50s
//可以看到replicasets的NAME就是在deployment的NAME後面追加了一串ID號
[root@master ~]# kubectl get pod -o wide     
//檢視pod的詳細資訊,可以看出pod平均分佈在了各個node節點上
//可以看到該pod的NAME就是在上面replicasets的後面又追加了一段ID
[root@master ~]# kubectl describe deployments. test
//檢視名爲test控制器的詳細資訊,注意NewReplicaSet該欄位
//從返回的詳細資訊中可以看出該控制器在建立pod的過程中重新生成了一個控制器
[root@master ~]# kubectl describe replicasets. test
//檢視replicasets控制器的詳細資訊,注意Controlled By這個欄位明確表示了該控制器是由Deployment/test這個控制器生成的
[root@master ~]# kubectl delete deployments. test
//刪除資源(直接刪除控制器,就等於該控制器控制的所有資源進行刪除)

從以上建立一個pod的過程中,就可以看出當我們執行建立資源的命令後,deployment這個控制器會通過replicaset控制器去管理並建立所需的pod!

二、解決用戶端無法存取pod中的服務

當k8s叢集建立pod完成後,叢集內部是可以存取pod所提供的服務的,方法如下:

[root@master ~]# kubectl get pod -o wide
//檢視pod的詳細資訊,獲取其中一個pod所對應的IP地址
[root@master ~]# curl -I 10.244.1.3 &> /dev/null && echo $?
0
//叢集內部存取是沒有問題的

但是此時除了叢集內部,外部是存取不到的,k8s提供了完美的解決方案,實現過程如下:

[root@master ~]# kubectl run web --image=nginx:latest --port=80 --replicas=2
//建立一個名爲web的deployment的資源物件,並對映容器的80埠到宿主機
[root@master ~]# kubectl expose deployment web --name=service --port=80 --type=NodePort
//建立一個service(名稱可以自定義),將部署web資源物件的80埠對映出來
[root@master ~]# kubectl get svc service      //檢視建立service的資訊
NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service   NodePort   10.110.139.176   <none>        80:31070/TCP   35s
//可以看出將部署的伺服器端口對映到了宿主機的31070埠

此時用戶端存取http://192.168.1.10:31070 即可存取pod中執行的服務!
注意:是存取羣集中任意節點都可以存取k8s叢集中pod所提供的服務!
從以上範例中可以看出,只要基於pod建立一個svc資源即可存取pod中的服務!

三、搭建私有倉庫,並自定義映象

[root@master ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest 
[root@master ~]# vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000
[root@master ~]# systemctl daemon-reload && systemctl restart docker
[root@master ~]# scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
[root@master ~]# scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/docker.service
[root@node01 ~]# systemctl daemon-reload && systemctl restart docker
[root@node02 ~]# systemctl daemon-reload && systemctl restart docker
#############搭建私有倉庫完成##################
[root@master ~]# mkdir v{1,2,3}
[root@master ~]# cd v1
[root@master v1]# echo -e "FROM nginx:latest\nADD index.html /usr/share/nginx/html/" > Dockerfile
[root@master v1]# echo -e "<h1>hello lvzhenjiang:v1</h1>" > index.html
[root@master v1]# docker build -t 192.168.1.10:5000/nginx:version1 .
[root@master v1]# cp Dockerfile ../v2/
[root@master v1]# cp Dockerfile ../v3/
[root@master v1]# echo -e "<h1>hello lvzhenjiang:v2</h1>" > ../v2/index.html
[root@master v1]# echo -e "<h1>hello lvzhenjiang:v3</h1>" > ../v3/index.html
[root@master v1]# cd ../v2
[root@master v2]# docker build -t 192.168.1.10:5000/nginx:version2 .
[root@master v2]# cd ../v3
[root@master v3]# docker build -t 192.168.1.10:5000/nginx:version3 .
//生成三個不同版本的映象,在主頁上進行區分
[root@master v3]# docker push 192.168.1.10:5000/nginx:version1
[root@master v3]# docker push 192.168.1.10:5000/nginx:version2
[root@master v3]# docker push 192.168.1.10:5000/nginx:version3
//將映象上傳到私有倉庫中
#################建立pod進行測試###################
[root@master v3]# kubectl run nginx --image=192.168.1.10:5000/nginx:version1 --port=80 --replicas=4
//基於自定義映象(192.168.1.10:5000/nginx:v1)建立pod,副本數量爲4個,並對映埠
[root@master v3]# kubectl get pod -o wide | grep nginx | awk '{print $6}'
10.244.2.11
10.244.2.10
10.244.1.16
10.244.1.15
//建立四個副本的IP地址
[root@master v3]# curl 10.244.2.11
<h1>hello lvzhenjiang:v1</h1>
[root@master v3]# curl 10.244.2.10
<h1>hello lvzhenjiang:v1</h1>
//存取副本的任意IP地址都可以看到同樣的頁面
[root@master v3]# kubectl logs nginx-745f58b55d-25nmz
//檢視其中一個pod所產生的日誌資訊

四、pod擴容、縮容

第一種方法:

[root@master ~]# kubectl scale deployment nginx --replicas=8
//使用命令列的方式進行擴容操作(縮容也是一樣的道理)
[root@master ~]# kubectl get pod -o wide | grep nginx | wc -l
8
[root@master ~]# kubectl get deployments. nginx -o yaml
[root@master ~]# kubectl get deployments. nginx -o json
//也可以將nginx資源型別已json或yaml檔案格式輸出(其中也可檢視到副本的數量)

第二種方法:

[root@master ~]# kubectl edit deployments. nginx
//編輯名爲nginx的資源型別
     19 spec:                  //找到spec欄位
     20   progressDeadlineSeconds: 600
     21   replicas: 6           //更改副本數量
//在儲存退出的一瞬間就生效了
[root@master ~]# kubectl get pod -o wide | grep nginx | wc -l
6
//檢視副本數量

五、服務升級與回滾

1)升級

[root@master ~]# kubectl set image deployment nginx nginx=192.168.1.10:5000/nginx:version2
//將nginx資源的映象升級爲192.168.1.10:5000/nginx:version2
[root@master ~]# kubectl get pod -o wide | grep nginx | awk '{print $6}'
10.244.1.19
10.244.1.21
10.244.1.20
10.244.2.14
10.244.2.15
10.244.2.16
[root@master ~]# curl 10.244.1.19
<h1>hello lvzhenjiang:v2</h1>
//可以通過測試存取的方式進行驗證
[root@master ~]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     6            6           18m   nginx        192.168.1.10:5000/nginx:version2   run=nginx
//可以通過檢視nginx資源的資訊進行檢視
[root@master ~]# kubectl describe deployments. nginx
//也可以通過檢視nginx資源的詳細資訊進行檢視
[root@master ~]#  kubectl set image deployment nginx nginx=192.168.1.10:5000/nginx:version3
//再次升級,便於後期回滾操作
[root@master ~]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     6            6           20m   nginx        192.168.1.10:5000/nginx:version3   run=nginx
//根據顯示資訊可以看出已經升級成功

2)回滾

[root@master v3]# kubectl rollout undo deployment nginx
//對nginx資源進行回滾操作
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   6/6     4            6           22m   nginx        192.168.1.10:5000/nginx:version2   run=nginx
//從查詢結果中可以檢視已經回滾到上一個版本
[root@master v3]# kubectl rollout undo deployment nginx
[root@master v3]# kubectl get deployments. nginx -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                            SELECTOR
nginx   5/6     6            5           53m   nginx        192.168.1.10:5000/nginx:version3   run=nginx
//再次執行回滾操作,發現又回到版本3

由此可以看出在k8s叢集中版本的升級、回滾操作與docker swarm中差不多一致!
但是在k8s中回滾操作可以通過回滾到指定的版本,在以後的博文中會介紹到!