iT邦幫忙

2021 iThome 鐵人賽

DAY 6
1
DevOps

k8s 入門學習 30天系列 第 6

IT 鐵人賽 k8s 入門30天 -- day6 主要 Kubectl 指令 - K8s CLI

前言

今天將要介紹 kubectl 一些常用的指令

這些指令會在後面實作的部份使用到

前置狀態

minikube 已經安裝, 並且已經啟動一個 k8s 叢集

kubectl 已經安裝

取得 node 狀態

kubectl get nodes

如果已經有安裝 minikube 並且跑起來一個 k8s 叢集

會有以下這個結果

取得 pod 狀態

kubectl get pod

目前因為還沒建製任何 pod 所以會是以下狀態

取得 services 狀態

kubectl get services

目前還沒建製除了原本 minikube 預設叢集之外的 Services

所以會是以下畫面

建製資源指令

查詢使用指令

kubectl create -h

建立 Deployment 指令

注意的是 在 k8s 內並不直接建製 Pod

而是透過 建立 Pod 的建製藍圖 Deployment 來做 Pod 設定

然後 k8s 叢集會自動根據 Deployment 建制 Pod

建制 Deployment 指令如下:

kubectl create deployment Name --image=image [--dry-run] [options]

舉例來說: 使用 nginx docker 映象檔來建制 Name 為 nginx-deployment 的 Deployment 指令如下

kubectl create deployment nginx-deployment --image=nginx

注意的是, 這邊沒指令 image 版本, 會直接指定最新的版本

執行之後, 會有以下畫面

查詢 Deployment 指令

kubectl get deployment

在建立 Deployment 後

可以使用上面指令查詢已建立的 Deployment

因為已經建製了一個叫作 nginx-deployment 的 Deployment

因此會得到以下的畫面

查詢 ReplicaSet 指令

kubectl get replicaset

在建立了 Deployment 之後

k8s 叢集會根據 Deployment 建立 Pod 以及 Pod 的 ReplicaSet

所以如果使用上面查詢指令, 會得到以下畫面

如果再用查詢 Pod 的指令, 會得到以下畫面

會發現 ReplicaSet 的 Name 欄位剛好是 Pod 的 Name 欄位 prefix

這個 Pod 屬於這個 ReplicaSet

Deployment, Pod, ReplicaSet 階層結構

Deployment 管理 ReplicaSet

ReplicaSet 管理 Pod 的 replicas

Pod 處理 Containers 執行

更改 deployment 指令

kubectl edit deployment [Name]

如果要修改 Pod 執行的方式, 可以透過上面的指令去做修改

舉例來說: 修改 nginx-deployment 就可使用以下指令

kubectl edit deployment nginx-deployment

預設會使用 vim 開啟一個預設的 Deployment 設定檔

如果要更換 kubectl edit 的預設開啟編輯器

可以設定 KUBE_EDITOR 這個環境變數

筆者習慣用 nano 所以先執行以下指令

export KUBE_EDITOR=nano

這樣在執行 kubectl edit 指令時, 就是以 nano 開啟 Deployment檔案

筆者這邊把原本的 nginx-deployment 的 image 版本更改為 nginx:1.16 儲存後

這時可以用查詢 Pod 的指令查看

會發現新的 Pod 產生中, 完成後會發現只剩下新的 Pod

然後去查 ReplicaSet

會看到新的 ReplicaSet 產生, 舊的 ReplicaSet 下面就沒有 Pod

Debug 指令

查詢 pod 執行紀錄

kubectl logs $pod_name

會顯示出 Pod 內, 容器化程式實際運行 log

可以拿來除錯時 使用

以下是查詢 Pod mongo-deployment-9fb7f9f76-4cq9x 的範例

查詢 pod 狀態

kubectl describe pod $pod_name

查詢 Pod 運行時的事件, 可以查到 Pod 運行狀態

舉例來說: 如果用下面指令查詢名稱 mongo-deployment-9fb7f9f76-4cq9x 的 Pod 狀態

kubectl describe pod mongo-deployment-9fb7f9f76-4cq9x

從上圖可以看到 mongo-deployment-9fb7f9f76-4cq9x 的運行狀態

直接開啟 pod 內部的容器 terminal

kubectl exec -it $pod_name -- bin/bash

舉例來說: 可以使用以下指令登入 mongo-deployment-9fb7f9f76-4cq9x 的 pod 內運行容器 terminal

kubectl exec -it mongo-deployment-9fb7f9f76-4cq9x -- bin/bash

注意的是, - - 但代表使用 root 身分登入

刪除 deployment

kubectl delete deployment $deployment_name

如果想要刪除 Pod 的話

可以透過刪除 deployment 的指令來處理

使用設定檔執行 kubectl

kubectl apply -f $configuration_file_name

隨著發佈的應用愈加複雜, kubectl 所需帶入的參數愈加複雜

因此, 比較好且實際的作法是

把 kubectl 的所有運行選項寫到一個設定檔案

再透過上面的指令選擇一個設定案來執行

舉例來說, 假設一個 nginx-deployment.yaml 如下:

然後執行

kubectl apply -f nginx-deployment.yaml

然後可以用 kubectl get pod 查看

因為 replicas 設定為 2

所以應該會有兩個 Pod 如下

如果要修改, 舉例來說把 replicas 改成 1

就可以直接修改 nginx-deployment.yaml 如下

然後執行

kubectl apply -f nginx-deployment.yaml

然後就可以驗證 Pod 只剩下一個如下

後記

很明顯透過設定檔來執行 kubectl

比互動式的下指令好管理的多

當要佈署的環境很複雜時

而明天將會好好解說設定檔的細節部份


上一篇
IT 鐵人賽 k8s 入門30天 -- day5 k8s run tools: minikubes 安裝與 kubectl 安裝
下一篇
IT 鐵人賽 k8s 入門30天 -- day7 K8s YAML 設定檔
系列文
k8s 入門學習 30天30

尚未有邦友留言

立即登入留言