Day 8 - 與 k8s 溝通: kubectl

本日共賞

希望你知道

與 k8s 溝通: APIs與 k8s 溝通: Dashboard 分別介紹兩種與 k8s 溝通的方式,今天要介紹第三種方式:kubectl

kubectl

kubectl 是一支用來與 k8s 叢集溝通的二進位 (binary) 工具。我們可以運用 kubectl 來

kubectl 常用指令

1. 取得設定檔

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/james/.minikube/ca.crt
    server: https://192.168.99.100:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/james/.minikube/client.crt
    client-key: /Users/james/.minikube/client.key

這裡會列出目前 kubectl 的設定內容。設定檔會放置在 ~/.kube/config (mac or linux) ,上述內容表示 kubectl 已連接到 minikube。

2. 管理多個 k8s 叢集

$ kubectl config use-context [NAME]

如果你需要管理多個 k8s 叢集,可以利用上面指令作切換,例如切換到 minikube

$ kubectl config use-context minikube
Switched to context "minikube".

如果想查詢有哪些叢集可以切換:

$ kubectl config get-contexts
CURRENT   NAME          CLUSTER          AUTHINFO          NAMESPACE  
*         minikube      minikube         minikube  

如果你只有一個叢集能管理,當然只會列出一個

如果想查看目前正在管理的叢集

$ kubectl config current-context
minikube

3. 取得叢集狀態

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

這裡會列出 k8s 叢集的運行資訊。根據上面資訊可得知 master 正運行在 https://192.168.99.100:8443

還記得 Master Node 嗎?

4. 代理

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

需要與 k8s 溝通時,必須要先經由 api server 認證後才可以存取 k8s 資源。透過 kubectl proxy,kubectl 會與 api server 進行認證溝通。完成認證之後,就可以利用瀏覽器開啟網址 localhost:8001/ui 使用 Dashboard 或透過 API 進行操作。如果想查詢有哪些 APIs 可使用,可透過 curl 指令來查詢。

$ curl http://localhost:8001
{
  "paths": [
    "/api",
    "/api/v1",
    "/apis",
    "/apis/",
    "/apis/admissionregistration.k8s.io",
    "/apis/admissionregistration.k8s.io/v1alpha1",
    "/apis/apiextensions.k8s.io",
    "/apis/apiextensions.k8s.io/v1beta1",
    "/apis/apiregistration.k8s.io",
    "/apis/apiregistration.k8s.io/v1beta1",
    "/apis/apps",
...

請注意,查詢 APIs 必須要先執行 kubectl proxy 通過認證後才可執行

5. 建立命名空間

$ kubectl create namespace [name]

在 k8s 中,命名空間 (namespace) 是很重要的觀念。利用命名空間,你可以隔開兩個不同的群組或環境,例如 deveop 表示開發環境 production 表示正是環境。而在不同環境內的物件並不會互相干擾,也可以有相同的名稱。當 k8s 被建立的同時,會有三個命名空間產生,分別是 default, kube-publickube-system。看字面應該也很容易知道 kube-publickube-system 是 k8s 內部使用的。而 default 則是預設的命名空間,即在未指定部署空間時,所有的物件都會被部署在 default 內。如果你想要建立只要透過上面格式就可輕鬆建立。例如:建立一個 develop

$ kubectl create namespace develop
namespace "develop" created

6. 取得資源

$ kubectl get [resources][namespace]

在 k8s 中有各式各樣不同的資源物件。例如 Pod, Secret, Service, Namespace 等等,我們可以利用上述指令來查詢叢集中現有的資源。

不知道什麼是 Pod, Service, .. 嗎?別擔心!之後的文章會再詳細說明。目前先專注在 kubectl 指令上即可

範例一 查詢命名空間 (namespace)

$ kubectl get namespace
NAME          STATUS    AGE
default       Active    4d
kube-public   Active    4d
kube-system   Active    4d

這裡列出目前叢集內正在運行的三個命名空間,分別是 default, kube-publickube-system

請注意,這個範例並沒有指定 [namespace] 而是查詢 namespace

範例二 查詢在 develop 命名空間 (namespace) 中運行的 pod

kubectl get pods --namespace=develop
NAME                             READY     STATUS    RESTARTS   AGE
webserver-2736313971-t86gs       1/1       Running   2          29d
webserver-red-4210812574-tdlrz   1/1       Running   2          29d

這裡列出在 develop 這個命名空間內

範例三 查詢在 production 命名空間 (namespace) 中運行的 service

$ kubectl get services --namespace=production
NAME            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes      10.0.0.1     <none>        443/TCP        33d
webserver-svc   10.0.0.35    <nodes>       80:31771/TCP   29d

這裡列出在 production 命名空間內

可執行 kubectl [action] –help 查看說明,例如 kubectl get –help

如何部署 Service ,我們會在之後的文章再詳細說明。

7. 取得資源詳細內容

$ kubectl describe [resources][namespace]

若想獲得更詳細的資源內容,我們可以利用上述指令來取得。根據上述 get 指令我們可以知道目前 develop 內共有兩個 pod 正在運行,如果想獲得更詳細的 pod 資訊,可使用下列指令

$ kubectl describe pods webserver-2736313971-t86gs --namespace=develop

物件每次新建或重啟都會被賦予不同的名字,請記得將 “webserver-2736313971-t86gs” 替換成正確的名稱。另外你可以試著查查看運行在 kube-system 的 Pod

8. 刪除資源

$ kubectl delete [resources][namespace]

若要刪除叢集內的資源可透過上述指令進行刪除

範例一 刪除 develop 命名空間內名為 webserver-2736313971-t86gs 的 pod

$ kubectl delete pods webserver-2736313971-t86gs --namespace=develop
pod "webserver-2736313971-t86gs" deleted

你應該不會想要刪除 kube-system 裡面的 Pod 吧?為什麼不!試試看吧!你會發現 k8s 會再幫你重新建立喔!

範例二 刪除 production 命名空間內名為 webserver-svc 的 service

$ kubectl delete services webserver-svc --namespace=production
service "webserver-svc" deleted

9. 部署

$ kubectl apply -f [resources file/folder][namespace]

如果有 k8s .yaml 描述檔案,我們可透過 apply 部署 k8s 資源

除了利用 apply 部署,還可以利用 run 或 expose 等等指令來建立物件。使用指令雖然快速方便,但如果需要同時部署多個物件會比較不方便。另外,使用 yaml 檔也可以有個紀錄,方便追蹤除錯。因此,之後的說明,會使用 yaml 為主。

底下是一個利用 run 來部署一個 nginx 的範例

$ kubectl run nginx --image=nginx
deployment "nginx" created

$ kubectl get deployment
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx     1         1         1            1           4m

更完整的 kubectl 指令說明與資源類別,請參考 kubectl 官方指令說明

本文同步發表於 https://jlptf.github.io/ironman2018-day8/