1. 程式人生 > >Kubernetes之kubectl命令列工具簡介、安裝配置及常用命令

Kubernetes之kubectl命令列工具簡介、安裝配置及常用命令

kubectl概述

kubectl是Kubernetes叢集的命令列工具,通過kubectl能夠對叢集本身進行管理,並能夠在叢集上進行容器化應用的安裝部署。執行kubectl命令的語法如下所示:

$ kubectl [command] [TYPE] [NAME] [flags]

comand:指定要對資源執行的操作,例如create、get、describe和delete

TYPE:指定資源型別,資源型別是大小學敏感的,開發者能夠以單數、複數和縮略的形式。例如:

    $ kubectl get pod pod1
    $ kubectl get pods pod1
    $ kubectl get po pod1

    NAME:指定資源的名稱,名稱也大小寫敏感的。如果省略名稱,則會顯示所有的資源,例如:

 $ kubectl get pods

    flags:指定可選的引數。例如,可以使用-s或者–server引數指定Kubernetes API server的地址和埠。

另外,可以通過kubectl help命令獲取更多的資訊。

    Basic Commands (Beginner):
      create         Create a resource from a file or from stdin.
      expose         使用 replication controller, service, deployment 或者 pod 並暴露它作為一個 新的
    Kubernetes Service
      run            在叢集中執行一個指定的映象
      set            為 objects 設定一個指定的特徵
     
    Basic Commands (Intermediate):
      explain        檢視資源的文件
      get            顯示一個或更多 resources
      edit           在伺服器上編輯一個資源
      delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector
     
    Deploy Commands:
      rollout        Manage the rollout of a resource
      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的常用命令

kubectl作為kubernetes的命令列工具,主要的職責就是對叢集中的資源的物件進行操作,這些操作包括對資源物件的建立、刪除和檢視等。下表中顯示了kubectl支援的所有操作,以及這些操作的語法和描述資訊:
操作     語法     描述
annotate     kubectl annotate (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]     新增或更新一個或多個資源的註釋
api-versions     kubectl api-versions [flags]     列出可用的API版本
apply     kubectl apply -f FILENAME [flags]     將來自於檔案或stdin的配置變更應用到主要物件中。
attach     kubectl attach POD -c CONTAINER [-i] [-t] [flags]     連線到正在執行的容器上,以檢視輸出流或與容器互動(stdin)。
autoscale     kubectl autoscale (-f FILENAME \| TYPE NAME \| TYPE/NAME) [–min=MINPODS] –max=MAXPODS [–cpu-percent=CPU] [flags]     自動擴宿容由副本控制器管理的Pod。
cluster-info     kubectl cluster-info [flags]     顯示群集中的主節點和服務的的端點資訊。
config     kubectl config SUBCOMMAND [flags]     修改kubeconfig檔案。
create     kubectl create -f FILENAME [flags]     從檔案或stdin中建立一個或多個資源物件。
delete     kubectl delete (-f FILENAME \| TYPE [NAME \| /NAME \| -l label \| –all]) [flags]     刪除資源物件。
describe     kubectl describe (-f FILENAME \| TYPE [NAME_PREFIX \| /NAME \| -l label]) [flags]     顯示一個或者多個資源物件的詳細資訊。
edit     kubectl edit (-f FILENAME \| TYPE NAME \| TYPE/NAME) [flags]     通過預設編輯器編輯和更新伺服器上的一個或多個資源物件。
exec     kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [– COMMAND [args…]]     在Pod的容器中執行一個命令。
explain     kubectl explain [–include-extended-apis=true] [–recursive=false] [flags]     獲取Pod、Node和服務等資源物件的文件。
expose     kubectl expose (-f FILENAME \| TYPE NAME \| TYPE/NAME) [–port=port] [–protocol=TCP\|UDP] [–target-port=number-or-name] [–name=name] [—-external-ip=external-ip-of-service] [–type=type] [flags]     為副本控制器、服務或Pod等暴露一個新的服務。
get     kubectl get (-f FILENAME \| TYPE [NAME \| /NAME \| -l label]) [–watch] [–sort-by=FIELD] [[-o \| –output]=OUTPUT_FORMAT] [flags]     列出一個或多個資源。

 

 
label     kubectl label (-f FILENAME \| TYPE NAME \| TYPE/NAME) KEY_1=VAL_1 … KEY_N=VAL_N [–overwrite] [–all] [–resource-version=version] [flags]     新增或更新一個或者多個資源物件的標籤。
logs     kubectl logs POD [-c CONTAINER] [–follow] [flags]     顯示Pod中一個容器的日誌。
patch     kubectl patch (-f FILENAME \| TYPE NAME \| TYPE/NAME) –patch PATCH [flags]     使用策略合併補丁過程更新資源物件中的一個或多個欄位。
port-forward     kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT […[LOCAL_PORT_N:]REMOTE_PORT_N] [flags]     將一個或多個本地埠轉發到Pod。
proxy     kubectl proxy [–port=PORT] [–www=static-dir] [–www-prefix=prefix] [–api-prefix=prefix] [flags]     為kubernetes API伺服器執行一個代理。
replace     kubectl replace -f FILENAME     從檔案或stdin中替換資源物件。
rolling-update     kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] –image=NEW_CONTAINER_IMAGE \| -f NEW_CONTROLLER_SPEC) [flags]     通過逐步替換指定的副本控制器和Pod來執行滾動更新。
run     kubectl run NAME –image=image [–env=”key=value”] [–port=port] [–replicas=replicas] [–dry-run=bool] [–overrides=inline-json] [flags]     在叢集上執行一個指定的映象。
scale     kubectl scale (-f FILENAME \| TYPE NAME \| TYPE/NAME) –replicas=COUNT [–resource-version=version] [–current-replicas=count] [flags]     擴宿容副本集的數量。
            
version     kubectl version [–client] [flags]     顯示執行在客戶端和伺服器端的Kubernetes版本。
 kubectl輸出選項

kubectl預設的輸出格式為純文字格式,可以通過-o或者–output欄位指定命令的輸出格式。

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

 
kubernetes資源物件型別

在kubernetes中,提供了很多的資源物件,開發和運維人員可以通過這些物件對容器進行編排。在下表中,是kubectl所支援的資源物件型別,以及它們的縮略別名:
資源物件型別     縮略別名
apiservices     
certificatesigningrequests     csr
clusters     
clusterrolebindings     
clusterroles     
componentstatuses     cs
configmaps     cm
controllerrevisions     
cronjobs     
customresourcedefinition     crd
daemonsets     ds
deployments     deploy
endpoints     ep
events     ev
horizontalpodautoscalers     hpa
ingresses     ing
jobs     
limitranges     limits
namespaces     ns
networkpolicies     netpol
nodes     no
persistentvolumeclaims     pvc
persistentvolumes     pv
poddisruptionbudget     pdb
podpreset     
pods     po
podsecuritypolicies     psp
podtemplates     
replicasets     rs
replicationcontrollers     rc
resourcequotas     quota
rolebindings     
roles     
secrets     
serviceaccounts     sa
services     svc
statefulsets     
storageclasses     
kubectl安裝部署

1、安裝kubectl

    sudo apt-get update && sudo apt-get install -y apt-transport-https
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    sudo touch /etc/apt/sources.list.d/kubernetes.list
    echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    sudo apt-get install -y kubectl

其他作業系統下安裝kubectl,請參考:https://kubernetes.io/docs/tasks/tools/install-kubectl/#tabset-2

2、配置kubeconfig檔案

RKE會在配置檔案所在的目錄下部署一個本地檔案,該檔案中包含kube配置資訊以連線到新生成的群集。

預設情況下,kube配置檔案被稱為.kube_config_cluster.yml。將這個檔案複製到你的本地~/.kube/config,就可以在本地使用kubectl了。

需要注意的是,部署的本地kube配置名稱是和叢集配置檔案相關的。例如,如果您使用名為mycluster.yml的配置檔案,則本地kube配置將被命名為.kube_config_mycluster.yml。

3、手動設定Kubectl 上下文和配置

設定 kubectl 與其通訊的 Kubernetes 叢集,以及修改配置資訊。

    $ kubectl config view # 顯示合併的 kubeconfig 設定。
     
    # 同時使用多個 kubeconfig 檔案,並且檢視合併的配置
    $ KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 kubectl config view
     
    # 檢視名稱為 “e2e” 的使用者的密碼
    $ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'
     
    $ kubectl config current-context              # 顯示當前上下文
    $ kubectl config use-context my-cluster-name  # 設定預設的上下文為 my-cluster-name
     
    # 在 kubeconf 中新增一個支援基本鑑權的新叢集。
    $ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword
     
    # 使用特定的使用者名稱和名稱空間設定上下文。
    $ kubectl config set-context gce --user=cluster-admin --namespace=foo \
      && kubectl config use-context gce

4、驗證

執行kubectl命令,獲取nodes的資訊:

$ kubectl get nodes

kubectl的常用命令示例

在此部分將提供常用命令的示例,已幫助您快速瞭解和試用kubectl。

1、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
     
    # 使用多個 key 建立一個 secret
    $ cat <<EOF | kubectl create -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      password: $(echo -n "s33msi4" | base64)
      username: $(echo -n "jane" | base64)
    EOF
     

2、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}'
     
    # 列出輸出特定 RC 的所有 pod 的名稱
    # "jq" 命令對那些 jsonpath 看來太複雜的轉換非常有用,可以在這找到:https://stedolan.github.io/jq/
    $ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?}
    $ echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name})
     
    # 檢查那些節點已經 ready
    $ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \
     && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
     
    # 列出某個 pod 目前在用的所有 Secret
    $ kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
     
    # 列出通過 timestamp 排序的所有 Event
    $ kubectl get events --sort-by=.metadata.creationTimestamp

3、kubectl describe命令

此命令用於顯示一個或多個資源物件的詳細資訊,在這裡通過獲取上述nginx部署的資訊。

$ kubectl describe deployments/nginx

4、kubectl exec命令

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

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

5、kubectl logs命令

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

$ kubectl logs nginx-c5cff9dcc-dr88w

6、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,包括未初始化的物件

7、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        # 中止進行中的過程
    $ cat pod.json | kubectl replace -f -                              # 根據傳入標準輸入的 JSON 替換一個 pod
     
    # 強制替換,先刪除,然後再重建資源。會導致服務中斷。
    $ kubectl replace --force -f ./pod.json
     
    # 為副本控制器(rc)建立服務,它開放 80 埠,並連線到容器的 8080 埠
    $ kubectl expose rc nginx --port=80 --target-port=8000
     

8、kubectl patch命令

    $ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 部分更新節點
     
    # 更新容器的映象,spec.containers[*].name 是必需的,因為它們是一個合併鍵
    $ kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
     
    # 使用帶有陣列位置資訊的 json 修補程式更新容器映象
    $ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
     
    # 使用帶有陣列位置資訊的 json 修補程式禁用 deployment 的 livenessProbe
    $ kubectl patch deployment valid-deployment  --type json   -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]'
     
    # 增加新的元素到陣列指定的位置中
    $ kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'

9、kubectl edit命令

    $ kubectl edit svc/docker-registry                      # 編輯名稱為 docker-registry 的 service
    $ KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用 alternative 編輯器

10、kubectl scale命令

    $ kubectl scale --replicas=3 rs/foo                                 # 縮放名稱為 'foo' 的 replicaset,調整其副本數為 3
    $ kubectl scale --replicas=3 -f foo.yaml                            # 縮放在 "foo.yaml" 中指定的資源,調整其副本數為 3
    $ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # 如果名稱為 mysql 的 deployment 目前規模為 2,將其規模調整為 3
    $ kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # 縮放多個副本控制器

11、與執行中的 pod 互動

    $ kubectl logs my-pod                                 # 轉儲 pod 日誌到標準輸出
    $ kubectl logs my-pod -c my-container                 # 有多個容器的情況下,轉儲 pod 中容器的日誌到標準輸出
    $ kubectl logs -f my-pod                              # pod 日誌流向標準輸出
    $ kubectl logs -f my-pod -c my-container              # 有多個容器的情況下,pod 中容器的日誌流到標準輸出
    $ kubectl run -i --tty busybox --image=busybox -- sh  # 使用互動的 shell 執行 pod
    $ kubectl attach my-pod -i                            # 關聯到執行中的容器
    $ kubectl port-forward my-pod 5000:6000               # 在本地監聽 5000 埠,然後轉到 my-pod 的 6000 埠
    $ kubectl exec my-pod -- ls /                         # 1 個容器的情況下,在已經存在的 pod 中執行命令
    $ kubectl exec my-pod -c my-container -- ls /         # 多個容器的情況下,在已經存在的 pod 中執行命令
    $ kubectl top pod POD_NAME --containers               # 顯示 pod 及其容器的度量

12、與 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