Kubernetes手記(4)- 命令入門

      網友投稿 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 :/tmp/bar_dir [root@master ~]# kubectl cp flannel.tar nginx-58cd4d4f44-8pwb7:/usr/share/nginx/html [root@master ~]# kubectl cp mainfile/ nginx-58cd4d4f44-8pwb7:/usr/share/nginx/html [root@master ~]# kubectl exec -it nginx-58cd4d4f44-8pwb7 -- /bin/bash root@nginx-58cd4d4f44-8pwb7:/# ls -l /usr/share/nginx/html/ total 54108 -rw-r--r-- 1 root root 537 Jul 11 2017 50x.html -rw-r--r-- 1 root root 355 May 27 06:47 dashboard-adminuser.yaml -rw------- 1 root root 55390720 May 27 01:49 flannel.tar -rw-r--r-- 1 root root 612 Jul 11 2017 index.html drwxr-xr-x 4 root root 51 Aug 17 14:16 mainfile

      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 ,能夠正常訪問

      Kubernetes手記(4)- 命令入門

      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: Selector: run=nginx-deploy # 這個選擇器會自動選中 run 標簽,且值為 nginx-deploy 的 POD Type: ClusterIP IP: 10.101.149.4 Port: 80/TCP TargetPort: 80/TCP Endpoints: 10.244.2.4:80 # 當 service 的后端,當 POD 發生變動則立即會更新 Session Affinity: None Events:

      查看 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 443/TCP 15h nginx NodePort 10.105.27.11 80:30982/TCP 42m

      在集群外部使用任意的 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小時內刪除侵權內容。

      上一篇:excel表格數據加減法運算的教程(excel表格怎么加減法)
      下一篇:Py之matplotlib.pyplot:matplotlib.pyplot的plt.legend函數的簡介、使用方法之詳細攻略
      相關文章
      99久久婷婷国产综合亚洲| 中文字幕精品亚洲无线码一区| 亚洲成AⅤ人影院在线观看| 456亚洲人成在线播放网站| 亚洲精品456在线播放| 亚洲国产精品SSS在线观看AV| 国产精品亚洲产品一区二区三区| 亚洲福利在线播放| 亚洲精品A在线观看| 亚洲一级黄色视频| 综合亚洲伊人午夜网| 在线a亚洲v天堂网2019无码| 亚洲自偷自偷在线制服| 亚洲中文字幕无码爆乳av中文| 亚洲第一区在线观看| 亚洲中文字幕无码爆乳av中文| 久久亚洲国产成人影院网站| 久久久久亚洲AV成人网| 亚洲日本va中文字幕久久| 亚洲级αV无码毛片久久精品| 亚洲女久久久噜噜噜熟女| 亚洲大尺度无码无码专区| 亚洲成在人天堂一区二区| 亚洲黄色片在线观看| 亚洲人色大成年网站在线观看| 亚洲精品二三区伊人久久| 欧洲 亚洲 国产图片综合| 亚洲av无码专区在线电影| 国产成人综合亚洲绿色| 亚洲日本韩国在线| 亚洲国产综合无码一区| 亚洲综合在线视频| 亚洲人成网站18禁止久久影院| 亚洲色中文字幕在线播放| 无码天堂va亚洲va在线va| 在线亚洲精品福利网址导航| 亚洲大成色www永久网站| 亚洲成a人片在线观看中文app| 亚洲一级毛片中文字幕| 亚洲av永久无码天堂网| 久久久久国产亚洲AV麻豆|