首頁 > 軟體

K8S 中 kubectl 命令詳解

2022-07-30 18:02:57

一、資源管理辦法

1.1 陳述式資源管理方法

kubernetes叢集管理叢集資源的唯一入口是通過相應的方法呼叫apiserver的介面

kubectl 是官方的CLI命令列工具,用於與apiserver 進行通訊,將使用者在命令列輸入的命令,組織並轉化為apiserver能識別的資訊,進而實現管理k8s 各種資源的一種有效途徑

kubectl 的命令大全
kubectl --help
k8s中文檔案: http://docs.kubernetes.org.cn/683.html

對資源的增、刪、查操作比較方便,但對改的操作就不容易

檢視版本資訊

kubectl version

檢視資源物件簡寫

kubectl api-resources 

檢視叢集資訊

kubectl cluster-info

設定kubectl自動補全

source <(kubectl completion bash)

注意:此時命令補全功能切換環境後是不生效的,如果要使切換環境後也生效需要設定全域性環境變數

vim /etc/bashrc
.....
source <(kubectl completion bash)         #在底部新增

node 節點檢視紀錄檔

journalctl -u kubelet -f

或者直接檢視紀錄檔
 
cat /var/log/messages

1.2基本資訊檢視

kubectl get <resource> [-o wide | json | yaml] [-n namespace]

獲取資源的相關資訊, -n指定命令空間, -o指定輸出格式

resource可以是具體資源名稱,如pod nginx -xxx;也可以是資源型別,如pod; 或者all (僅展示幾種核心資源,並不完整)

--all-namespaces 或-A :表示顯示所有命令空間,

--show-labels :顯示所有標籤

-l app:僅顯示標籤為app的資源

-l app=nginx :僅顯示包含app標籤, 且值為nginx的資源

檢視master 節點狀態

kubectl get componentstatuseskubectl get cs

檢視命令空間

命令空間的作用:用於允許不同 命令空間的相同型別的資源重名

kubectl get name space
kubectl get ns

檢視default名稱空間的所有資源

kubectl get all [-n default]

create 建立名稱空間 (app)

kubectl create ns app
kubectl get ns

delete 刪除名稱空間(app)

kubectl delete namespace app
kubectl get ns

在名稱空間建立副本控制器啟動Pod

例:在名稱空間kube-public 建立副本控制器( deployment) 來啟動Pod (nginx-cc)

kubectl create deployment nginx-cc --image=nginx -n kube-public

描述某個資源的詳細資訊

kubectl describe deployment nginx-cc -n kube-public
kubectl describe pod nginx-cc-5d7d5c6b54 -n kube-public

檢視名稱空間kube-public中的pod資訊

kubectl get pods -n kube-public

kubectl exec 登入容器

kubectl exec可以跨主機登入容器,docker exec 只能在容器所在主機上登入

kubectl exec -it nginx-cc-df5946cf-6k8rf bash -n kube-public 

重啟(刪除)pod資源

由於存在deployment/rc之類的副本控制器,刪除pod也會重新拉起來

kubectl delete pod nginx-cc-xxxxx -n kube-public

若pod無法刪除,總是處於terminate狀態, 則要強行刪除pod

kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示過渡存活期,預設30s,在刪除pod之前允許POD慢慢終止其上的容器程序,
從而優雅退出,0表示立即終止pod

擴容縮容

kubectl scale deployment nginx-cc --replicas=3 -n kube-public  #擴容
kubectl scale deployment nginx-cc --replicas=1 -n kube-public  #縮容

刪除副本控制器

kubectl delete deployment nginx-cc -n kube-public
kubectl delete deployment/nginx-cc -n kube-public

二、專案的生命週期

建立–>釋出–>更新–>回滾–>刪除

2.1 建立kubectl run命令

  • 建立並執行一個或多個容器映象
  • 建立一個 deployment 或 job 來管理容器
kubectl run --help
##啟動 nginx 範例,暴露容器埠80,設定副本數 3
kubectl run nginx --image=nginx:1.14 --port=80 【--replicas=3】
注:【--replicas=3】 只是用老版本的k8s ,現在的新版本不能使用
kubectl get pods
kubectl get all

2.2 釋出 kubectl expose 命令

將資源暴露為新的Service

kubectl expose --help

為deployment(無狀態部署)的nginx建立service, 並通過Service的80埠轉發至容器的80埠上,Service的名稱為nginx-service, 型別為NodePort

kubectl expose pod nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort

Kubernetes之所以需要Service, 一方面是因為Pod的IP 不是固定的(Pod可能會重建),另一方面則是因為一組Pod範例之間總會有負載均衡的需求。
Service通過label Selector實現的對一組的Pod的存取。
對於容器應用而言,Kubernetes 提供了基於VIP (虛擬IP)的網橋的方式存取 Service, 再由Service 重定向到相應的Pod。
service的型別:

1、ClusterIP:提供一個叢集內部的虛擬IP以供Pod存取( service預設型別

2、NodePort:在每個Node.上開啟一個埠以供外部存取,Kubernetes將會在每個Node.上開啟一個埠並且每個Node的埠都是一樣的,通過NodeIp:NodePort的方式Kubernetes叢集外部的程式可以存取Service。

注:每個埠只能是一種服務,埠範圍只能是30000-32767

3、LoadBalancer:通過外部的負載均衡器來存取,通常在雲平臺部署LoadBalancer還需要額外的費用。

檢視pod網路狀態詳細資訊和Service暴露的埠

kubectl get pods,svc -o wide

檢視關聯後端的節點

kubectl get endpoints

檢視service 的描述資訊

kubect1 describe svc nginx

2.3更新kubectlset

  • 更改現有應用資源一些資訊
  • kubectl set --help

獲取修改模板

kubectl set image --help

檢視當前nginx 的版本號

curl -I http://192.168.111.20:31828
curl -I http://192.168.111.30:31828

將nginx 版本更新為1.15版本

kubectl set image pod/nginx-deployment  nginx=nginx:1.15

處於動態監聽pod狀態,由於使用的是捲動更新方式,所以會先生成--個新的pod,然後刪除--箇舊的pod,往後依次類推(動態更新的)

再看更新好後的Pod的ip會改變

kubectl get pods -o wide

再看nginx 的版本號

2.4回滾kubectlrollout

對資源進行回滾管理

kubectl rollout --help

檢視歷史版本

kubectl rollout history deployment/nginx-test01 -n app

執行回滾到上一個版本

kubectl rollout undo deployment.apps/nginx-test01 -n app

執行回滾到指定版本

kubectl rollout undo deployment.apps/nginx-test01 --to-revision=3 -n app

檢查回滾狀態

kubectl rollout status deployment/nginx

2.5 刪除kubectl delete

//刪除副本控制器
[root@master ~]# kubectl delete deployment/nginx
deployment.extensions "nginx" deleted
//刪除service
[root@master ~]# kubectl delete svc/nginx-service
service "nginx-service" deleted
[root@master ~]# kubectl get all
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        15h
service/nginx        NodePort    10.96.59.53   <none>        80:31670/TCP   15h

2.6金絲雀釋出(Canary Release)

Deployment控制器支援自定義控制更新過程中的捲動節奏,如“暫停(pause)”或“繼續(resume)”更新操作。比如等待第一批新的Pod資源創

建完成後立即暫停更新過程,此時,僅存在一部分新版本的應用,主體部分還是舊的版本。然後,再篩選一小部分的使用者請求路由到新版本的Pod應用,繼續觀察能否穩定地按期望的方式執行。確定沒問題之後再繼續完成餘下的Pod資源捲動更新,否則立即回滾更新操作。這就是所謂的金絲雀釋出。

(1)更新deployment的版本,並設定暫停deployment
kubectl set image deployment/nginx nginx=nginx:1.14 && kubectl rollout pause deployment/nginx
 
kubectl rollout status deployment/nginx
#觀察更新狀態
 
(2)監控更新的過程,可以看到已經新增了一個資源,但是並未按照預期的狀態去刪除一箇舊的資源, 就是因為使用了pause暫停命令
kubectl get pods -W
 
curl [-I] 10.0.0.189
curl [-I] 192.168.111.20:44847
 
(3)確保更新的pod沒問題了,繼續更新
kubectl rollout resume deployment/nginx
 
(4)檢視最後的更新情況
kubectl get pods -W
 
curl [-I] 10.0.0.189
curl [-I] 192.168.111.20:44847

三、宣告式管理方法:YAML檔案

  • 適合於對資源的修改操作
  • 宣告式資源管理方法依賴於資源設定清單檔案對資源進行管理
  • 資源設定清單檔案有兩種格式: yaml(人性化,易讀),json(易於api介面解析)
  • 對資源的管理,是通過事先定義在統一資源設定清單內,再通過陳述式命令應用到k8s叢集裡
  • 語法格式: kubectl create/apply/delete -f xxxx. yaml

3.1 yaml 檔案簡介

YAML,即 YAML Ain’t a Markup Language(YAML 不是一種標示語言)的遞迴縮寫。YAML 其實意思是 Yet Another Markup Language(仍是一種標示語言)。它主要強度這種語言是以資料為中心,而不是以標記為中心,而像 XML 語言就使用了大量的標記。

YAML 可讀性高,易於理解,用來表達資料序列化的格式。它的語法和其他高階語言類似,還可以簡單表達陣列、雜湊表,標量等資料形態。它使用空白符號縮排和大量依賴外觀的特色,特別適合用來表達或編輯資料結構、各種組態檔。

YAML 組態檔字尾為.yml,例如application.yml。

yaml 和 json 的主要區別:

  • YAML 使用空格縮排,這是 Python 開發人員熟悉的領域。
  • JavaScript 開發人員喜歡 JSON,因為它是 JavaScript 的一個子集,可以直接在 JavaScript 中解釋和編寫,同時使用簡寫方式宣告 JSON,在使用沒有空格的典型變數名時,不需要鍵中的雙引號。
  • 有很多解析器在 YAML 和 JSON 的所有語言中都能很好地工作。
  • 在許多情況下,YAML 的空白格式可以更容易檢視,因為格式化需要更人性化的方法。
  • 如果您的編輯器中沒有空格可見或縮排線指示符,那麼 YAML 的空白雖然更緊湊,更容易檢視,但可能難以手動編輯。
  • JSON 的序列化和反序列化要快得多,因為要檢查的功能明顯少於 YAML,這使得更小更輕的程式碼能夠處理 JSON。
  • 一個常見的誤解是 YAML 需要較少的標點符號並且比 JSON 更緊湊,但這完全是錯誤的。空格是不可見的,所以看起來字元較少,但是如果你計算實際的空格是必要的,以便正確解釋 YAML 以及正確的縮排,你會發現 YAML 實際上需要比 JSON 更多的字元。JSON 不使用空格來表示層次結構或分組,並且可以通過刪除不必要的空格來輕鬆展平,以實現更緊湊的傳輸。

3.2YAML語法格式

Kubernetes支援YAML和JSON 格式管理資源物件

JSON格式:主要用於api介面之間訊息的傳遞

YAML格式:用於設定和管理,YAML的設定引數格式比較清晰

語法格式:

大小寫敏感

以空格的方式縮排標識層級關係

通常開頭縮排兩個空格(統一層級對應即可)
不支援製表符“tab”縮排,只使用空格縮排
關鍵詞字元后縮排一個空格,比如冒號,逗號後面需要縮排一個字元
“---”表示YAML格式,一個檔案的開始

支援以“#”表示註釋

3.3yaml檔案組成部分

  • 控制器定義
  • 被控制物件

欄位說明:

apiVersionAPI版本
kind資源型別
metadata資源後設資料
spec資源規格
replicas副本數量
selector標籤選擇器
templatePod模板
metadataPod後設資料
specPod規格
container容器設定

3.4檢視api資源版本標籤

K8S---apiVersion對照表:點選這裡

kubectl api-versions

如果是業務場景,一般首選使用 apps/v1(apps/v1 從 v1.9 版本開始提供 API)。
在 k8s v1.16 版本之前使用的是 extensions/v1beta1,extensions/v1beta1 從 v1.20 版本開始不再提供 Ingress 資源。
帶有 beta 字樣的代表的是測試版本,不用在生產環境中。

3.5 編寫 nginx-deployment.yaml 資源設定清單

mkdir /opt/demo
cd /opt/demo/
參考模板:
vim nginx-deployment.yaml
apiVersion: apps/v1   #指定api版本標籤
kind: Deployment      #定義資源的型別/角色,deployment 為副本控制器,
此處資源型別可以是Deployment、Job、 Ingress、 Service等
metadata:             #定義資源的後設資料資訊,比如資源的名稱、namespace、標籤等資訊
  name: nginx-deployment   #定義資源的名稱,在同一個namespace空間中必須是唯一的
  labels:             #定義資源標籤(Pod的標籤)
    app: nginx
spec:              #定義deployment資源需要的引數屬性,諸如是否在容器失敗時重新啟動容器的屬性
 replicas: 3       #定義副本數量
 selector :        #定義標籤選擇器
  matchLabels:     #定義匹配標籤
    app: nginx     #匹配上面的標籤,需與上面的標籤定義的app保持一致
 template:         #定義業務模板,如果有多個副本,所有副本的屬性會按照模板的相關設定進行匹配
  metadata:
    labels:
      app: nginx
  spec:
   containers:            #定義容器屬性
   - name: nginx          #定義一個容器名,一個- name: 定義一個容器
    image: nginx:1.15.4   #定義容器使用的映象以及版本
    ports:
    - containerPort: 80   #定義容器的對外的埠
範例:
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: kube-public
  labels:
    name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-demo1
  template:
    metadata:
      labels:
        app: nginx-demo1
    spec:
      containers:
        - name: nginx
          image: nginx:1.15.4
          ports:
            - name: http
              containerPort: 80

建立資源物件

kubectl create -f nginx-deployment.yaml
或者
kubectl apply -f nginx-deployment.yaml

檢視建立的pod資源

kubectl get pods -o wide -n kube-public
kubectl get deploy -n kube-public

3.6 建立service服務對外提供存取並測試

apiVersion: v1
kind: Service
metadata:
  name: nginx-demo1
  namespace: kube-public
  labels:
    name: nginx-demo1
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 80
      nodePort: 31333
  selector:
    app: nginx-demo1

kubectl apply -f nginx-server.yaml
kubectl get svc -n kube-public

在瀏覽器輸入 nodeIP: nodePort 即可存取
http://192.168.111.20:31333
http://192.168.111.30:31333

四、k8s中的port概述

●port
port是k8s叢集內部存取service的埠,即通過clusterIP: port可以從Pod所在的Node. 上存取到service

●nodePort
nodePort是外部存取k8s叢集中service的埠,通過nodeIP: nodePort 可以從外部存取到某個service。

●targetPort
targetPort是Pod的埠,從port或nodePort來的流量經過kube-proxy 反向代理負載均衡轉發到後端Pod的targetPort上,最後進入容器。

●containerPort
containerPort是Pod內部容器的埠,targetPort 對映到containerPort

4.1建立yaml檔案模板

kubectl run --dry-run 列印相應的API 物件 而不執行建立

--dry-run:試執行

kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run

--dry-run表示試執行,不真正執行命令(測試命令是否正確),即並不會真的建立出 pod 和 deployment 範例,去掉該引數後即可真正執行命令。

檢視生成yaml格式

使用--dry-run試執行可不觸發生成命令,然後通過-o yaml可實現對其 yaml 資源設定清單的檢視

kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml

檢視生成json格式

可通過 -o json 檢視該命令產生的 json 設定清單

kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o json 

使用yaml格式匯出生成模板,並進行修改以及刪除一些不必要的引數

kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml > nginx-test.yaml

模板:
vim nginx-test.yaml
apiVersion: apps/v1betal     #api 版本改成 api/v1
kind: Deployment
metadata:
  creationTimestamp: null    #刪除
  labels:
    run: nginx-test
  name: nginx-test
spec: 
  replicas: 3
  selector: 
    matchLabels: 
      run: nginx-test
  strategy: {}                #刪除
  template: 
    metadata: 
      creationTimestamp: null #刪除
      labels: 
        run: nginx-test
    spec: 
      containers: 
      - image: nginx
        name: nginx-test
        ports: 
        - containerPort: 80
        resources: {}         #刪除
status: {}                    #刪除
 
例:
apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx-demo2
  name: nginx-demo2
  namespace: kube-public
spec:
  ports:
  - port: 8044
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx-demo2
  type: NodePort

生成映象並檢視

kubectl apply -f nginx-test.yaml
kubectl get svc -n kube-public

將現有的資源生成模板匯出

kubectl get pod/nginx-deployment-6f9f6d866c-2w9gz  -o yaml -n kube-public
###注現在最新版本的kubctl  get 不支援 --export 引數 

儲存到檔案中

kubectl get deployment.apps/nginx-deployment -o yaml -n kube-public > my-deploy.yaml

檢視欄位幫助資訊

explain 可一層層的檢視相關資源物件的幫助資訊

kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers

4.2 怎樣更輕鬆的寫yaml

4.2.1 用run命令生成

沒有相關資源,使用run或者create命令--dry-run選項,後期可以修改yaml檔案。

kubectl run my-deploy --image=nginx --dry-run -o yaml > my-deploy.yaml

4.2.2用get命令匯出

已有相關資源,使用get命令 【--export選項 :適用老版本的kubectl】

kubectl get deploy/nginx-deployment  -o=yaml -n kube-public > new.yaml

yaml檔案的學習方法

(1)多看別人(官方)寫的,能讀懂
(2)能照著現場的檔案改著用
(3)遇到不懂的,善用kubectl explain ...命令查

到此這篇關於K8S 中 kubectl 命令的文章就介紹到這了,更多相關K8S  kubectl 命令內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com