溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kubectl 命令梳理

發(fā)布時間:2020-08-07 21:17:15 來源:網(wǎng)絡 閱讀:690 作者:無鋒劍 欄目:云計算

kubectl 命令梳理

Kubctl 命令是操作 kubernetes 集群的最直接的途徑,下面對相關(guān)命令進行簡介:

語法

$ kubectl [command] [TYPE] [NAME] [flags]
command:子命令
TYPE:資源類型
NAME:資源名稱
flags:命令參數(shù)

命令幫助
kubectl命令的幫助很詳細,kubectl -h會列出所有的子命令,在任何子命令后跟 -h,都會輸出詳細的幫助以及用例,遇到問題可以隨時查看幫助。

資源對象
kubectl大部分子命令后都可以指定要操作的資源對象,可以用kubectl api-resources命令參考

全局參數(shù)
kubectl options命令可以列出可以全局使用的命令參數(shù),比較重要的有:

--cluster='': 指定命令操作對象的集群
--context='':  指定命令操作對象的上下文
-n, --namespace='': 指定命令操作對象的Namespace

資源字段
kubectl explain命令可以輸出資源對應的屬性字段及定義,在定義資源配置文件時候非常有用。

Kubectl 自動補全

$ source <(kubectl completion bash) # setup autocomplete in bash, bash-completion package should be installed first.
$ source <(kubectl completion zsh)  # setup autocomplete in zsh

Kubectl 上下文和配置

設(shè)置 kubectl 命令交互的 kubernetes 集群并修改配置信息。參閱 使用 kubeconfig 文件進行跨集群驗證 獲取關(guān)于配置文件的詳細信息。

$ kubectl config view # 顯示合并后的 kubeconfig 配置

# 同時使用多個 kubeconfig 文件并查看合并后的配置
$ KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 kubectl config view

# 獲取 e2e 用戶的密碼
$ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

$ kubectl config current-context              # 顯示當前的上下文
$ kubectl config use-context my-cluster-name  # 設(shè)置默認上下文為 my-cluster-name

# 向 kubeconf 中增加支持基本認證的新集群
$ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword

# 使用指定的用戶名和 namespace 設(shè)置上下文
$ kubectl config set-context gce --user=cluster-admin --namespace=foo \
  && kubectl config use-context gce

創(chuàng)建對象

Kubernetes 的清單文件可以使用 json 或 yaml 格式定義??梢砸?.yaml、.yml、或者 .json 為擴展名。

$ kubectl create -f ./my-manifest.yaml           # 創(chuàng)建資源
$ kubectl create -f ./my1.yaml -f ./my2.yaml     # 使用多個文件創(chuàng)建資源
$ kubectl create -f ./dir                        # 使用目錄下的所有清單文件來創(chuàng)建資源
$ kubectl create -f https://git.io/vPieo         # 使用 url 來創(chuàng)建資源
$ kubectl run nginx --image=nginx                # 啟動一個 nginx 實例
$ kubectl explain pods,svc                       # 獲取 pod 和 svc 的文檔

# 從 stdin 輸入中創(chuàng)建多個 YAML 對象
$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
...
    - "1000000"
---
apiVersion: v1
kind: Pod
...
    - sleep
    - "1000"
EOF

# 創(chuàng)建包含幾個 key 的 Secret
$ cat <<EOF | kubectl create -f -
apiVersion: v1
....
EOF

顯示和查找資源

# Get commands with basic output
$ kubectl get services                          # 列出所有 namespace 中的所有 service
$ kubectl get pods --all-namespaces             # 列出所有 namespace 中的所有 pod
$ kubectl get pods -o wide                      # 列出所有 pod 并顯示詳細信息
$ kubectl get deployment my-dep                 # 列出指定 deployment
$ kubectl get pods --include-uninitialized      # 列出該 namespace 中的所有 pod 包括未初始化的

# 使用詳細輸出來描述命令
$ kubectl describe nodes my-node
$ kubectl describe pods my-pod

$ kubectl get services --sort-by=.metadata.name # List Services Sorted by Name

# 根據(jù)重啟次數(shù)排序列出 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}'

# 獲取所有節(jié)點的 ExternalIP
$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 列出屬于某個 PC 的 Pod 的名字
# “jq”命令用于轉(zhuǎn)換復雜的 jsonpath,參考 https://stedolan.github.io/jq/
$ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
$ echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})

# 查看哪些節(jié)點已就緒
$ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
 && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"

# 列出當前 Pod 中使用的 Secret
$ kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq

更新資源

$ kubectl rolling-update frontend-v1 -f frontend-v2.json           # 滾動更新 pod frontend-v1
$ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2  # 更新資源名稱并更新鏡像
$ kubectl rolling-update frontend --image=image:v2                 # 更新 frontend pod 中的鏡像
$ kubectl rolling-update frontend-v1 frontend-v2 --rollback        # 退出已存在的進行中的滾動更新
$ cat pod.json | kubectl replace -f -                              # 基于 stdin 輸入的 JSON 替換 pod

# 強制替換,刪除后重新創(chuàng)建資源。會導致服務中斷。
$ kubectl replace --force -f ./pod.json

# 為 nginx RC 創(chuàng)建服務,啟用本地 80 端口連接到容器上的 8000 端口
$ kubectl expose rc nginx --port=80 --target-port=8000

# 更新單容器 pod 的鏡像版本(tag)到 v4
$ kubectl get pod mypod -o yaml | sed 's/\(image: 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”

修補資源

使用策略合并補丁并修補資源。

$ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 部分更新節(jié)點

# 更新容器鏡像; spec.containers[*].name 是必須的,因為這是合并的關(guān)鍵字
$ kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

# 使用具有位置數(shù)組的 json 補丁更新容器鏡像
$ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

# 使用具有位置數(shù)組的 json 補丁禁用 deployment 的 livenessProbe
$ kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'

編輯資源

在編輯器中編輯任何 API 資源。

$ kubectl edit svc/docker-registry                      # 編輯名為 docker-registry 的 service
$ KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用其它編輯器

Scale 資源

$ kubectl scale --replicas=3 rs/foo                                 # Scale a replicaset named 'foo' to 3
$ kubectl scale --replicas=3 -f foo.yaml                            # Scale a resource specified in "foo.yaml" to 3
$ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # If the deployment named mysql's current size is 2, scale mysql to 3
$ kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # Scale multiple replication controllers

刪除資源

$ kubectl delete -f ./pod.json                                              # 刪除 pod.json 文件中定義的類型和名稱的 pod
$ kubectl delete pod,service baz foo                                        # 刪除名為“baz”的 pod 和名為“foo”的 service
$ kubectl delete pods,services -l name=myLabel                              # 刪除具有 name=myLabel 標簽的 pod 和 serivce
$ kubectl delete pods,services -l name=myLabel --include-uninitialized      # 刪除具有 name=myLabel 標簽的 pod 和 service,包括尚未初始化的
$ kubectl -n my-ns delete po,svc --all                                      # 刪除 my-ns namespace 下的所有 pod 和 serivce,包括尚未初始化的

與運行中的 Pod 交互

$ kubectl logs my-pod                                 # dump 輸出 pod 的日志(stdout)
$ kubectl logs my-pod -c my-container                 # dump 輸出 pod 中容器的日志(stdout,pod 中有多個容器的情況下使用)
$ kubectl logs -f my-pod                              # 流式輸出 pod 的日志(stdout)
$ kubectl logs -f my-pod -c my-container              # 流式輸出 pod 中容器的日志(stdout,pod 中有多個容器的情況下使用)
$ kubectl run -i --tty busybox --image=busybox -- sh  # 交互式 shell 的方式運行 pod
$ kubectl attach my-pod -i                            # 連接到運行中的容器
$ kubectl port-forward my-pod 5000:6000               # 轉(zhuǎn)發(fā) pod 中的 6000 端口到本地的 5000 端口
$ kubectl exec my-pod -- ls /                         # 在已存在的容器中執(zhí)行命令(只有一個容器的情況下)
$ kubectl exec my-pod -c my-container -- ls /         # 在已存在的容器中執(zhí)行命令(pod 中有多個容器的情況下)
$ kubectl top pod POD_NAME --containers               # 顯示指定 pod 和容器的指標度量

與節(jié)點和集群交互

$ kubectl cordon my-node                                                # 標記 my-node 不可調(diào)度
$ kubectl drain my-node                                                 # 清空 my-node 以待維護
$ kubectl uncordon my-node                                              # 標記 my-node 可調(diào)度
$ kubectl top node my-node                                              # 顯示 my-node 的指標度量
$ kubectl cluster-info                                                  # 顯示 master 和服務的地址
$ kubectl cluster-info dump                                             # 將當前集群狀態(tài)輸出到 stdout                                    
$ kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 將當前集群狀態(tài)輸出到 /path/to/cluster-state

# 如果該鍵和影響的污點(taint)已存在,則使用指定的值替換
$ kubectl taint nodes foo dedicated=special-user:NoSchedule

資源類型

下表列出的是 kubernetes 中所有支持的類型和縮寫的別名。

資源類型                          縮寫別名          指定 Namespaced
componentstatuses               cs                  FALSE
configmaps                      cm                  TRUE
endpoints                       ep                  TRUE
limitranges                     limits              TRUE
namespaces                      ns                  FALSE
nodes                           no                  FALSE
persistentvolumeclaims          pvc                 TRUE
persistentvolumes               pv                  FALSE
pods                            po                  TRUE
replicationcontrollers          rc                  TRUE
resourcequotas                  quota               TRUE
serviceaccounts                 sa                  TRUE
services                        svc                 TRUE
customresourcedefinitions crd, crds                 FALSE
daemonsets                      ds                  TRUE
deployments                     deploy              TRUE
replicasets                     rs                  TRUE
statefulsets                    sts                 TRUE
horizontalpodautoscalers        hpa                 TRUE
cronjobs                        cj                  TRUE
certificatesigningrequests      csr                 FALSE
events                          ev                  TRUE
ingresses                       ing                 TRUE
networkpolicies                 netpol              TRUE
poddisruptionbudgets            pdb                 TRUE
podsecuritypolicies             psp                 FALSE
priorityclasses                 pc                  FALSE
storageclasses                  sc                  FALSE

格式化輸出

要以特定的格式向終端窗口輸出詳細信息,可以在 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 ,包含節(jié)點名稱
-o=yaml 輸出 YAML 格式的 API 對象

Kubectl 詳細輸出和調(diào)試

使用 -v 或 --v 標志跟著一個整數(shù)來指定日志級別。

詳細等級    描述
--v=0   總是對操作人員可見。
--v=1   合理的默認日志級別,如果您不需要詳細輸出。
--v=2   可能與系統(tǒng)的重大變化相關(guān)的,有關(guān)穩(wěn)定狀態(tài)的信息和重要的日志信息。這是對大多數(shù)系統(tǒng)推薦的日志級別。
--v=3   有關(guān)更改的擴展信息。
--v=4   調(diào)試級別詳細輸出。
--v=6   顯示請求的資源。
--v=7   顯示HTTP請求的header。
--v=8   顯示HTTP請求的內(nèi)容。
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI