1. 程式人生 > >k8s技術--Kubernetes叢集kubectl命令的常見使用方法

k8s技術--Kubernetes叢集kubectl命令的常見使用方法

簡介:kubectl是一個命令列介面,用於運行鍼對Kubernetes群集的命令。 語法: kubectl [command] [TYPE] [NAME] [flags]
  • command:指定您希望對一個或多個資源執行的操作,例如建立,獲取,描述,刪除。
  • TYPE:指定資源型別。 資源型別區分大小寫,可以使用單數,複數或縮寫形式。
  • NAME:指定資源的名稱。 名稱區分大小寫。 如果省略名稱,則會顯示所有資源的詳細資訊,例如$ kubectl get pod。
  • flags:指定可選標誌。 例如,可以使用-s或--server標誌來指定Kubernetes API伺服器的地址和埠。

1、顯示Pod的更多資訊

kubectl get pod <pod-name> -o wide 以yaml格式顯示Pod的詳細資訊 kubectl get pod <pod-name> -o yaml  

2、建立資源物件

根據yaml配置檔案一次性建立service和rc kubectl create -f my-service.yaml -f my-rc.yaml 根據<directory>目錄下所有.yaml、.yml、.json檔案的定義進行建立操作 kubectl create -f <directory>  

3、檢視資源物件

檢視所有Pod列表 kubectl get pods  

4、檢視rc和service列表

kubectl get rc,service  

5、描述資源物件

顯示Node的詳細資訊 kubectl describe nodes <node-name> 顯示Pod的詳細資訊 kubectl describe pods/<pod-name> 顯示由RC管理的Pod的資訊 kubectl describe pods <rc-name>  

6、刪除資源物件

基於Pod.yaml定義的名稱刪除Pod kubectl delete -f pod.yaml 刪除所有包含某個label的Pod和service kubectl delete pods,services -l name=<label-name> 刪除所有Pod kubectl delete pods --all  

7、執行容器的命令

執行Pod的data命令,預設是用Pod中的第一個容器執行 kubectl exec <pod-name> data 指定Pod中某個容器執行data命令 kubectl exec <pod-name> -c <container-name> data 通過bash獲得Pod中某個容器的TTY,相當於登入容器 kubectl exec -it <pod-name> -c <container-name> /bin/bash  

8、使用一些複雜過濾條件檢視特定的資源物件

# 根據重啟次數排序列出 pod $ kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'   # 獲取所有具有 app=cassandra 的 pod 中的 version 標籤 $ kubectl get pods --selector=app=cassandra rc -o  jsonpath='{.items[*].metadata.labels.version}'   # 獲取所有節點的 ExternalIP $ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'   # 檢視哪些節點已就緒 $ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"  

9、Pod的擴容縮容、滾動升級以及更新資源配置

執行擴容縮容Pod的操作 kubectl scale rc redis --replicas=3 我們需要確認的是在rc配置檔案中定義的replicas數量,當我們執行上述命令的結果大於replicas的數量時,則我們執行的命令相當於擴容操作,反之相反,可以理解為我們填寫的數量是我們需要的Pod數量。需要注意的是,當我們需要進行永久性擴容時,不要忘記修改rc配置檔案中的replicas數量。   Pod的滾動升級 執行滾動升級操作 kubectl rolling-update redis -f redis-rc.update.yaml 需要注意的是當我們執行rolling-update命令前需要準備好新的RC配置檔案以及ConfigMap配置檔案,RC配置檔案中需要指定升級後需要使用的映象名稱,或者可以使用kubeclt rolling-update redis --image=redis-2.0直接指定映象名稱的方式直接升級。   # 強制替換,刪除後重新建立資源。會導致服務中斷。 $ kubectl replace --force -f ./pod.json   # 為 nginx RC 建立服務,啟用本地 80 埠連線到容器上的 8000 埠 $ kubectl expose rc nginx --port=80 --target-port=8000   # 更新單容器 pod 的映象版本(tag)到 v4 $ kubectl get pod mypod -o yaml | sed 's/ image:myimageimage:myimage:.*$/\1:v4/' | kubectl replace -f -   $ kubectl label pods my-pod new-label=awesome # 新增標籤 $ kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # 添加註解 $ kubectl autoscale deployment foo --min=2 --max=10 # 自動擴充套件 deployment “foo”  

10、檢視容器的日誌

檢視容器輸出到stdout的日誌: kubectl logs <pod-name> 跟蹤檢視容器的日誌(tail -f): kubectl logs -f <pod-name> -n <namespace> -c <container-name>  

11、Kubectl context和配置

修改kubectl命令列工具預設使用的apiServer地址、叢集CA和客戶端證書: [[email protected] ssl]# kubectl config set-cluster default-cluster --server=https://10.0.2.5:6443 --certificate-authority=/etc/kubernetes/ssl/ca.crt Cluster "default-cluster" set. [[email protected] ssl]# kubectl config set-credentials default-admin --certificate-authority=/etc/kubernetes/ssl/ca.crt --client-key=/etc/kubernetes/ssl/cs_client.key --client-certificate=/etc/kubernetes/ssl/cs_client.crt User "default-admin" set. [[email protected] ssl]# kubectl config set-context default-system --cluster=default-cluster --user=default-admin  在kubeconfig配置中新增一條名為default-system的上下文記錄 Context "default-system" created. [[email protected] ssl]# kubectl config use-context default-system     #設定預設上下文為default-system Switched to context "default-system". [[email protected] ~]# kubectl config current-context   #檢視當前的上下文 default-system   詳細如下:

建立 kubeconfig 檔案

kubeconfig 為 kubectl 的配置檔案,包含訪問 apiserver 的所有資訊,如 apiserver 地址、CA 證書和自身使用的證書;

source /opt/k8s/bin/environment.sh
# 設定叢集引數
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/cert/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kubectl.kubeconfig

# 設定客戶端認證引數 kubectl config set-credentials admin \ --client-certificate=admin.pem \ --client-key=admin-key.pem \ --embed-certs=true \ --kubeconfig=kubectl.kubeconfig # 設定上下文引數 kubectl config set-context kubernetes \ --cluster=kubernetes \ --user=admin \ --kubeconfig=kubectl.kubeconfig # 設定預設上下文 kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
  • --certificate-authority:驗證 kube-apiserver 證書的根證書;
  • --client-certificate--client-key:剛生成的 admin 證書和私鑰,連線 kube-apiserver 時使用;
  • --embed-certs=true:將 ca.pem 和 admin.pem 證書內容嵌入到生成的 kubectl.kubeconfig 檔案中(不加時,寫入的是證書檔案路徑);

分發 kubeconfig 檔案

分發到所有使用 kubectl 命令的節點:

source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
  do echo ">>> ${node_ip}" ssh [email protected]${node_ip} "mkdir -p ~/.kube" scp kubectl.kubeconfig [email protected]${node_ip}:~/.kube/config ssh [email protected]${node_ip} "mkdir -p ~/.kube" scp kubectl.kubeconfig [email protected]${node_ip}:~/.kube/config done
  • 儲存到使用者的 ~/.kube/config 檔案;
檢視kubectl context配置資訊: # kubectl config view    apiVersion: v1 clusters: - cluster:     certificate-authority: /etc/kubernetes/ssl/ca.crt     server: https://10.0.2.5:6443   name: default-cluster contexts: - context:     cluster: default-cluster     user: default-admin   name: default-system current-context: default-system kind: Config preferences: {} users: - name: default-admin   user:     client-certificate: /etc/kubernetes/ssl/cs_client.crt     client-key: /etc/kubernetes/ssl/cs_client.key 顯示當前的上下文: [[email protected] ~]# kubectl config current-context default-system  

12、線上編輯資源

# kubectl edit svc/mysql  #可以直接對各種資源物件進行線上編輯變更  

13、節點和叢集資訊查詢或排程方法

$ kubectl cordon my-node # 標記 my-node 不可排程 $ kubectl drain my-node # 清空 my-node 以待維護 $ kubectl uncordon my-node # 標記 my-node 可排程 $ kubectl top node my-node # 顯示 my-node 的指標度量 $ kubectl cluster-info # 顯示 master 和服務的地址 $ kubectl cluster-info dump # 將當前叢集狀態輸出到 stdout $ kubectl cluster-info dump --output-directory=/path/to/cluster-state # 將當前叢集狀態輸出到 /path/to/cluster-state # 如果該鍵和影響的汙點(taint)已存在,則使用指定的值替換 $ kubectl taint nodes foo dedicated=special-user:NoSchedule  

14、資源型別列表

下表列出的是 kubernetes 中所有支援的型別和縮寫的別名。
資源型別 縮寫別名
apiservices  
certificatesigningrequests csr
clusters  
clusterrolebindings  
clusterroles  
componentstatuses cs
configmaps cm
controllerrevisions  
cronjobs  
customresourcedefinition crd
daemonsets ds
deployments deploy
endpoints ep
events ev
horizontalpodautoscalers hpa
ingresses ing
jobs  
limitranges limits
namespaces ns
networkpolicies netpol
nodes no
persistentvolumeclaims pvc
persistentvolumes pv
poddisruptionbudget pdb
podpreset  
pods po
podsecuritypolicies psp
podtemplates  
replicasets rs
replicationcontrollers rc
resourcequotas quota
rolebindings  
roles  
secrets  
serviceaccounts sa
services svc
statefulsets  
storageclasses  

15、kubectl的格式化輸出

要以特定的格式向終端視窗輸出詳細資訊,可以在 kubectl 命令中新增 -o 或者 -output 標誌。
輸出格式 描述
-o=custom-columns=<spec> 使用逗號分隔的自定義列列表打印表格
-o=custom-columns-file=<filename> 使用 檔案中的自定義列模板打印表格
-o=json 輸出 JSON 格式的 API 物件
-o=jsonpath=<template> 列印  jsonpath 表示式中定義的欄位
-o=jsonpath-file=<filename> 列印由 檔案中的  jsonpath 表示式定義的欄位
-o=name 僅列印資源名稱
-o=wide 以純文字格式輸出任何附加資訊,對於 Pod ,包含節點名稱
-o=yaml 輸出 YAML 格式的 API 物件

16、Kubectl 日誌列印級別

使用 -v 或 --v 標誌跟著一個整數來指定日誌級別。
詳細等級 描述
--v=0 總是對操作人員可見。
--v=1 合理的預設日誌級別,如果您不需要詳細輸出。
--v=2 可能與系統的重大變化相關的,有關穩定狀態的資訊和重要的日誌資訊。這是對大多數系統推薦的日誌級別。
--v=3 有關更改的擴充套件資訊。
--v=4 除錯級別詳細輸出。
--v=6 顯示請求的資源。
--v=7 顯示HTTP請求的header。
--v=8 顯示HTTP請求的內容。


參考: https://kubernetes.io/docs/reference/kubectl/overview/ https://jimmysong.io/kubernetes-handbook/guide/kubectl-cheatsheet.html