Skip to main content

Kubernetes 常用指令

kubectl 基本指令

run 建立 Pod

kubectl run po $PODNAME --image=$IMAGENAME --restart=Never --dry-run=client
  • -dry-run 參數常用來生成建立 POD 的 YAML 檔案(證照考試常用)

apply 透過文件創建物件

kubectl apply -f $FILE.YAML

delete 删除物件

kubectl delete pod $PODNAME

get 查看物件

kubectl get pod --namespace=$NSNAME
  • 只查看特定 namespace 中的 pod
kubectl get pods -o wide
  • 查看 pod 的所有細節
kubectl get all -A
  • 查看所有 namespace 的 pod
kubectl get deployment $DPNAME
  • 查看 deployment 細節
kubectl get pod $PODNAME -o yaml

#取得建立 POD 時的 YAML 檔案

kubectl get pod $PODNAME -v 6
  • 獲取每一個 kubectl 命令在 API level 的 log,使用 6,7,8,9 不同的 level,數值越大得到的信息詳細
kubectl get pods $PODNAME --watch -v 6
  • 持續監聽 lubectl 在 API level 的操作
kubectl get events
  • 查看創建 pod 中發生的 issue
kubectl get deployments
  • 取得 deployments 資訊
kubectl get rs
  • 取得 Replication Set 資訊
kubectl get services --sort-by=.metadata.name
  • 透過排序名字列出 service
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
  • 透過 restart count 列出 pods
kubectl get pv --sort-by=.spec.capacity.storage
  • 透過容量列出 Persistent Volumes
kubectl get pods --selector=app=cassandra -o \
jsonpath='{.items[*].metadata.labels.version}'
  • 透過 version label app = cassandra 取得 pods
kubectl get configmap myconfig \
-o jsonpath='{.data.ca\.crt}'
  • 取得 configmap 中的 ca.crt
kubectl get secret my-secret --template='{{index .data "key-name-with-dashes"}}'
kubectl get node --selector='!node-role.kubernetes.io/control-plane'
  • 排除包含標籤 node-role.kubernetes.io/control-plane 的 node
kubectl get pods --field-selector=status.phase=Running
  • 取得正在運行的 pod
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
  • 取得 nodes 上所有 ExternalIPs
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})
  • 取得 my-rc 中的 pod 名稱
kubectl get pods --show-labels
  • 取得所有的 pod 並附註 label
JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
&& kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
  • 取得所有正在運行的 Node
kubectl get node -o custom-columns='NODE_NAME:.metadata.name,STATUS:.status.conditions[?(@.type=="Ready")].status'
  • 取得所有正在運行的 Node,並附加客製 Column
kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}'
  • 取得 decoded 過的 secrets
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
  • 取得有被 pod 使用的 secret
kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3
  • 取得所有包含 init countainer 的 containerIDs
kubectl get events --sort-by=.metadata.creationTimestamp
  • 透過排序 timestamp 取得所有 events
kubectl events --types=Warning
  • 取得所有 warning events
kubectl get nodes -o json | jq -c 'paths|join(".")'
"apiVersion"
"items"
"items.0"
"items.0.apiVersion"
"items.0.kind"
"items.0.metadata"
"items.0.metadata.annotations"
"items.0.metadata.annotations.flannel.alpha.coreos.com/backend-data"
"items.0.metadata.annotations.flannel.alpha.coreos.com/backend-type"
"items.0.metadata.annotations.flannel.alpha.coreos.com/kube-subnet-manager"
"items.0.metadata.annotations.flannel.alpha.coreos.com/public-ip"
"items.0.metadata.annotations.kubeadm.alpha.kubernetes.io/cri-socket"
"items.0.metadata.annotations.node.alpha.kubernetes.io/ttl"
"items.0.metadata.annotations.volumes.kubernetes.io/controller-managed-attach-detach"
"items.0.metadata.creationTimestamp"
"items.0.metadata.labels"
"items.0.metadata.labels.beta.kubernetes.io/arch"
"items.0.metadata.labels.beta.kubernetes.io/os"
"items.0.metadata.labels.kubernetes.io/arch"
"items.0.metadata.labels.kubernetes.io/hostname"
"items.0.metadata.labels.kubernetes.io/os"
"items.0.metadata.labels.node-role.kubernetes.io/control-plane"
"items.0.metadata.labels.node.kubernetes.io/exclude-from-external-load-balancers"
"items.0.metadata.name"
"items.0.metadata.resourceVersion"
"items.0.metadata.uid"
"items.0.spec"
"items.0.spec.podCIDR"
"items.0.spec.podCIDRs"
"items.0.spec.podCIDRs.0"
"items.0.spec.taints"
"items.0.spec.taints.0"
"items.0.spec.taints.0.effect"
"items.0.spec.taints.0.key"
"items.0.status"
"items.0.status.addresses"
"items.0.status.addresses.0"
"items.0.status.addresses.0.address"
"items.0.status.addresses.0.type"
"items.0.status.addresses.1"
"items.0.status.addresses.1.address"
"items.0.status.addresses.1.type"
"items.0.status.allocatable"
"items.0.status.allocatable.cpu"
"items.0.status.allocatable.ephemeral-storage"
"items.0.status.allocatable.hugepages-2Mi"
"items.0.status.allocatable.memory"
"items.0.status.allocatable.pods"
"items.0.status.capacity"
"items.0.status.capacity.cpu"
"items.0.status.capacity.ephemeral-storage"
"items.0.status.capacity.hugepages-2Mi"
"items.0.status.capacity.memory"
"items.0.status.capacity.pods"
"items.0.status.conditions"
"items.0.status.conditions.0"
"items.0.status.conditions.0.lastHeartbeatTime"
"items.0.status.conditions.0.lastTransitionTime"
"items.0.status.conditions.0.message"
"items.0.status.conditions.0.reason"
"items.0.status.conditions.0.status"
"items.0.status.conditions.0.type"
"items.0.status.conditions.1"
"items.0.status.conditions.1.lastHeartbeatTime"
"items.0.status.conditions.1.lastTransitionTime"
"items.0.status.conditions.1.message"
"items.0.status.conditions.1.reason"
"items.0.status.conditions.1.status"
"items.0.status.conditions.1.type"
"items.0.status.conditions.2"
"items.0.status.conditions.2.lastHeartbeatTime"
"items.0.status.conditions.2.lastTransitionTime"
"items.0.status.conditions.2.message"
"items.0.status.conditions.2.reason"
"items.0.status.conditions.2.status"
"items.0.status.conditions.2.type"
"items.0.status.conditions.3"
"items.0.status.conditions.3.lastHeartbeatTime"
"items.0.status.conditions.3.lastTransitionTime"
"items.0.status.conditions.3.message"
"items.0.status.conditions.3.reason"
"items.0.status.conditions.3.status"
"items.0.status.conditions.3.type"
"items.0.status.conditions.4"
"items.0.status.conditions.4.lastHeartbeatTime"
"items.0.status.conditions.4.lastTransitionTime"
"items.0.status.conditions.4.message"
"items.0.status.conditions.4.reason"
"items.0.status.conditions.4.status"
"items.0.status.conditions.4.type"
"items.0.status.daemonEndpoints"
"items.0.status.daemonEndpoints.kubeletEndpoint"
"items.0.status.daemonEndpoints.kubeletEndpoint.Port"
"items.0.status.images"
"items.0.status.images.0"
"items.0.status.images.0.names"
"items.0.status.images.0.names.0"
"items.0.status.images.0.names.1"
"items.0.status.images.0.sizeBytes"
"items.0.status.images.1"
"items.0.status.images.1.names"
"items.0.status.images.1.names.0"
"items.0.status.images.1.names.1"
"items.0.status.images.1.sizeBytes"
"items.0.status.images.2"
"items.0.status.images.2.names"
"items.0.status.images.2.names.0"
"items.0.status.images.2.names.1"
"items.0.status.images.2.sizeBytes"
"items.0.status.images.3"
"items.0.status.images.3.names"
"items.0.status.images.3.names.0"
"items.0.status.images.3.names.1"
"items.0.status.images.3.sizeBytes"
"items.0.status.images.4"
"items.0.status.images.4.names"
"items.0.status.images.4.names.0"
"items.0.status.images.4.names.1"
"items.0.status.images.4.sizeBytes"
"items.0.status.images.5"
"items.0.status.images.5.names"
"items.0.status.images.5.names.0"
"items.0.status.images.5.names.1"
"items.0.status.images.5.sizeBytes"
"items.0.status.images.6"
"items.0.status.images.6.names"
"items.0.status.images.6.names.0"
"items.0.status.images.6.names.1"
"items.0.status.images.6.sizeBytes"
"items.0.status.images.7"
"items.0.status.images.7.names"
"items.0.status.images.7.names.0"
"items.0.status.images.7.names.1"
"items.0.status.images.7.sizeBytes"
"items.0.status.images.8"
"items.0.status.images.8.names"
"items.0.status.images.8.names.0"
"items.0.status.images.8.names.1"
"items.0.status.images.8.sizeBytes"
"items.0.status.images.9"
"items.0.status.images.9.names"
"items.0.status.images.9.names.0"
"items.0.status.images.9.names.1"
"items.0.status.images.9.sizeBytes"
"items.0.status.nodeInfo"
"items.0.status.nodeInfo.architecture"
"items.0.status.nodeInfo.bootID"
"items.0.status.nodeInfo.containerRuntimeVersion"
"items.0.status.nodeInfo.kernelVersion"
"items.0.status.nodeInfo.kubeProxyVersion"
"items.0.status.nodeInfo.kubeletVersion"
"items.0.status.nodeInfo.machineID"
"items.0.status.nodeInfo.operatingSystem"
"items.0.status.nodeInfo.osImage"
"items.0.status.nodeInfo.systemUUID"
"items.1"
"items.1.apiVersion"
"items.1.kind"
"items.1.metadata"
"items.1.metadata.annotations"
"items.1.metadata.annotations.flannel.alpha.coreos.com/backend-data"
"items.1.metadata.annotations.flannel.alpha.coreos.com/backend-type"
"items.1.metadata.annotations.flannel.alpha.coreos.com/kube-subnet-manager"
"items.1.metadata.annotations.flannel.alpha.coreos.com/public-ip"
"items.1.metadata.annotations.kubeadm.alpha.kubernetes.io/cri-socket"
"items.1.metadata.annotations.node.alpha.kubernetes.io/ttl"
"items.1.metadata.annotations.volumes.kubernetes.io/controller-managed-attach-detach"
"items.1.metadata.creationTimestamp"
"items.1.metadata.labels"
"items.1.metadata.labels.beta.kubernetes.io/arch"
"items.1.metadata.labels.beta.kubernetes.io/os"
"items.1.metadata.labels.kubernetes.io/arch"
"items.1.metadata.labels.kubernetes.io/hostname"
"items.1.metadata.labels.kubernetes.io/os"
"items.1.metadata.name"
"items.1.metadata.resourceVersion"
"items.1.metadata.uid"
"items.1.spec"
"items.1.spec.podCIDR"
"items.1.spec.podCIDRs"
"items.1.spec.podCIDRs.0"
"items.1.status"
"items.1.status.addresses"
"items.1.status.addresses.0"
"items.1.status.addresses.0.address"
"items.1.status.addresses.0.type"
"items.1.status.addresses.1"
"items.1.status.addresses.1.address"
"items.1.status.addresses.1.type"
"items.1.status.allocatable"
"items.1.status.allocatable.cpu"
"items.1.status.allocatable.ephemeral-storage"
"items.1.status.allocatable.hugepages-2Mi"
"items.1.status.allocatable.memory"
"items.1.status.allocatable.pods"
"items.1.status.capacity"
"items.1.status.capacity.cpu"
"items.1.status.capacity.ephemeral-storage"
"items.1.status.capacity.hugepages-2Mi"
"items.1.status.capacity.memory"
"items.1.status.capacity.pods"
"items.1.status.conditions"
"items.1.status.conditions.0"
"items.1.status.conditions.0.lastHeartbeatTime"
"items.1.status.conditions.0.lastTransitionTime"
"items.1.status.conditions.0.message"
"items.1.status.conditions.0.reason"
"items.1.status.conditions.0.status"
"items.1.status.conditions.0.type"
"items.1.status.conditions.1"
"items.1.status.conditions.1.lastHeartbeatTime"
"items.1.status.conditions.1.lastTransitionTime"
"items.1.status.conditions.1.message"
"items.1.status.conditions.1.reason"
"items.1.status.conditions.1.status"
"items.1.status.conditions.1.type"
"items.1.status.conditions.2"
"items.1.status.conditions.2.lastHeartbeatTime"
"items.1.status.conditions.2.lastTransitionTime"
"items.1.status.conditions.2.message"
"items.1.status.conditions.2.reason"
"items.1.status.conditions.2.status"
"items.1.status.conditions.2.type"
"items.1.status.conditions.3"
"items.1.status.conditions.3.lastHeartbeatTime"
"items.1.status.conditions.3.lastTransitionTime"
"items.1.status.conditions.3.message"
"items.1.status.conditions.3.reason"
"items.1.status.conditions.3.status"
"items.1.status.conditions.3.type"
"items.1.status.conditions.4"
"items.1.status.conditions.4.lastHeartbeatTime"
"items.1.status.conditions.4.lastTransitionTime"
"items.1.status.conditions.4.message"
"items.1.status.conditions.4.reason"
"items.1.status.conditions.4.status"
"items.1.status.conditions.4.type"
"items.1.status.daemonEndpoints"
"items.1.status.daemonEndpoints.kubeletEndpoint"
"items.1.status.daemonEndpoints.kubeletEndpoint.Port"
"items.1.status.images"
"items.1.status.images.0"
"items.1.status.images.0.names"
"items.1.status.images.0.names.0"
"items.1.status.images.0.names.1"
"items.1.status.images.0.sizeBytes"
"items.1.status.images.1"
"items.1.status.images.1.names"
"items.1.status.images.1.names.0"
"items.1.status.images.1.names.1"
"items.1.status.images.1.sizeBytes"
"items.1.status.images.2"
"items.1.status.images.2.names"
"items.1.status.images.2.names.0"
"items.1.status.images.2.names.1"
"items.1.status.images.2.sizeBytes"
"items.1.status.images.3"
"items.1.status.images.3.names"
"items.1.status.images.3.names.0"
"items.1.status.images.3.names.1"
"items.1.status.images.3.sizeBytes"
"items.1.status.nodeInfo"
"items.1.status.nodeInfo.architecture"
"items.1.status.nodeInfo.bootID"
"items.1.status.nodeInfo.containerRuntimeVersion"
"items.1.status.nodeInfo.kernelVersion"
"items.1.status.nodeInfo.kubeProxyVersion"
"items.1.status.nodeInfo.kubeletVersion"
"items.1.status.nodeInfo.machineID"
"items.1.status.nodeInfo.operatingSystem"
"items.1.status.nodeInfo.osImage"
"items.1.status.nodeInfo.systemUUID"
"kind"
"metadata"
"metadata.resourceVersion"
  • 產生一個以句點分隔的樹,其中包含為 Node 等返回的所有 key
kubectl get pods -o json | jq -c 'paths|join(".")'
"apiVersion"
"items"
"kind"
"metadata"
"metadata.resourceVersion"
  • 產生一個以句點分隔的樹,其中包含為 Pod 等返回的所有 key
for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done
  • 找出有使用 env 指令的 pod
kubectl get deployment nginx-deployment --subresource=status
  • 取得 deployment nginx-deployment 中的 subresource

create 創建物件

kubectl create deployment $DPNAME --image=$IMAGENAME --replicas 3
  • 創建一個 deployment
kubectl create job $JOBNAME --image=$IMAGENAME -- sh -c "sleep 50"
  • 創建一個 job
kubectl create cronjob $CRONJOBNAME --image=$IMAGENAME --schedule="*/1 * * * *" -- echo "Hello World”
  • 創建一個 cronjob
kubectl create ns $NSNAME
  • 創建 namespace

describe 詳細描述物件資訊

kubectl describe nodes $NODENAME
  • 查看 Node
kubectl describe pods $PODNAME
  • 查看 Pod

delete 刪除物件

kubectl delete pod $PODNAME
kubectl delete service $SERVICENAME
kubectl delete deployments.apps web
kubectl delete persistentvolumeclaims $PVCNAME
kubectl delete persistentvolume $PVNAME
kubectl delete pod $PODNAME --grace-period=$SECOND
  • 在時間內刪除 pod
kubectl delete pod $PODNAME --grace-period=0 --force
  • 強制刪除 pod (SIGKILL)

expose 創建 service

kubectl expose -f $FILENAME
kubectl expose --port=$PORT --protocol=TCP/UDP --target-port=$NAME --name=$NAME ----externalip=$IP

log 查看日誌 log

kubectl logs $PODNAME
kubectl logs $POD_NAME -c $CONTAINER_NAME
kubectl logs $POD_NAME --all-containers
kubectl logs --selector $KEY1=$VALUE1
kubectl logs -f $POD_NAME
follow latest logs
kubectl logs -f $POD_NAME $CONTAINER_NAME
若 Pod 內有兩個以上的 container,要在指令後方加上 container name,否則會發生 error
kubectl logs $POD_NAME --tail 5
  • get 最近的 5 個 log
kubectl logs $POD_NAME -f --previous
  • 查看 Pod 之前的 log

exec 在 pod 中執行指令

kubectl exec $POD_NAME -- ls /
  • 在 POD 執行指令
kubectl exec --stdin --tty $POD_NAME -- /bin/sh
  • 連線 POD 的 SHELL
kubectl exec $PODNAME -c my-container -- ls /
  • 在多個同樣的 PODS 裡面運行指令

annotate 在 pod 中建立註解

kubectl annotate [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]`
  • 在 pod 上建立一般描述 Annotation

debug 建立 debug 模式

kubectl debug (POD | TYPE[[.VERSION].GROUP]/NAME) [ -- COMMAND [args...] ]`

set 更新 image

kubectl set image deployment/web nginx**=**nginx:1.14.2`

rollout 更新回滾

kubectl rollout undo deployment $DPNAME --to-revision=1
kubectl rollout history deployment $DPNAME
查看 rollout history
kubectl rollout history deployment $DPNAME --revision=1
查看 revision history

scale 擴展 Deployment

kubectl scale deployment $DP_NAME --replicas 5

taint 限制節點不能建立 pod

kubectl taint nodes $NODENAME $KEY1=$VALUE1:NoSchedule
  • 新增 taint
kubectl taint nodes $NODENAME $KEY1=$VALUE1:NoSchedule-
  • 移除 taint

label 為資源加上 label

kubectl label nodes $NODENAME hardware=local_gpu

cordon 標記節點不能建立 pod

kubectl cordon $NODENAME

drain 非強制的刪除節點上的 Pod

kubectl drain $NODE_NAME --ingore-daemonsets`

top 查看資源 CPU Memory

kubectl top pods
kubectl top nodes

auth 確認權限

kubectl auth can-i $OPTION $RESOURCES
  • kubectl auth can-i create nodes
  • kubectl auth can-i delete pods
  • kubectl auth can-i delete nodes --as dev-user`

config 環境初始設定

kubectl config view
  • 展示 kubeconfig 的設定內容
kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'
  • 取得 user e2e 的 password
kubectl config view -o jsonpath='{.users[*].name}'
  • 取得用戶清單
kubectl config get-contexts
  • 取得 context 清單
kubectl config current-context
  • 取得 current context
kubectl config use-context my-cluster-name
  • 設定 the default context to my-cluster-name
kubectl cluster-info
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: [<https://172.31.9.108:6443>](<https://172.31.9.108:6443/>)
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
kubectl config view --raw
apiVersion: v1
clusters:

- cluster:
certificate-authority-data:
server: [<https://172.31.9.108:6443>](<https://172.31.9.108:6443/>)
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data:
client-key-data:
kubectl config get-contexts

patch 更新物件

kubectl patch node $NODENAME -p '{"spec":{"unschedulable":true}}'
  • 單獨升級 node
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'`
  • 更新 pod 中的 container image
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'`
  • 透過 json patch 更新 container 的 image
kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'
  • 關閉 deployment 中的 livenessProbe
kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'`
  • 將新的 element 加入到 positional array
kubectl patch deployment nginx-deployment --subresource='scale' --type='merge' -p '{"spec":{"replicas":2}}'`
  • 升級 deployment 中的 replica,更新其中的 subresources

kubeadm 基本指令

init 初始化一個控制平面節點

kubeadm init

join 將工作節點並將其加入集群

kubeadm join --discovery-token abcdef.1234567890abcdef 1.2.3.4:6443

upgrade 支持升級的規劃和執行

kubeadm upgrade plan $VERSION $FLAG
  • 檢查可升級到哪些版本,並驗證你當前的集群是否可升級
kubeadm upgrade apply $VERSION
  • 將 Kubernetes 集群升级到指定版本

config 列出默認靜態配置

kubeadm config print

reset 還原由 init 或 join 所做更改

kubeadm reset [flags]

token 在 server 上創造 token

kubeadm token create $TOKEN

version 输出 kubeadm 的版本

kubeadm version

特殊使用情境

檢視服務紀錄檔

systemctl status kubelet
systemctl status kube-controller-manager -l
journalctl -u kube-controller-manager
journalctl -u kubelet

檢視 Control Plane 服務

service kube-apiserver status
service kube-controller-manager status
service kube-scheduler status
service kubelet status
service kube-proxy status
kubectl logs kube-apiserver-master -n kube-system
sudo journalctl -u kube-apiserver

檢視 worker node

service kubelet status
sudo journalctl –u kubelet

檢視 certification

openssl x509 -in /var/lib/kubelet/worker-1.crt -text

資源縮寫

資源名稱縮寫
cluster
componentstatusescs
configmapscm
daemonsetsds
deploymentsdeploy
endpointsep
eventsev
horizontalpodautoscalerhpa
ingressing
nodesno
namespacesns
persistentvolumeclaimspvc
persisitentvolumepv
podspo
podsecuritypolicypsp
replicasetsrs
replicationcontrollersrc
resoucesquotasquota
servicessvc
storageclassessc