Kubernetes 教學系列 - kubectl 常見指令說明

上次講了在 Kubernetes 中要如何建立 Pod:Kubernetes 教學系列 - 如何建立 Pod ,不外乎有用到許多 kubectl 指令,所以這篇文章主要是講解 kubectl 常見指令。

kubectl 語法講解

首先如果先熟悉 kubectl 的語法的話會更了解該怎麼下指令,以及忘記的話也比較好猜測指令。

kubectl 的語法如下:

1
kubectl [command] [type] [name] [flags]
  • command

    指定要對一個或多個資源執行的操作,例如 applycreategetdescribedelete

    例如:

    1
    2
    3
    4
    5
    kubetl apply -f pod.yaml
    kubectl create -f pod.yaml
    kubectl get pod
    kubectl describe pod web-app
    kubectl delete pod web-app

    基本上五種的 command 動作就如字面上的意思,而 get 與 describe 差別在於,describe 可以取得該資源本身的設定檔的內容以及相關 event。如果建立資源一直失敗也可以透過看 event 看是否有出現錯誤。

  • type

    指定資源類型。這個病不會區分大小寫,可以單數、複數或是縮寫。例如:

    1. 取得 pod:

      1
      2
      3
      kubectl get pod pod1
      kubectl get pods pod1
      kubectl get po pod1
    2. 取得 service:

      1
      2
      3
      kubectl get service service1
      kubectl get services service1
      kubectl get svc service1
    3. 取得 Deployment:

      1
      2
      3
      kubectl get deployment deployment1
      kubectl get deployments deployment1
      kubectl get deploy deploymen1
  • name

    指定資源的名稱,名稱會區分大小寫,如果省略則會顯示所有相關资源的訊息

    例如:

    1
    2
    3
    kubectl get pods
    kubectl get services
    kubectl get deployments

    如果要對多個資源執行操作的話,則可以這樣做:

    1. 對多個類型相同的資源進行操作

      1
      kubectl get pod example-pod1 example-pod2
    2. 對多個不同類型的資源進行操作

      1
      kubectl get pod/example-pod1 service/example-rc1
    3. 用多個文件指定資源:

      1
      kubectl get -f ./pod1.yaml -f ./pod2.yaml 
  • flags

    指定可選的參數,這個要根據不同的 command 而有不同的操作

    例如:

    1
    kubectl get pods -o wide

    -o wide 意思是可以顯示更多 pods 的相關資訊

常見 kubectl 指令

這邊列出常常會用到的指令,所以這邊我會不定時更新 XD

取得所有 Pods 的資訊

1
kubectl get pods

取得某 Pod 的詳細資料

1
kubectl describe pod <podName>  

直接建立一個 service 與某 Pod 中的 port 做對應,讓外部存取

1
kubectl expose pod <podName> --type=NodePort --name=<serviceName>

將某 Pod 中指定的 port number mapping 到 Local 的特定 port

1
$ kubectl port-forward <podName> <localPort>:<podPort>

與 Pod 內的 Container 進行互動,可以查看 log 也可以與 stdin 互動

1
$ kubectl attach <pod> -i

對 Pod 中的容器执行命令

1
2
3
4
5
6
# 從 pod <pod-name> 中獲取運行 'date' 的輸出,預設是輸出第一個容器。
kubectl exec <podName> -- date
# 獲取運行 'date' 在容器 <container-name>中 pod <pod-name> 的輸出。
kubectl exec <podName> -c <containerName> -- date
# 獲取一個TTY交互並運行 /bin/bash <pod-name>,預設是輸出第一個容器。
kubectl exec -it <podName> -- /bin/bash

打印 Pod 中容器的 log

1
2
3
kubectl logs <podName>
# streaming傳輸log,類似 'tail -f' Linux 命令
kubectl logs -f <pod-name>

在集群上運行指定的 Image

1
kubectl run -i --tty alpine --image=alpine --restart=Never -- sh

透過這樣的指令可以直接建立一個 pod,裡面的 Container Image 是 alpine。

然後因為在 Cluster 上的 Pod 在內部可以互相 access 到,可以透過以下指令得知每一個 Pod 的 IP:

1
kubectl get pods -o wide
1
2
3
NAME          READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
alpine 1/1 Running 0 6m13s 172.17.0.4 minikube <none> <none>
web-app-pod 1/1 Running 1 24h 172.17.0.2 minikube <none> <none>

所以透過前面的指令的 run alpine,會進到 alpine 的 shell,在裡面安裝 curl:

1
apk add --no-cache curl

接著存取 web-app-pod:

1
curl http://172.17.0.2:8080/health

就能得到以下 message:

1
{"status":"ok"}

總結

最後由於 kubectl 的指令太多了,除了可以查詢官方文件,也可以利用 kubectl help 來查詢哪些指令該怎麼使用以及所代表的涵義,今天主要介紹在對於 pod 的操作中常用的 kubectl 指令以及其語法介紹。

參考資料網址:

  1. https://ithelp.ithome.com.tw/articles/10193232
  2. https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

最後最後!請聽我一言!

如果你還沒有註冊 Like Coin,你可以透過我的邀請註冊連結來免費註冊,註冊完後就可以在文章最下方幫我按下 Like 按鈕,而 Like 最多可以點五次,如何一來你不用付出任何一塊錢,就能給我寫這篇文章最大的回饋!