【智簡聯接,萬物互聯】華為云·云享專家董昕:Serverless和微服務下, IoT的變革蓄勢待發
730
2025-03-31
四 命令入門
4.1 kubectl
kubectl 是 apiserver 的客戶端程序,這個客戶端程序是通過連接 master 節點上的 apiserver ,實現各種 k8s 對象的增刪改查等基本操作,在 k8s 可被管理的對象有很多個
基本命令 (初級): create 從文件或標準輸入創建資源 expose 獲取一個復制控制器, 服務, 部署或者暴露一個 POD 將其作為新的 Kubernetes 服務公開 run 創建并運行特定的鏡像, 創建使用 deployment 或 job 管理的容器 set 設置對象的特定功能, 例如發布, 每次去set 不用的image tag 基本命令 (中級): explain 文檔或者資源, 可以用來查看資源清單寫法 get 顯示一個或多個資源 edit 編輯服務器上的資源 delete 按文件名, 標準輸入, 資源和名稱或資源和標簽選擇器刪除資源 部署命令: rollout 管理資源的部署 scale 為部署設置新大小, ReplicaSet, Replication Controller, Job autoscale 自動擴展一個部署, ReplicaSet, 或者 ReplicationController 群集管理命令: certificate 修改證書資源 cluster-info 顯示群集信息 top 顯示資源(CPU / 內存/ 存儲)使用情況, 需要安裝metrics-server cordon 將節點標記為不可調度 uncordon 將節點標記為可調度 drain 設定 node 進入維護模式 taint 更新一個或多個節點上的污點 故障排除和調試命令: describe 顯示特定資源或資源組的詳細信息 logs 在容器中打印容器的日志 attach 附加到正在運行的容器 exec 在容器中執行命令 port-forward 將一個或多個本地端口轉發到 pod proxy 運行代理到 Kubernetes API 服務器 cp 將文件和目錄復制到容器, 和從容器復制, 跨容器復制文件 auth 檢查授權 高級命令: diff 針對將要應用的版本的 Diff 實時版本 apply 通過文件名或標準輸入將配置應用于資源 patch 使用策略合并補丁更新資源的字段 replace 用文件名或標準輸入替換資源 wait 實驗階段命令: 在一個或多個資源上等待特定條件, 定義一個觸發器 convert 在不同的API版本之間轉換配置文件 kustomize 從目錄或遠程 URL 構建 kustomization 目標 設置命令: label 更新資源上的標簽 annotate 更新資源上的注釋 completion 命令補全相關功能 其他命令: api-resources 在服務器上打印支持的API資源 api-versions 以 "group/version" 的形式在服務器上打印支持的API版本 config 修改 kubeconfig 文件 plugin 提供與插件交互的實用程序 version 打印客戶端和服務器版本信息
4.2 run
創建控制器并運行鏡像
創建一個名為 nginx 的 deployment,鏡像為 nginx:latest ,如果不知道副本數,則為1
kubectl run nginx --image=nginx:latest
指定運行的 POD 數量
kubectl run nginx --image=nginx --replicas=5 # 啟動 5 個 POD
不運行容器的默認命令,使用自定義的指令
kubectl run nginx --image=nginx --command --
運行一個周期任務
kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
指定控制器名稱運行 nginx 指定端口和副本數量,以測試模式運行
指定參數 dry-run 可以用來驗證寫的 yaml 文件是否存在異常,不會真正執行
kubectl run nginx-deploy --image=nginx --port=80 --replicas=1 --dry-run=true
查看容器是否運行
kubectl get deployment
查看被調度的主機
kubectl get pod -o wide
通過 ip 地址直接訪問,由于所有的 POD 處于同一個網絡中,所以在集群內部是可以訪問的
curl 10.244.2.2
假如現在刪除剛創建的這個 POD,那么副本控制器會自動在其他的 node 上重建這個 POD
kubectl delete pods nginx-deploy-5c9b546997-jsmk6
再次執行查看,會發現容器已經被調度到其他節點上運行了
kubectl get pod -o wide
4.3 expose
現在存在一個問題,就是 POD 的 IP 地址可能隨時發生變動,所以不能作為訪問的入口,那么就需要 service 來代理 POD 來創建一個固定的端點。
創建一個 service 來暴露一個服務
在控制器 nginx-deploy 上創建名字為 nginx 的 service , 它工作端口為 80, 代理的后端容器端口 80, 協議為 TCP
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
可以看到剛剛創建的名字為 nginx 的 service ,現在就可以在集群內用 service 的地址來訪問了, 如果外部訪問可以使用 NodePort 模式
kubectl get service
刪除一個任務
kubectl delete deployment nginx-deploy
4.4 cp
拷貝宿主機文件或目錄到pod中,??要求tar二進制文件已經存在容器中,不然拷貝會失敗
kubectl cp /tmp/foo_dir
4.5 port-forward
端口轉發,將svc地址或著pods端口利用kubelet映射到宿主機上,將訪問宿主機的8888端口的所有流量轉發到8111svc
kubectl port-forward --address 0.0.0.0 service/nginx 8888 8111
轉發pods端口,將訪問宿主機的8888端口流量轉發到pod的5000端口
kubectl port-forward pod/mypod 8888:5000
4.6 coredns
service 提供了對 pod 的固定訪問端點,但是 service 本身的變動我們無法知曉,需要 coredns 對 service 做域名解析。
查看 coredns 運行狀態
kubectl get pods -n kube-system -o wide |grep coredns
查看各個 kube-system 命名空間運行的服務,可以看到 kube-dns 運行的 IP 地址
kubectl get service -n kube-system
使用 kube-dns 來解析 nginx 這個 service 的地址就可以正常解析了
dig -t A nginx.default.svc.cluster.local @10.96.0.10
創建一個訪問 nginx 客戶端容器,并進入交互式模式,這個容器默認的 dns 服務器就是 kube-dns 所在的服務器
kubectl run client --image=busybox --replicas=1 -it --restart=Never
/ # cat /etc/resolv.conf nameserver 10.96.0.10 # kube-dns 地址 search default.svc.cluster.local svc.cluster.local cluster.local # 默認的解析搜索域 options ndots:5
在 busybox 這個容器中請求 nginx 這個域名的 service ,能夠正常訪問
wget -O - -q http://nginx:80/
4.7 模擬 POD 被刪除
現在我們刪除 service 后端的 POD ,副本控制器會自動創建新的 POD,而 service 則會自動指向新創建的 POD
kubectl delete pods nginx-deploy-5c9b546997-4w24n
查看由副本控制器自動創建的 POD
kubectl get pods
在 busybox 這個容器中請求 nginx 這個域名的 service ,訪問沒有受到影響
wget -O - -q http://nginx:80/
4.8 模擬 service 被刪除
當我們刪除 service 并且重新建立一個 service 再次查看 service 的地址已經發生變化了
kubectl delete service nginx
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
kubectl get service
在 busybox 這個容器中請求 nginx 這個域名的 service ,訪問沒有仍然沒有受到影響
wget -O - -q http://nginx:80/
4.9 labels
為什么 Pod 被刪除后,servic 仍然能夠正確的調度到新的 POD 上,這就是 k8s 的 labels 這個機制來保證的。
能夠使用標簽機制不止有 pod、在 k8s 中很多對象都可以使用標簽,例如:node、service
查看 service 的詳細信息,會發現標簽選擇器
kubectl describe service nginx
Name: nginx Namespace: default Labels: run=nginx-deploy Annotations:
查看 POD 的標簽,會看到擁有 run=nginx-deploy 標簽的容器,而人為刪除一個 POD 后,副本控制器創建的副本上的標簽不會變化,所以標簽又被 service 關聯。
kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS client 1/1 Running 0 21m run=client nginx-deploy-5c9b546997-kh88w 1/1 Running 0 8m37s pod-template-hash=5c9b546997,run=nginx-deploy
查看 POD 的詳細信息,也可以查看到 POD 的詳細信息
kubectl describe deployment nginx-deploy
根據標簽過濾,使用 -l 來指定標簽名稱或同時過濾其值
kubectl get pods --show-labels -l run=nginx-deploy
標簽選擇器集中運算
關系與: KEY,KEY KEY=VALUE2,KEY=VALUE2 # -l run,app 等值關系:KEY = VALUE KEY != VALUE # -l run=nginx-deploy,app!=myapp 集合關系:KYE in|not in (VALUE1,VALUE2) # -l "release in (canary,bata,alpha)"
顯示指定的標簽的值,下面顯示了兩個標簽
kubectl get pods --show-labels -L run,pod-template-hash
為指定的 POD 打標簽,為 client 這個 POD 打上一個 release 標簽,其值為 canary
kubectl label pods client release=canary
修改 POD 的標簽,使用 --overwrite 進行修改原有標簽
kubectl label pods client release=stable --overwrite
刪除指定的 nodes 上的標簽,使用標簽名稱加 - 符號
kubectl label nodes node2 disktype-
許多資源支持內嵌字段來定義其使用的標簽選擇器,例如 service 關聯 pod 時候:
matchLabels: 直接給定鍵值 matchExpressions: 基于給定的表達式來定義使用標簽選擇器: {key:"KEY",operator:"OPERATOR",value:[VAL1,VAL2,...]} 使用 key 與 value 進行 operator 運算, 復合條件的才被選擇 操作符: In, NotIn: 其 value 列表必須有值 Exists, NotExists: 其 value 必須為空
k8s 中很多對象都可以打標簽,例如給 nodes 打一個標記,隨后在添加資源時候就可以讓資源對節點有傾向性了
kubectl label nodes node2 disktype=ssd
kubectl get nodes --show-labels
4.10 動態擴容
擴容一個集群的的 POD,下面命令表示修改 deployment 控制器下的 nginx-deply 容器的副本數量為2
kubectl scale --replicas=5 deployment nginx-deploy
4.11 滾動升級
更換 nginx-deploy 這個控制器下的 nginx-deploy 容器鏡像為 ikubernetes/myapp:v2
kubectl set image deployment nginx-deploy nginx-deploy=ikubernetes/myapp:v2
查看更新的過程,直到 5 個容器中運行的鏡像全部更新完
kubectl rollout status deployment nginx-deploy
[root@node1 ~]# kubectl rollout status deployment nginx-deploy Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated... Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "nginx-deploy" rollout to finish: 4 of 5 updated replicas are available... deployment "nginx-deploy" successfully rolled out
回滾操作,不指定任何的鏡像則為上一個版本的鏡像
kubectl rollout undo deployment nginx-deploy
如果防止更新過程中被調度,那么就需要學習就緒性檢測才能實現
4.12 集群外訪問
修改 service 的網絡類型為 NodePort
kubectl edit service nginx
type: ClusterIP -> type: NodePort
查看 service 的信息,發現多了一個 30982 端口
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1
在集群外部使用任意的 node IP 地址 + 端口來訪問
http://172.16.100.101:30982/
4.13 排查日志
查看一個 pod 的某個容器的運行日志
kubectl logs pod-demo busybox
4.14 連入 POD 容器
kubectl exec -it pod-demo -c myapp -- /bin/sh
其他
自己將手記發在:https://github.com/redhatxl/awesome-kubernetes-notes
歡迎一鍵三連。
Kubernetes Nginx
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。