K8S的學習之旅-基礎知識
阿新 • • 發佈:2021-01-22
技術標籤: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
- 應用高可用。deployment提供了一種自我修復機制來解決機器故障維護問題
- 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
檢視部署的程式
- 首先需要明確一點的是剛剛建立的kubernetes-bootcamp只能進行內部之間的訪問,也可以通過kubectl API進行訪問。
- 下面將開啟一個代理來讓外部可以進行訪問。
- 開啟代理
# 注意:保持此視窗
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?
- Pod是kubernetes抽象出來的,表示一組一個或多個應用程式容器,以及一些容器的一些共享資源。如,共享儲存、網路IP、執行資訊。
- 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的暴露方式
- clusterIP(預設):在叢集的內部IP上公開service。這種方式只能從叢集內訪問。
- NodePort:使用NAT在叢集中每個選定Node的相同埠上公開service。這種方式可以使用:從叢集外部訪問service。
- LoadBalancer:建立一個外部負載均衡器,為service分配一個固定的外部IP。
- 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
- 這種方式每個服務將獲得自己的外部IP。
- 這種方式有點類似與
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
總結
- 這一節學習了建立minikube叢集、部署Node.js應用、一些基本的檢視pod的命令、公開暴露應用、縮放應用、更新與回滾應用。
- 值得注意的是docker desktop不支援service的NodePort模式這個坑,不過Linux的docker engine是支援的。
- 還有就是label的作用。
- 通過這次的瞭解,對deployment和pod,以及service又有了一些新的看法。