kubernetes 命令使用


中文文檔

https://www.kubernetes.org.cn/doc-30

 

get

kubectl get nodes         #獲取集群中有多少節點

kubectl get type1,type2

kubectl get type name --output json/yaml    #顯示詳細信息

kubectl get type --selector key1=value1,key2=value2    #通過label標篩選api對象

kubectl get type name --output go-template=..       #通過go template提取指定信息

 

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

 

[root@k8s_master ~]# kubectl get po --all-namespaces      #獲取所有pod

 

[root@k8s_master ~]# kubectl get namespaces        ###獲取namespace 信息

 

可以使用"kubectl get rc --all-namespaces”, “kubectl get svc”, “kubectl get nodes”等獲取其他resource信息。

 

 #以json格式輸出pod的詳細信息

kubectl get po <podname> -o json 
kubectl get rc/service/deployments --all-namespacces #獲取所有的replication controller/service/部署

kubectl get pods -o=custom=columns-file=aa.txt    #將結果輸出到文件

 

總結版

# Get commands with basic output
$ kubectl get services                          # 列出所有 namespace 中的所有 service
$ kubectl get pods --all-namespaces             # 列出所有 namespace 中的所有 pod
$ kubectl get pods -o wide                      # 列出所有 pod 並顯示詳細信息
$ kubectl get deployment my-dep                 # 列出指定 deployment
$ kubectl get pods --include-uninitialized      # 列出該 namespace 中的所有 pod 包括未初始化的

# 使用詳細輸出來描述命令
$ 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}' # 獲取所有節點的 ExternalIP
$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

# 列出屬於某個 PC 的 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})

# 查看哪些節點已就緒
$ 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

 

describe

describe類似於get,同樣用於獲取resource的相關信息。不同的是,get獲得的是更詳細的resource個性的詳細信息,describe獲得的是resource集群相關的信息。

語法:
kubectl describe type name (type為資源對象類型,name為名稱)

#
顯示node信息 kubectl describe nodes <node-name> #顯示pod詳細信息,如果不顯示可以加上 --namespace=<namespace名稱> kubectl describe pod <pod-name> #顯示由rc管理的pod信息 kubectl describe pods <rc-name>

 

示例

[root@k8s_master ~]# kubectl describe po nginx-controller-shs0z

 

create 

kubectl create -f nginx-rc.yaml -f nginx-service.yaml     #連續創建多個

[root@k8s_master ~]# more nginx-rc.yaml 
apiVersion: v1 
kind: ReplicationController 
metadata: 
name: nginx-controller 
spec: 
replicas: 2 
selector: 
name: nginx 
template: 
metadata: 
labels: 
name: nginx 
spec: 
containers: 
- name: nginx 
image: nginx 
ports: 
- containerPort: 80

創建ReplicationController(rc),rc會創建兩個副本,創建后,使用“kubectl get rc”可以看到一個名為nginx-controller的ReplicationController將被創建,同時“kubectl get po”的結果中會多出兩個前綴為“nginx-controller-”的pod

 

另一種方法

cat xxx.yaml | kubectl create -f -

 

 

replace更新pod

replace命令用於對已有資源進行更新、替換。如前面create中創建的nginx,當我們需要更新resource的一些屬性的時候,如果修改副本數量,增加、修改label,更改image版本,修改端口等。都可以直接修改原yaml文件,然后執行replace命令

kubectl replace -f rc-nginx.yaml

名字不能被更更新。另外,如果是更新label,原有標簽的pod將會與更新label后的rc斷開聯系,有新label的rc將會創建指定副本數的新的pod,但是默認並不會刪除原來的pod。所以此時如果使用get po將會發現pod數翻倍,進一步check會發現原來的pod已經不會被新rc控制

 

更新資源

$ 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                 # 更新 frontend pod 中的鏡像
$ kubectl rolling-update frontend-v1 frontend-v2 --rollback        # 退出已存在的進行中的滾動更新
$ cat pod.json | kubectl replace -f - # 基於 stdin 輸入的 JSON 替換 pod 
# 強制替換,刪除后重新創建資源。會導致服務中斷。
$ kubectl replace --force -f ./pod.json

# 為 nginx RC 創建服務,啟用本地 80 端口連接到容器上的 8000 端口
$ kubectl expose rc nginx --port=80 --target-port=8000 # 更新單容器 pod 的鏡像版本(tag)到 v4
$ kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

$ kubectl label pods my-pod new-label=awesome                      # 添加標簽
$ kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq       # 添加注解
$ kubectl autoscale deployment foo --min=2 --max=10                # 自動擴展 deployment “foo”

 

 

 

 

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"}}}'

 

使用策略合並補丁並修補資源。

$ 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"}]'

 

Delete

根據resource名或label刪除resource。

kubectl delete -f rc-nginx.yaml 
kubectl delete po rc-nginx-btv4j     #默認情況下,如果刪除了會立馬在重新啟動一個(由創建時啟動多少個決定),所以應該直接刪除rc和service deployment,才會徹底刪除pod
kubectl delete po -l app=nginx-2    #刪除 標簽為 app=nginx-2的容器  

kubectl delete pods --all       #刪除所有pod

kubectl delete service <service—name>  #刪除某個服務,同樣適用於 rc、pod、deployment

kubectl delete rc --all  #默認刪除所有的rc

 

刪除操作

$ kubectl delete -f ./pod.json                                              # 刪除 pod.json 文件中定義的類型和名稱的 pod
$ kubectl delete pod,service baz foo                                        # 刪除名為“baz”的 pod 和名為“foo”的 service
$ kubectl delete pods,services -l name=myLabel                              # 刪除具有 name=myLabel 標簽的 pod 和 serivce
$ kubectl delete pods,services -l name=myLabel --include-uninitialized      # 刪除具有 name=myLabel 標簽的 pod 和 service,包括尚未初始化的
$ kubectl -n my-ns delete po,svc --all                                      # 刪除 my-ns namespace 下的所有 pod 和 serivce,包括尚未初始化的

 

logs

logs命令用於顯示pod運行中,容器內程序輸出到標准輸出的內容。跟docker的logs命令類似。如果要獲得tail -f 的方式,也可以使用-f選項。

kubectl logs rc-nginx-2-kpiqt (pod name) --namespace=kube-system

kubectl logs -f <pod-name> -c <container-name>     #查看容器的日志,相當於 tail -f

--since|--since-time #打印指定時間日志 --tail 打印最新日志

 

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

 

實例:

v1版本

#cat test_rc_v1.yaml
apiVersion: v1 kind: ReplicationController metadata: name: myapp
-v1 spec: replicas: 10 selector: app: myapp version: v1 template: metadata: labels: app: myapp version: v1 spec: containers: - name: myapp command: - sleep - "3600" image: 10.10.10.11:5000/busybox:v1      #主要看鏡像,v1版本 imagePullPolicy: IfNotPresent restartPolicy: Always

創建

kubectl create -f my-app-v1-rc.yaml

 

v2版本

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-v2
spec:
  replicas: 10
  selector:
    app: myapp
    version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        command:
          - sleep
          - "3600"
        image: 10.10.10.11:5000/busybox:v2    #鏡像v2版本
        imagePullPolicy: IfNotPresent
      restartPolicy: Always

滾動升級

kubectl rolling-update myapp-v1 -f my-app-v2-rc.yaml --update-period=10s  #myapp-v1為pod名稱,在v1.yaml里已經指定了,update-peroid=10s表示每隔10秒增加副本的數量

 

版本回退

# kubectl rolling-update myapp-v1 -f my-app-v2-rc.yaml --update-period=10s --rollback

 

label

 

annotate

 

scale

scale用於程序在負載加重或縮小時副本進行擴容或縮小,如前面創建的nginx有兩個副本,可以輕松的使用scale命令對副本數進行擴展或縮小。

擴展副本數到4:
kubectl scale rc rc-nginx-3 —replicas=4     #rc-nginx-3(rc name)

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

 

$ kubectl scale --replicas=3 rs/foo                                 # Scale a replicaset named 'foo' to 3
$ kubectl scale --replicas=3 -f foo.yaml                            # Scale a resource specified in "foo.yaml" to 3
$ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # If the deployment named mysql's current size is 2, scale mysql to 3
$ kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # Scale multiple replication controllers

 

autoscale

autoscale命令提供了自動根據pod負載對其副本進行擴縮的功能。
autoscale命令會給一個rc指定一個副本數的范圍,在實際運行中根據pod中運行的程序的負載自動在指定的范圍內對pod進行擴容或縮容。如前面創建的nginx,可以用如下命令指定副本范圍在1~4

kubectl autoscale rc rc-nginx-3 —min=1 —max=4

 

attch

attach命令類似於docker的attach命令,可以直接查看容器中以daemon形式運行的進程的輸出,效果類似於logs -f,退出查看使用ctrl-c。
如果一個pod中有多個容器,要查看具體的某個容器的的輸出,需要在pod名后使用-c containers name指定運行的容器。如下示例的命令為查看kube-system namespace中的nginx-controller-shs0z pod中的nginx容器的輸出。

例:

[root@k8s_master ~]# kubectl attach nginx-controller-shs0z -c nginx -namespace=kube-system

nginx  為容器名稱
nginx-controller-shs0z 為pod名稱
- namespace=kube-system    namespace名稱

kubectl attch mypod mycontainer    #進入容器

 

exec

exec命令同樣類似於docker的exec命令,為在一個已經運行的容器中執行一條shell命令,如果一個pod容器中,有多個容器,需要使用-c選項指定容器。 方法與attch一樣

#執行pod的date命令,默認使用pod中第一個容器執行
kubectl exec <pod-name> -- date

#指定pod中某個容器執行date命令
kubectl exec <pod-name> -c <container-name> -- date

#通過bash獲得pod中more容器的tty,相當於登錄容器
kubectl exec -it <pod-name> -c <container-name> /bin/bash

 

kubectl port-forward命令可以為pod設置端口轉發,通過在本機監聽指定端口,訪問這些端口的請求將會被轉發到Pod的容器中對應的端口上

kubectl port-forward mypod 80:80 443:443    #此命令需要在node上安裝nsenter和socat

 

apply

apply命令主要是更新api對象

kubectl apply -f xxx.yaml

cat xxx.yaml | kubectl apply -f -

 

run

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

kubectl run nginx --image nginx            #創建rc,默認副本數為1

kubectl run nginx --image nginx  --replicas 2   --labels key=value

kubectl run 只可以設置一個容器,支持的容器屬性設置有 --command         容器的啟動命令 --port                 容器內部的端口 --hostport            容器映射到宿主機的端口 --env                 容器的環境變量 --requests            容器的資源請求規格(min) --limits                 容器的資源限制規格(max)

 

expose

kubectl expose命令可以用來創建service,創建的時候需要指定pod rc或者service,從中提取label來為新建的service配置label selector

kubectl expose pod valid-pod --port=444 --name=frontend

kubectl expose rc nginx --port=80 --targetport=8000

kubectl expose service nginx --port=443 --targetport=8443 --name=nginx-https

 

與運行中的pod交互

$ kubectl logs my-pod                                 # dump 輸出 pod 的日志(stdout)
$ kubectl logs my-pod -c my-container                 # dump 輸出 pod 中容器的日志(stdout,pod 中有多個容器的情況下使用)
$ kubectl logs -f my-pod                              # 流式輸出 pod 的日志(stdout)
$ kubectl logs -f my-pod -c my-container              # 流式輸出 pod 中容器的日志(stdout,pod 中有多個容器的情況下使用)
$ kubectl run -i --tty busybox --image=busybox -- sh  # 交互式 shell 的方式運行 pod
$ kubectl attach my-pod -i                            # 連接到運行中的容器
$ kubectl port-forward my-pod 5000:6000               # 轉發 pod 中的 6000 端口到本地的 5000 端口
$ kubectl exec my-pod -- ls / # 在已存在的容器中執行命令(只有一個容器的情況下)
$ kubectl exec my-pod -c my-container -- ls / # 在已存在的容器中執行命令(pod 中有多個容器的情況下)
$ kubectl top pod POD_NAME --containers               # 顯示指定 pod 和容器的指標度量

 

與節點和集群交互

$ kubectl cordon my-node                                                # 標記 my-node 不可調度
$ kubectl drain my-node                                                 # 清空 my-node 以待維護
$ kubectl uncordon my-node                                              # 標記 my-node 可調度
$ kubectl top node my-node                                              # 顯示 my-node 的指標度量
$ kubectl cluster-info                                                  # 顯示 master 和服務的地址
$ kubectl cluster-info dump                                             # 將當前集群狀態輸出到 stdout                                   
$ kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 將當前集群狀態輸出到 /path/to/cluster-state

# 如果該鍵和影響的污點(taint)已存在,則使用指定的值替換
$ kubectl taint nodes foo dedicated=special-user:NoSchedule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM