Kubernetes之kubectl經常使用命令

最近項目有用到Kubernetes做集羣配置,因此學習下相關命令,記錄下以備下次使用...java

kubectl help 顯示具體的用法node

kubectl controls the Kubernetes cluster manager.

Find more information at https://github.com/kubernetes/kubernetes.

Usage:
  kubectl [flags]
  kubectl [command]

Available Commands:
  get            Display one or many resources
  describe       Show details of a specific resource or group of resources
  create         Create a resource by filename or stdin
  replace        Replace a resource by filename or stdin.
  patch          Update field(s) of a resource using strategic merge patch.
  delete         Delete resources by filenames, stdin, resources and names, or by resources and label selector.
  edit           Edit a resource on the server
  apply          Apply a configuration to a resource by filename or stdin
  namespace      SUPERSEDED: Set and view the current Kubernetes namespace
  logs           Print the logs for a container in a pod.
  rolling-update Perform a rolling update of the given ReplicationController.
  scale          Set a new size for a Replication Controller, Job, or Deployment.
  cordon         Mark node as unschedulable
  drain          Drain node in preparation for maintenance
  uncordon       Mark node as schedulable
  attach         Attach to a running container.
  exec           Execute a command in a container.
  port-forward   Forward one or more local ports to a pod.
  proxy          Run a proxy to the Kubernetes API server
  run            Run a particular image on the cluster.
  expose         Take a replication controller, service or pod and expose it as a new Kubernetes Service
  autoscale      Auto-scale a deployment or replication controller
  rollout        rollout manages a deployment
  label          Update the labels on a resource
  annotate       Update the annotations on a resource
  config         config modifies kubeconfig files
  cluster-info   Display cluster info
  api-versions   Print the supported API versions on the server, in the form of "group/version".
  version        Print the client and server version information.
  explain        Documentation of resources.
  convert        Convert config files between different API versions

Flags:
      --alsologtostderr[=false]: log to standard error as well as files
      --certificate-authority="": Path to a cert. file for the certificate authority.
      --client-certificate="": Path to a client certificate file for TLS.
      --client-key="": Path to a client key file for TLS.
      --cluster="": The name of the kubeconfig cluster to use
      --context="": The name of the kubeconfig context to use
      --insecure-skip-tls-verify[=false]: If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure.
      --kubeconfig="": Path to the kubeconfig file to use for CLI requests.
      --log-backtrace-at=:0: when logging hits line file:N, emit a stack trace
      --log-dir="": If non-empty, write log files in this directory
      --log-flush-frequency=5s: Maximum number of seconds between log flushes
      --logtostderr[=true]: log to standard error instead of files
      --match-server-version[=false]: Require server version to match client version
      --namespace="": If present, the namespace scope for this CLI request.
      --password="": Password for basic authentication to the API server.
  -s, --server="": The address and port of the Kubernetes API server
      --stderrthreshold=2: logs at or above this threshold go to stderr
      --token="": Bearer token for authentication to the API server.
      --user="": The name of the kubeconfig user to use
      --username="": Username for basic authentication to the API server.
      --v=0: log level for V logs
      --vmodule=: comma-separated list of pattern=N settings for file-filtered logging

Use "kubectl [command] --help" for more information about a command.

get命令獲取全部資源的詳細信息nginx

kubectl get 會顯示具體的信息git

kubectl get po -o wide 獲取pod運行在哪一個節點上的信息github

 

describe相似於get,一樣用於獲取resource的相關信息。不一樣的是,get得到的是更詳細的resource個性的詳細信息,describe得到的是resource集羣相關的信息。describe命令同get相似,可是describe不支持-o選項,對於同一類型resource,describe輸出的信息格式,內容域相同。 web

kubectl describe pod pod名docker

create

ubectl命令用於根據文件或輸入建立集羣resource。若是已經定義了相應resource的yaml或son文件,直接kubectl create -f filename便可建立文件內定義的resource。也能夠直接只用子命令[namespace/secret/configmap/serviceaccount]等直接建立相應的resource。從追蹤和維護的角度出發,建議使用json或yaml的方式定義資源。 
     如,前面get中獲取的兩個nginx pod的replication controller文件內容以下。文件名爲:rc-nginx.yaml 
shell

apiVersion: v1
kind: ReplicationController
metadata:
  name: siweb
  labels:
    app: si
    tier: web
spec:
  template:
    metadata:
      labels:
        app: si
        tier: web
    spec:
      nodeName: 10.18.97.152
      containers:
      - imageSiweb
        name: siweb-war
        lifecycle:
          postStart:
            exec:
              command:
                - "cp"
                - "/siweb.war"
                - "/app"
        volumeMounts:
        - mountPath: /app
          name: webapps-volume
      - image: 192.168.1.1/ismp/tomcat
        name: siweb
        volumeMounts:
        - mountPath: /usr/local/tomcat/webapps
          name: webapps-volume
        ports:
        - containerPort: 8080
          hostPort: 8003
      volumes:
      - name: webapps-volume
        emptyDir: {}

直接使用create則能夠基於rc-nginx.yaml文件建立出ReplicationController(rc),rc會建立兩個副本:json

kubectl create -f rc-nginx.yaml  

建立後,使用「kubectl get rc」能夠看到一個名爲rc-nginx-2的ReplicationController將被建立,同時「kubectl get po」的結果中會多出兩個前綴爲「rc-nginx-2-」的podvim

replace

replace命令用於對已有資源進行更新、替換。如前面create中建立的nginx,當咱們須要更新resource的一些屬性的時候,若是修改副本數量,增長、修改label,更改image版本,修改端口等。均可以直接修改原yaml文件,而後執行replace命令。 
     注:名字不能被更更新。另外,若是是更新label,原有標籤的pod將會與更新label後的rc斷開聯繫,有新label的rc將會建立指定副本數的新的pod,可是默認並不會刪除原來的pod。因此此時若是使用get po將會發現pod數翻倍,進一步check會發現原來的pod已經不會被新rc控制.
ubectl replace -f rc-nginx.yaml

  

 patch

若是一個容器已經在運行,這時須要對一些容器屬性進行修改,又不想刪除容器,或不方便經過replace的方式進行更新。kubernetes還提供了一種在容器運行時,直接對容器進行修改的方式,就是patch命令。 
     如前面建立pod的label是app=nginx-2,若是在運行過程當中,須要把其label改成app=nginx-3,這patch命令以下: 
kubectl patch pod rc-nginx-2-kpiqt -p '{"metadata":{"labels":{"app":"nginx-3"}}}'  

  

7. edit

     edit提供了另外一種更新resource源的操做,經過edit可以靈活的在一個common的resource基礎上,發展出更過的significant resource。例如,使用edit直接更新前面建立的pod的命令爲: 
kubectl edit po rc-nginx-btv4j 

  

上面命令的效果等效於: 
kubectl get po rc-nginx-btv4j -o yaml >> /tmp/nginx-tmp.yaml   
vim /tmp/nginx-tmp.yaml   
/*do some changes here */   
kubectl replace -f /tmp/nginx-tmp.yaml 

  

8. Delete

kubectl delete -f rc-nginx.yaml   
kubectl delete po rc-nginx-btv4j   
kubectl delete po -lapp=nginx-2   

  

9. apply

     apply命令提供了比patch,edit等更嚴格的更新resource的方式。經過apply,用戶能夠將resource的configuration使用source control的方式維護在版本庫中。每次有更新時,將配置文件push到server,而後使用kubectl apply將更新應用到resource。kubernetes會在引用更新前將當前配置文件中的配置同已經應用的配置作比較,並只更新更改的部分,而不會主動更改任何用戶未指定的部分。 
     apply命令的使用方式同replace相同,不一樣的是,apply不會刪除原有resource,而後建立新的。apply直接在原有resource的基礎上進行更新。同時kubectl apply還會resource中添加一條註釋,標記當前的apply。相似於git操做。 
      

10. logs

     logs命令用於顯示pod運行中,容器內程序輸出到標準輸出的內容。跟docker的logs命令相似。若是要得到tail -f 的方式,也可使用-f選項。 
kubectl logs rc-nginx-2-kpiqt 

  

 

11. rolling-update

     rolling-update是一個很是重要的命令,對於已經部署而且正在運行的業務,rolling-update提供了不中斷業務的更新方式。rolling-update每次起一個新的pod,等新pod徹底起來後刪除一箇舊的pod,而後再起一個新的pod替換舊的pod,直到替換掉全部的pod。 
     rolling-update須要確保新的版本有不一樣的name,Version和label,不然會報錯 。
kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml   

  


 

若是在升級過程當中,發現有問題還能夠中途中止update,並回滾到前面版本 
kubectl rolling-update rc-nginx-2 —rollback

  

     rolling-update還有不少其餘選項提供豐富的功能,如—update-period指定間隔週期,使用時可使用-h查看help信息 

12. scale 

     scale用於程序在負載加劇或縮小時副本進行擴容或縮小,如前面建立的nginx有兩個副本,能夠輕鬆的使用scale命令對副本數進行擴展或縮小。 
擴展副本數到4:
kubectl scale rc rc-nginx-3 —replicas=4   

  

 

從新縮減副本數到2:
kubectl scale rc rc-nginx-3 —replicas=2

   

13. autoscale

     scale雖然可以很方便的對副本數進行擴展或縮小,可是仍然須要人工介入,不能實時自動的根據系統負載對副本數進行擴、縮。autoscale命令提供了自動根據pod負載對其副本進行擴縮的功能。 
     autoscale命令會給一個rc指定一個副本數的範圍,在實際運行中根據pod中運行的程序的負載自動在指定的範圍內對pod進行擴容或縮容。如前面建立的nginx,能夠用以下命令指定副本範圍在1~4 
kubectl autoscale rc rc-nginx-3 —min=1 —max=4  

  

14. cordon, drain, uncordon

     這三個命令是正式release的1.2新加入的命令,三個命令一塊兒介紹,是由於三個命令配合使用能夠實現節點的維護。在1.2以前,由於沒有相應的命令支持,若是要維護一個節點,只能stop該節點上的kubelet將該節點退出集羣,是集羣不在將新的pod調度到該節點上。若是該節點上本生就沒有pod在運行,則不會對業務有任何影響。若是該節點上有pod正在運行,kubelet中止後,master會發現該節點不可達,而將該節點標記爲notReady狀態,不會將新的節點調度到該節點上。同時,會在其餘節點上建立新的pod替換該節點上的pod。這種方式雖然可以保證集羣的健壯性,可是任然有些暴力,若是業務只有一個副本,並且該副本正好運行在被維護節點上的話,可能仍然會形成業務的短暫中斷。 
     1.2中新加入的這3個命令能夠保證維護節點時,平滑的將被維護節點上的業務遷移到其餘節點上,保證業務不受影響。以下圖所示是一個整個的節點維護的流程(爲了方便demo增長了一些查看節點信息的操做):1)首先查看當前集羣全部節點狀態,能夠看到共四個節點都處於ready狀態;2)查看當前nginx兩個副本分別運行在d-node1和k-node2兩個節點上;3)使用cordon命令將d-node1標記爲不可調度;4)再使用kubectl get nodes查看節點狀態,發現d-node1雖然還處於Ready狀態,可是同時還被禁能了調度,這意味着新的pod將不會被調度到d-node1上。4)再查看nginx狀態,沒有任何變化,兩個副本仍運行在d-node1和k-node2上;5)執行drain命令,將運行在d-node1上運行的pod平滑的趕到其餘節點上;6)再查看nginx的狀態發現,d-node1上的副本已經被遷移到k-node1上;這時候就能夠對d-node1進行一些節點維護的操做,如升級內核,升級Docker等;7)節點維護完後,使用uncordon命令解鎖d-node1,使其從新變得可調度;8)檢查節點狀態,發現d-node1從新變回Ready狀態。 

15. attach

     attach命令相似於docker的attach命令,能夠直接查看容器中以daemon形式運行的進程的輸出,效果相似於logs -f,退出查看使用ctrl-c。若是一個pod中有多個容器,要查看具體的某個容器的的輸出,須要在pod名後使用-c containers name指定運行的容器。以下示例的命令爲查看kube-system namespace中的kube-dns-v9-rcfuk pod中的skydns容器的輸出。 
kubectl attach kube-dns-v9-rcfuk -c skydns —namespace=kube-system

  

16. exec

     exec命令一樣相似於docker的exec命令,爲在一個已經運行的容器中執行一條shell命令,若是一個pod容器中,有多個容器,須要使用-c選項指定容器。 

17. port-forward

     轉發一個本地端口到容器端口,博主通常都是使用yaml的方式編排容器,因此基本不使用此命令。 

18. proxy

     使用nginx做爲kubernetes多master HA方式的代理,沒有使用過此命令爲kubernetes api server運行過proxy 

19. run

     相似於docker的run命令,直接運行一個image。 

20. label

     爲kubernetes集羣的resource打標籤,如前面實例中提到的爲rc打標籤對rc分組。還能夠對nodes打標籤,這樣在編排容器時,能夠爲容器指定nodeSelector將容器調度到指定lable的機器上,如若是集羣中有IO密集型,計算密集型的機器分組,能夠將不一樣的機器打上不一樣標籤,而後將不一樣特徵的容器調度到不一樣分組上。 
     在1.2以前的版本中,使用kubectl get nodes則能夠列出全部節點的信息,包括節點標籤,1.2版本中再也不列出節點的標籤信息,若是須要查看節點被打了哪些標籤,須要使用describe查看節點的信息。 

21. 其餘

其餘還有如cluster-info信息能夠查看當前集羣的一些信息,Version查看集羣版本信息等,還有一些集羣配置相關的命令等。
相關文章
相關標籤/搜索