k8s技術--Kubernetes叢集kubectl命令的常見使用方法
阿新 • • 發佈:2018-12-24
簡介:kubectl是一個命令列介面,用於運行鍼對Kubernetes群集的命令。
語法:
根據yaml配置檔案一次性建立service和rc
kubectl create -f my-service.yaml -f my-rc.yaml
根據<directory>目錄下所有.yaml、.yml、.json檔案的定義進行建立操作
kubectl create -f <directory>
顯示Node的詳細資訊
kubectl describe nodes <node-name>
顯示Pod的詳細資訊
kubectl describe pods/<pod-name>
顯示由RC管理的Pod的資訊
kubectl describe pods <rc-name>
執行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
參考: https://kubernetes.io/docs/reference/kubectl/overview/ https://jimmysong.io/kubernetes-handbook/guide/kubectl-cheatsheet.html
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 pods4、檢視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
檔案;
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:NoSchedule14、資源型別列表
下表列出的是 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