1. 程式人生 > 其它 >K8S的學習之旅-基礎知識

K8S的學習之旅-基礎知識

技術標籤:kubernetesdocker

K8S的學習之旅-基礎知識

使用minikube建立叢集

  • 啟動docker後,啟動minikube
C:\Users\Caisi>minikube start
* Microsoft Windows 10 Education 10.0.18363 Build 18363 上的 minikube v1.16.0
* 根據現有的配置檔案使用 docker 驅動程式
* Starting control plane node minikube in cluster minikube
* Restarting existing docker container for "minikube" ...
! This container is having trouble accessing https://k8s.gcr.io
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* 正在 Docker 20.10.0 中準備 Kubernetes v1.20.0…
* Verifying Kubernetes components...
* Enabled addons: storage-provisioner, default-storageclass, dashboard
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
  • 檢視叢集詳情
C:\Users\Caisi>kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:55000
KubeDNS is running at https://127.0.0.1:55000/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  • 檢視結點
C:\Users\Caisi>kubectl get nodes
NAME       STATUS   ROLES                  AGE    VERSION
minikube   Ready    control-plane,master   4d1h   v1.20.0

部署應用

  • 什麼是deployments
  1. 應用高可用。deployment提供了一種自我修復機制來解決機器故障維護問題
  2. deployment就像是Hadoop的zookeeper一樣,監控各個應用,如果某個節點宕掉了,deployment將在叢集的另外一個節點上部署。這就是想要刪除應用必須先刪除deployment的應用,否則節點的應用被刪除後,deployment將啟動故障修復應用。
  • 建立deployment
C:\Users\Caisi>kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created
# 檢視deployments
C:\Users\Caisi>kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube        4/4     4            4           3d23h
kubernetes-bootcamp   0/1     1            0           2m29s
# 檢視pods,不出意外,還是拉取失敗了
C:\Users\Caisi>kubectl get pods
NAME                                   READY   STATUS             RESTARTS   AGE
hello-minikube-8947b65df-2n7x9         1/1     Running            2          3d18h
hello-minikube-8947b65df-g78l7         1/1     Running            3          3d23h
hello-minikube-8947b65df-ptzbp         1/1     Running            2          3d17h
hello-minikube-8947b65df-ql5vm         1/1     Running            2          3d17h
kubernetes-bootcamp-57978f5f5d-pwvs7   0/1     ImagePullBackOff   0          2m11s
# 檢視pods詳情
C:\Users\Caisi>kubectl describe pods kubernetes-bootcamp-57978f5f5d-pwvs7
Normal   Pulling    2m35s (x4 over 4m41s)  kubelet            Pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
Warning  Failed     2m20s (x4 over 4m25s)  kubelet            Failed to pull image "gcr.io/google-samples/kubernetes-bootcamp:v1": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Warning  Failed     2m20s (x4 over 4m25s)  kubelet            Error: ErrImagePull
Normal   BackOff    111s (x6 over 4m25s)   kubelet            Back-off pulling image "gcr.io/google-samples/kubernetes-bootcamp:v1"
Warning  Failed     97s (x7 over 4m25s)    kubelet            Error: ImagePullBackOff

# 刪除deployments和pods,換阿里雲的kubernetes-bootcamp映象

阿里雲的kubernetes-bootcamp線上映象

# 這裡的映象可以是本地的docker映象,也可以是遠端的docker hub上的映象,也可以是線上的url映象
C:\Users\Caisi>kubectl create deployment kubernetes-bootcamp --image=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created

C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS              RESTARTS   AGE
hello-minikube-8947b65df-2n7x9        1/1     Running             2          3d18h
hello-minikube-8947b65df-g78l7        1/1     Running             3          4d
hello-minikube-8947b65df-ptzbp        1/1     Running             2          3d18h
hello-minikube-8947b65df-ql5vm        1/1     Running             2          3d18h
kubernetes-bootcamp-ccd8cdbf6-ftz2n   0/1     ContainerCreating   0          5s

C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
hello-minikube-8947b65df-2n7x9        1/1     Running   2          3d18h
hello-minikube-8947b65df-g78l7        1/1     Running   3          4d
hello-minikube-8947b65df-ptzbp        1/1     Running   2          3d18h
hello-minikube-8947b65df-ql5vm        1/1     Running   2          3d18h
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          13m

檢視部署的程式

  1. 首先需要明確一點的是剛剛建立的kubernetes-bootcamp只能進行內部之間的訪問,也可以通過kubectl API進行訪問。
  2. 下面將開啟一個代理來讓外部可以進行訪問。
  • 開啟代理
# 注意:保持此視窗
C:\Users\Caisi>kubectl proxy
Starting to serve on 127.0.0.1:8001
  • 通過API查詢版本
C:\Users\Caisi>curl http://localhost:8001/version
{
  "major": "1",
  "minor": "20",
  "gitVersion": "v1.20.0",
  "gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38",
  "gitTreeState": "clean",
  "buildDate": "2020-12-08T17:51:19Z",
  "goVersion": "go1.15.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}
  • 獲取pod名稱,並儲存到環境變數中
# 注意:這裡在Windows下要使用powershell工具
PS C:\Users\Caisi> $env:POD_NAME=kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{end}}'

PS C:\Users\Caisi> $env:POD_NAME
kubernetes-bootcamp-ccd8cdbf6-ftz2n

C:\Users\Caisi> kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          47m

pod和工作節點

什麼是pod?

  1. Pod是kubernetes抽象出來的,表示一組一個或多個應用程式容器,以及一些容器的一些共享資源。如,共享儲存、網路IP、執行資訊。
  2. Pod是kubernetes平臺上的原子單元。當建立deployment是首先會在其中建立包含容器的Pod,而不是直接建立容器。

什麼是工作節點

  • 通常一個pod總是執行在工作節點上。而工作節點又由主節點管理。

檢視應用資訊

  • 檢視Pod
C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          97m
  • 檢視Pod詳情
C:\Users\Caisi>kubectl describe pods
Name:         kubernetes-bootcamp-ccd8cdbf6-ftz2n
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Thu, 21 Jan 2021 11:19:41 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=ccd8cdbf6
Annotations:  <none>
Status:       Running
IP:           172.17.0.9
IPs:
  IP:           172.17.0.9
Controlled By:  ReplicaSet/kubernetes-bootcamp-ccd8cdbf6
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://6f05bd5069e740c331f5d65ebb770745d7f91919733dacaf81e434563308c367
    Image:          registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://registry.cn-beijing.aliyuncs.com/typ/[email protected]:34e5a47d302ee20039e5f0eb1e2f49785dafee3d97cac704befba6c1c7c938fc
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 21 Jan 2021 11:20:13 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-47bf2 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-47bf2:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-47bf2
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
  • 使用curl檢視應用輸出
# 這裡需要開啟代理(如果您已經關閉,重新開啟:kubectl proxy)

# 這裡直接使用kubernetes-bootcamp-ccd8cdbf6-ftz2n的預設80埠無法訪問,在GitHub issue上看到可以用8080埠實現
C:\Users\Caisi>curl http://localhost:8001/api/v1/namespaces/default/pods/kubernetes-bootcamp-ccd8cdbf6-ftz2n:8080/proxy/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-ccd8cdbf6-ftz2n | v=1

Issue with k8s.io/docs/tutorials/kubernetes-basics/explore/explore-interactive/#18079

  • 檢視日誌
# 這裡使用了上一節的環境變數,也可以直接用kubernetes-bootcamp-ccd8cdbf6-ftz2n替換
PS C:\Users\Caisi> kubectl logs $env:POD_NAME
Kubernetes Bootcamp App Started At: 2021-01-21T03:20:14.032Z | Running On:  kubernetes-bootcamp-ccd8cdbf6-ftz2n

Running On: kubernetes-bootcamp-ccd8cdbf6-ftz2n | Total Requests: 1 | App Uptime: 7002.931 seconds | Log Time: 2021-01-21T05:16:56.963Z
  • 列出Pod的所有環境變數
PS C:\Users\Caisi> kubectl exec $env:POD_NAME env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-ccd8cdbf6-ftz2n
HELLO_MINIKUBE_SERVICE_HOST=10.102.25.156
HELLO_MINIKUBE_PORT_8080_TCP=tcp://10.102.25.156:8080
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HELLO_MINIKUBE_SERVICE_PORT=8080
HELLO_MINIKUBE_PORT_8080_TCP_PROTO=tcp
HELLO_MINIKUBE_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP_PORT=443
HELLO_MINIKUBE_PORT=tcp://10.102.25.156:8080
HELLO_MINIKUBE_PORT_8080_TCP_ADDR=10.102.25.156
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
  • 開啟一個bash會話,相當於進入虛擬機器的shell中
PS C:\Users\Caisi> kubectl exec -ti $env:POD_NAME bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[email protected]:/#
  • 檢視Node.js應用程式碼
[email protected]:/# cat server.js
var http = require('http');
var requests=0;
var podname= process.env.HOSTNAME;
var startTime;
var host;
var handleRequest = function(request, response) {
  response.setHeader('Content-Type', 'text/plain');
  response.writeHead(200);
  response.write("Hello Kubernetes bootcamp! | Running on: ");
  response.write(host);
  response.end(" | v=1\n");
  console.log("Running On:" ,host, "| Total Requests:", ++requests,"| App Uptime:", (new Date() - startTime)/1000 , "seconds", "| Log Time:",new Date());
}
var www = http.createServer(handleRequest);
www.listen(8080,function () {
    startTime = new Date();;
    host = process.env.HOSTNAME;
    console.log ("Kubernetes Bootcamp App Started At:",startTime, "| Running On: " ,host, "\n" );
});
  • 檢視Node.js應用是否在執行
# 從這裡也可以看出pod內部對應的埠為8080
[email protected]:/# curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-ccd8cdbf6-ftz2n | v=1
  • 退出bash使用:exit。這一點與docker進入容器相似。

使用services公開暴露應用

什麼是service?

  • kubernetes中的service是一種抽象概念,它定義Pod的邏輯集和訪問Pod的協議。
  • service是為了解決工作節點掛掉後Pod也會消亡的問題,以保證程式正常執行。

service的暴露方式

  1. clusterIP(預設):在叢集的內部IP上公開service。這種方式只能從叢集內訪問。
  2. NodePort:使用NAT在叢集中每個選定Node的相同埠上公開service。這種方式可以使用:從叢集外部訪問service。
  3. LoadBalancer:建立一個外部負載均衡器,為service分配一個固定的外部IP。
  4. externalName:通過返回帶有該名稱的CNAME記錄,使用任意名稱公開Service。不使用代理。

service和label

  • service匹配一組pod是使用label和selector,label是附加在物件上的鍵/值對。

暴露應用

  • 使用expose命令暴露NodePort型別
C:\Users\Caisi>kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed

C:\Users\Caisi>kubectl get services
NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1      <none>        443/TCP          4d5h
kubernetes-bootcamp   NodePort    10.108.3.185   <none>        8080:31491/TCP   20s
  • 使用curl從外部訪問程式(這裡又有一個docker desktop的坑了)
C:\Users\Caisi>curl 127.0.0.1:31491
curl: (7) Failed to connect to 127.0.0.1 port 31491: Connection refused

Failed to connect to 127.0.0.1 port 50502: Connection refused #8651:
NodePort deployments don’t work with Docker Desktop, unfortunately. Only with Docker Engine.

沒有找到合適的解決方法,下面換tunnel暴露應用

# 開啟tunnel,儲存視窗狀態
PS C:\Users\Caisi> minikube tunnel
* Starting tunnel for service kubernetes-bootcamp.
  • 使用LoadBalancer暴露
C:\Users\Caisi>
service/kubernetes-bootcamp exposed

C:\Users\Caisi>kubectl get svc
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          4d6h
kubernetes-bootcamp   LoadBalancer   10.96.125.12   127.0.0.1     8080:30530/TCP   21s

C:\Users\Caisi>curl 127.0.0.1:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-ccd8cdbf6-ftz2n | v=1

# 如果沒有開啟tunnel,EXTERNAL-IP為pending等待
C:\Users\Caisi>kubectl get svc
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          4d6h
kubernetes-bootcamp   LoadBalancer   10.96.125.12   <pending>     8080:30530/TCP   14m

  1. 這種方式每個服務將獲得自己的外部IP。
  2. 這種方式有點類似與
C:\Users\Caisi>minikube service kubernetes-bootcamp --url
* Starting tunnel for service kubernetes-bootcamp.
|-----------|---------------------|-------------|------------------------|
| NAMESPACE |        NAME         | TARGET PORT |          URL           |
|-----------|---------------------|-------------|------------------------|
| default   | kubernetes-bootcamp |             | http://127.0.0.1:63528 |
|-----------|---------------------|-------------|------------------------|
http://127.0.0.1:63528 

# 另外一個視窗
C:\Users\Caisi>curl 127.0.0.1:49187
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-ccd8cdbf6-ftz2n | v=1
  • 可以使用label檢視service或pod資訊
# 這裡檢視的預設label為app=kubernetes-bootcamp
C:\Users\Caisi>kubectl describe deployment
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Thu, 21 Jan 2021 11:19:41 +0800
Labels:                 app=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-bootcamp
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-ccd8cdbf6 (1/1 replicas created)
Events:          <none>

C:\Users\Caisi>kubectl get pods -l app=kubernetes-bootcamp
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          4h43m

C:\Users\Caisi>kubectl get services -l app=kubernetes-bootcamp
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes-bootcamp   LoadBalancer   10.96.125.12   127.0.0.1     8080:30530/TCP   29m
  • 也可以新增新的標籤,以附加的方式,下面對pod新增一個標籤
# 這裡已經存在一個app的鍵了
C:\Users\Caisi>kubectl label pod kubernetes-bootcamp-ccd8cdbf6-ftz2n app=v1
error: 'app' already has a value (kubernetes-bootcamp), and --overwrite is false

C:\Users\Caisi>kubectl label pod kubernetes-bootcamp-ccd8cdbf6-ftz2n run=v1
pod/kubernetes-bootcamp-ccd8cdbf6-ftz2n labeled

C:\Users\Caisi>kubectl describe pods kubernetes-bootcamp-ccd8cdbf6-ftz2n
Name:         kubernetes-bootcamp-ccd8cdbf6-ftz2n
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Thu, 21 Jan 2021 11:19:41 +0800
Labels:       app=kubernetes-bootcamp
              pod-template-hash=ccd8cdbf6
              run=v1
Annotations:  <none>
Status:       Running
IP:           172.17.0.9
IPs:
···


C:\Users\Caisi>kubectl get pods -l run=v1
NAME                                  READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          4h51m

注:在這裡新增的標籤是pod的,所以檢視service不能使用此標籤,因為service中沒有次標籤。

  • 刪除服務
C:\Users\Caisi>kubectl get services
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          4d6h
kubernetes-bootcamp   LoadBalancer   10.96.125.12   127.0.0.1     8080:30530/TCP   44m

C:\Users\Caisi>kubectl delete service -l app=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted

C:\Users\Caisi>kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   4d6h

# 叢集外部無法訪問應用
C:\Users\Caisi>curl 127.0.0.1:8080
curl: (7) Failed to connect to 127.0.0.1 port 8080: Connection refused

# 使用kubectlAPI訪問叢集中應用正常執行
C:\Users\Caisi>kubectl exec -ti kubernetes-bootcamp-ccd8cdbf6-ftz2n curl localhost:8080
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-ccd8cdbf6-ftz2n | v=1

縮放應用

為什麼需要縮放?

deployment只建立了一個Pod,當流量增加時,就需要擴容應用程式以滿足使用者需求了。

其實際是通過改變deployment中的副本數量來實現的。

當pod數量為0時,deployment上的頗多將終止。

  • 使用scale擴充套件為四個副本
C:\Users\Caisi>kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.apps/kubernetes-bootcamp scaled

C:\Users\Caisi>kubectl get rs
NAME                            DESIRED   CURRENT   READY   AGE
kubernetes-bootcamp-ccd8cdbf6   4         4         4       5h42m

C:\Users\Caisi>kubectl get pods -o wide
NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-ccd8cdbf6-8z74q   1/1     Running   0          39s     172.17.0.2   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-ftz2n   1/1     Running   0          5h42m   172.17.0.9   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-q5mh4   1/1     Running   0          39s     172.17.0.4   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-rmjqc   1/1     Running   0          39s     172.17.0.3   minikube   <none>           <none>
  • 縮減副本為2
C:\Users\Caisi>kubectl scale deployment/kubernetes-bootcamp --replicas=2
deployment.apps/kubernetes-bootcamp scaled

C:\Users\Caisi>kubectl get service
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          4d7h
kubernetes-bootcamp   LoadBalancer   10.96.228.52   <pending>     8080:31177/TCP   4m30s

C:\Users\Caisi>kubectl get pods -o wide
NAME                                  READY   STATUS        RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-ccd8cdbf6-8xc6c   1/1     Terminating   0          9m19s   172.17.0.4   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-fp5vz   1/1     Running       0          13m     172.17.0.5   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-hkdj8   1/1     Terminating   0          9m19s   172.17.0.3   minikube   <none>           <none>
kubernetes-bootcamp-ccd8cdbf6-ksfzf   1/1     Running       0          9m19s   172.17.0.2   minikube   <none>           <none>

C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-ccd8cdbf6-8xc6c   1/1     Terminating   0          9m26s
kubernetes-bootcamp-ccd8cdbf6-fp5vz   1/1     Running       0          13m
kubernetes-bootcamp-ccd8cdbf6-hkdj8   1/1     Terminating   0          9m26s
kubernetes-bootcamp-ccd8cdbf6-ksfzf   1/1     Running       0          9m26s

更新應用,滾動更新

  • 滾動更新允許應用程式從一個環境提升到另一個環境、回滾到以前的版本、持續整合和持續交付。

  • 更新到v2

C:\Users\Caisi>kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.apps/kubernetes-bootcamp image updated
# 容器建立中
C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS              RESTARTS   AGE
kubernetes-bootcamp-769746fd4-zbvvs   0/1     ContainerCreating   0          21s
kubernetes-bootcamp-ccd8cdbf6-fp5vz   1/1     Running             0          22m
kubernetes-bootcamp-ccd8cdbf6-ksfzf   1/1     Running             0          18m
# 建立成功後,就得pod將終止
C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-769746fd4-qf22h   1/1     Running       0          27s
kubernetes-bootcamp-769746fd4-zbvvs   1/1     Running       0          75s
kubernetes-bootcamp-ccd8cdbf6-fp5vz   1/1     Terminating   0          23m
kubernetes-bootcamp-ccd8cdbf6-ksfzf   1/1     Terminating   0          19m
# 確認升級成功
C:\Users\Caisi>kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out

# pod的image為v2版本
C:\Users\Caisi>kubectl describe pods
···
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://b46d0b7c1059485c241d674a9d646cd923aa55619ac30a7ee3e377ec85503b1a
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
Controlled By:  ReplicaSet/kubernetes-bootcamp-769746fd4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://6bd647432eaab9573c6d68210a79999804f452f50e7ce8abdd6192193840ad1c
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
  • 升級失敗
# 這裡升級到v10版本
C:\Users\Caisi>kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10
deployment.apps/kubernetes-bootcamp image updated

C:\Users\Caisi>kubectl get deployment
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   2/2     1            2           33m
# 映象拉取失敗
C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS         RESTARTS   AGE
kubernetes-bootcamp-769746fd4-qf22h   1/1     Running        0          10m
kubernetes-bootcamp-769746fd4-zbvvs   1/1     Running        0          11m
kubernetes-bootcamp-799d5964b-mzvcg   0/1     ErrImagePull   0          37s

C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS             RESTARTS   AGE
kubernetes-bootcamp-769746fd4-qf22h   1/1     Running            0          10m
kubernetes-bootcamp-769746fd4-zbvvs   1/1     Running            0          11m
kubernetes-bootcamp-799d5964b-mzvcg   0/1     ImagePullBackOff   0          47s
# 有一個v10的image版本拉取失敗
C:\Users\Caisi>kubectl describe pods
···
Controlled By:  ReplicaSet/kubernetes-bootcamp-769746fd4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://b46d0b7c1059485c241d674a9d646cd923aa55619ac30a7ee3e377ec85503b1a
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
Controlled By:  ReplicaSet/kubernetes-bootcamp-769746fd4
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://6bd647432eaab9573c6d68210a79999804f452f50e7ce8abdd6192193840ad1c
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
Controlled By:  ReplicaSet/kubernetes-bootcamp-799d5964b
Containers:
  kubernetes-bootcamp:
    Container ID:
    Image:          registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10
    Image ID:
    Port:           <none>
···
Normal   Scheduled  65s                default-scheduler  Successfully assigned default/kubernetes-bootcamp-799d5964b-mzvcg to minikube
Normal   Pulling    21s (x3 over 64s)  kubelet            Pulling image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10"
Warning  Failed     20s (x3 over 63s)  kubelet            Failed to pull image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10": rpc error: code = Unknown desc = Error response from daemon: manifest for registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10 not found: manifest unknown: manifest unknown
Warning  Failed     20s (x3 over 63s)  kubelet            Error: ErrImagePull
Normal   BackOff    5s (x3 over 62s)   kubelet            Back-off pulling image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10"
Warning  Failed     5s (x3 over 62s)   kubelet            Error: ImagePullBackOff
  • 回滾
# 使用undo進行回滾
C:\Users\Caisi>kubectl rollout undo deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp rolled back

C:\Users\Caisi>kubectl get pods
NAME                                  READY   STATUS        RESTARTS   AGE
kubernetes-bootcamp-769746fd4-qf22h   1/1     Running       0          13m
kubernetes-bootcamp-769746fd4-zbvvs   1/1     Running       0          14m
kubernetes-bootcamp-799d5964b-mzvcg   0/1     Terminating   0          3m8s
# 這裡v10版本已經沒有了
C:\Users\Caisi>kubectl describe pods
···
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://b46d0b7c1059485c241d674a9d646cd923aa55619ac30a7ee3e377ec85503b1a
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://6bd647432eaab9573c6d68210a79999804f452f50e7ce8abdd6192193840ad1c
    Image:          jocatalin/kubernetes-bootcamp:v2
    Image ID:       docker-pullable://jocatalin/[email protected]:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
    Port:           <none>
    Host Port:      <none>
···
Pod 'kubernetes-bootcamp-799d5964b-mzvcg': error 'pods "kubernetes-bootcamp-799d5964b-mzvcg" not found', but found events.
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  3m20s                 default-scheduler  Successfully assigned default/kubernetes-bootcamp-799d5964b-mzvcg to minikube
  Normal   Pulling    114s (x4 over 3m19s)  kubelet            Pulling image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10"
  Warning  Failed     113s (x4 over 3m18s)  kubelet            Failed to pull image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10": rpc error: code = Unknown desc = Error response from daemon: manifest for registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10 not found: manifest unknown: manifest unknown
  Warning  Failed     113s (x4 over 3m18s)  kubelet            Error: ErrImagePull
  Normal   BackOff    90s (x6 over 3m17s)   kubelet            Back-off pulling image "registry.cn-beijing.aliyuncs.com/typ/kubernetes-bootcamp:v10"
  Warning  Failed     76s (x7 over 3m17s)   kubelet            Error: ImagePullBackOff

總結

  1. 這一節學習了建立minikube叢集、部署Node.js應用、一些基本的檢視pod的命令、公開暴露應用、縮放應用、更新與回滾應用。
  2. 值得注意的是docker desktop不支援service的NodePort模式這個坑,不過Linux的docker engine是支援的。
  3. 還有就是label的作用。
  4. 通過這次的瞭解,對deployment和pod,以及service又有了一些新的看法。