Kubernetes集羣管理工具kubectl命令技巧大全

一. kubectl概述

Kubectl是用於控制Kubernetes集羣的命令行工具,經過kubectl可以對集羣自己進行管理,並可以在集羣上進行容器化應用的安裝部署。html

kubectl命令的語法以下所示:node

kubectl [command] [TYPE] [NAME] [flags]
  • comand:指定要在一個或多個資源執行,例如操做create,get,describe,delete。nginx

  • TYPE:指定資源類型,資源類型不區分大小寫,您能夠指定單數,複數或縮寫形式。例如,如下命令產生相同的輸出:git

kubectl get pod pod1 
kubectl get pods pod1 
kubectl get po pod1
  • NAME:指定資源的名稱,名稱區分大小寫。若是省略名稱,則顯示全部資源的詳細信息,例如:
kubectl get pods
  • flags:指定可選的參數。例如,可使用-s或者–server參數指定Kubernetes API server的地址和端口。

注意:在命令行中指定的標誌將覆蓋默認值和任何相應的環境變量。web

若是須要幫助,能夠經過kubectl help命令獲取更多的信息。docker

二. kubectl操做的簡短說明和常規語法

Basic Commands (Beginner):
  create         從文件或標準輸入建立一個或多個資源
  expose         使用 replication controller, service, deployment 或者 pod 並暴露它做爲一個 新的
Kubernetes Service
  run            在集羣中運行一個指定的鏡像
  set            爲 objects 設置一個指定的特徵
 
Basic Commands (Intermediate):
  explain        查看資源的文檔
  get            顯示一個或更多 resources
  edit           使用默認編輯器編輯和更新服務器上一個或多個資源的定義
  delete         從文件,stdin或指定標籤選擇器,名稱,資源選擇器或資源中刪除資源
 
Deploy Commands:
  rollout        經過逐漸替換指定的複製控制器及其容器來執行滾動更新
  scale          爲 Deployment, ReplicaSet, Replication Controller 或者 Job 設置一個新的副本數量
  autoscale      自動調整一個 Deployment, ReplicaSet, 或者 ReplicationController 的副本數量
 
Cluster Management Commands:
  certificate    修改 certificate 資源
  cluster-info   顯示集羣信息
  top            Display Resource (CPU/Memory/Storage) usage.
  cordon         標記 node 爲 unschedulable
  uncordon       標記 node 爲 schedulable
  drain          Drain node in preparation for maintenance
  taint          更新一個或者多個 node 上的 taints
 
Troubleshooting and Debugging Commands:
  describe       顯示一個指定 resource 或者 group 的 resources 詳情
  logs           輸出容器在 pod 中的日誌
  attach         Attach 到一個運行中的 container
  exec           在一個 container 中執行一個命令
  port-forward   Forward one or more local ports to a pod
  proxy          運行一個 proxy 到 Kubernetes API server
  cp             複製 files 和 directories 到 containers 和從容器中複製 files 和 directories.
  auth           Inspect authorization
 
Advanced Commands:
  apply          經過文件名或標準輸入流(stdin)對資源進行配置
  patch          使用 strategic merge patch 更新一個資源的 field(s)
  replace        經過 filename 或者 stdin替換一個資源
  wait           Experimental: Wait for one condition on one or many resources
  convert        在不一樣的 API versions 轉換配置文件
 
Settings Commands:
  label          更新在這個資源上的 labels
  annotate       更新一個資源的註解
  completion     Output shell completion code for the specified shell (bash or zsh)
 
Other Commands:
  alpha          Commands for features in alpha
  api-resources  Print the supported API resources on the server
  api-versions   Print the supported API versions on the server, in the form of "group/version"
  config         修改 kubeconfig 文件
  plugin         Runs a command-line plugin
  version        輸出 client 和 server 的版本信息

有關命令操做的更多信息,請參見kubectl官方參考文檔shell

三. kubectl經常使用命令

kubectl做爲kubernetes的命令行工具,主要的職責就是對集羣中的資源的對象進行操做,這些操做包括對資源對象的建立、刪除和查看等。json

四. kubectl輸出選項

全部kubectl命令的默認輸出格式是人類可讀的純文本格式。要以特定格式將詳細信息輸出到終端窗口,能夠將-o--output標誌添加到受支持的kubectl命令中,例:api

kubectl [command] [TYPE] [NAME] -o=<output_format>

根據kubectl操做,支持如下輸出格式bash

輸出格式 描述
-o custom-columns= spec 使用逗號分隔的自定義列列表打印表。
-o custom-columns-file=filename 使用文件中的自定義列模板打印表
-o json 輸出JSON格式的API對象。
-o jsonpath=template 打印在jsonpath表達式中定義的字段。
-o jsonpath-file=filename 打印文件中jsonpath表達式定義的字段
-o name 僅打印資源名稱,而不打印其餘任何內容。
-o wide 以純文本格式輸出,並帶有任何其餘信息。對於Pod,包含節點名稱。
-o yaml 輸出YAML格式的API對象。

示例:

如下命令將單個pod的詳細信息輸出爲YAML格式的對象

kubectl get pod web-pod-13je7 -o yaml

五. kubectl經常使用命令示例

一、kubectl create命令

此命令經過文件或者stdin建立一個資源對象,假設這裏存在一個nginx部署的YAML配置文件,能夠經過執行下面的命令建立部署對象。

kubectl create -f nginx-deployment.yaml

nginx部署的YAML配置文件的示例代碼以下:

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      imagePullSecrets:
        - name: dc-hspfd
      containers:
      # 應用的鏡像
      - image: nginx
        name: nginx
        imagePullPolicy: IfNotPresent
        # 應用的內部端口
        ports:
        - containerPort: 80
          name: nginx80
        # 持久化掛接位置,在docker中      
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: nginx-data
        - mountPath: /etc/nginx
          name: nginx-conf
      volumes:
      # 宿主機上的目錄
      - name: nginx-data
        nfs:
          path: /nfs/nginx
          server: 192.168.1.10
      - name: nginx-conf
        nfs:
          path: /k8s-nfs/nginx/conf
          server: 192.168.1.10

Kubernetes 清單能夠用 json 或 yaml 來定義。使用的文件擴展名包括 .yaml, .yml 和 .json。

kubectl create -f ./my-manifest.yaml           # 建立資源
kubectl create -f ./my1.yaml -f ./my2.yaml     # 從多個文件建立資源
kubectl create -f ./dir                        # 經過目錄下的全部清單文件建立資源
kubectl create -f https://git.io/vPieo         # 使用 url 獲取清單建立資源
kubectl run nginx --image=nginx                # 開啓一個 nginx 實例
kubectl explain pods,svc                       # 獲取 pod 和服務清單的描述文檔
  • 經過標準輸入建立多個 YAML 對象
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000"
EOF

二、kubectl get 命令

經過此命令列出一個或多個資源對象,在這裏經過kubectl get命令獲取default命名空間下的全部部署。

kubectl get deployment
# 具備基本輸出的 get 命令
kubectl get services                          # 列出命名空間下的全部 service
kubectl get pods --all-namespaces             # 列出全部命名空間下的 pod
kubectl get pods -o wide                      # 列出命名空間下全部 pod,帶有更詳細的信息
kubectl get deployment my-dep                 # 列出特定的 deployment
kubectl get pods --include-uninitialized      # 列出命名空間下全部的 pod,包括未初始化的對象
 
# 有詳細輸出的 describe 命令
kubectl describe nodes my-node
kubectl describe pods my-pod
 
kubectl get services --sort-by=.metadata.name # List Services Sorted by Name
# 根據重啓次數排序,列出全部 pod
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
 
# 查詢帶有標籤 app=cassandra 的全部 pod,獲取它們的 version 標籤值
kubectl get pods --selector=app=cassandra rc -o \
  jsonpath='{.items[*].metadata.labels.version}'
# 獲取命名空間下全部運行中的 pod
kubectl get pods --field-selector=status.phase=Running
 
# 全部全部節點的 ExternalIP
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

三、kubectl describe命令

此命令用於顯示一個或多個資源對象的詳細信息,在這裏經過獲取上述nginx部署的信息。

kubectl describe deployments/nginx

四、kubectl exec命令

此命令用於在Pod中的容器上執行一個命令,此處在nginx的一個容器上執行/bin/bash命令。

kubectl exec -it nginx-c5cff9dcc-dr88w /bin/bash

五、kubectl logs命令

此命令用於獲取Pod中一個容器的日誌信息,此處獲取nginx一個容器的日誌信息。

kubectl logs nginx-c5cff9dcc-dr88w

六、kubectl delete命令

此命令用於刪除集羣中已存在的資源對象,能夠經過指定名稱、標籤選擇器、資源選擇器等。

kubectl delete -f ./pod.json                                              # 使用 pod.json 中指定的類型和名稱刪除 pod
kubectl delete pod,service baz foo                                        # 刪除名稱爲 "baz" 和 "foo" 的 pod 和 service
kubectl delete pods,services -l name=myLabel                              # 刪除帶有標籤 name=myLabel 的 pod 和 service
kubectl delete pods,services -l name=myLabel --include-uninitialized      # 刪除帶有標籤 name=myLabel 的 pod 和 service,包括未初始化的對象
kubectl -n my-ns delete po,svc --all                                      # 刪除命名空間 my-ns 下全部的 pod 和 service,包括未初始化的對象

七、kubectl edit 命令

使用默認編輯器 編輯服務器上定義的資源。

使用命令行工具獲取的任何資源均可以使用edit命令編輯。edit命令會打開使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR環境變量定義的編輯器,能夠同時編輯多個資源,但所編輯過的資源只會一次性提交。edit除命令參數外還接受文件名形式。

文件默認輸出格式爲YAML。要以JSON格式編輯,請指定「-o json」選項。

語法:

kubectl edit (RESOURCE/NAME | -f FILENAME)

示例:

# 編輯名爲「docker-registry」的service
kubectl edit svc/docker-registry

# 使用一個不一樣的編輯器
KUBE_EDITOR="nano" kubectl edit svc/docker-registry

# 編輯名爲「docker-registry」的service,使用JSON格式、v1 API版本
 kubectl edit svc/docker-registry --output-version=v1 -o json

選項:

-f, --filename=[]: 用來指定待編輯資源的文件名,目錄名或者URL。
  -o, --output="yaml": 輸出格式,可選yaml或者json中的一種。
       --output-version="": 輸出資源使用的API版本(默認使用api-version)。

八、kubectl rolling-update 命令

此命令用於滾動更新,對鏡像、端口等的更新

kubectl rolling-update frontend-v1 -f frontend-v2.json           # 滾動更新 pod:frontend-v1
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2  # 變動資源的名稱並更新鏡像
kubectl rolling-update frontend --image=image:v2                 # 更新 pod 的鏡像
kubectl rolling-update frontend-v1 frontend-v2 --rollback        # 停止進行中的過程
at pod.json | kubectl replace -f -                              # 根據傳入標準輸入的 JSON 替換一個 pod

九、node 和集羣管理

kubectl cordon my-node                                                # #標記節點 my-node 爲不可調度
kubectl drain my-node                                                 # #準備維護時,排除節點 my-node
kubectl uncordon my-node                                              # #標記節點 my-node 爲可調度
kubectl top node my-node                                              # #顯示給定節點的度量值
kubectl cluster-info                                                  # #顯示 master 和 service 的地址
kubectl cluster-info dump                                             # #將集羣的當前狀態轉儲到標準輸出
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # #將集羣的當前狀態轉儲到目錄 /path/to/cluster-state
 
# 若是帶有該鍵和效果的污點已經存在,則將按指定的方式替換其值
kubectl taint nodes foo dedicated=special-user:NoSchedule

參考資料

1.《kubectl概述》:https://kubernetes.io/docs/reference/kubectl/overview/#syntax

2.《kubectl命令概述》:https://kubernetes.io/docs/reference/kubectl/overview/#syntax

相關文章
相關標籤/搜索