天天看點

使用kubectl管理k8s叢集1.kubectl文法2.聲明式資源對象管理3.指令式資源對象管理4.檢視資源狀态5.容器管理6.叢集管理

文章目錄

  • 1.kubectl文法
    • 1.1常用指令簡要彙總(command)
    • 1.2 資源類型彙總(type)
    • 1.3kubectl輸出格式
  • 2.聲明式資源對象管理
    • apply
  • 3.指令式資源對象管理
    • 3.1建立資源
      • create
      • expose
      • run
    • 3.2更新資源
      • scale
      • autoscale
      • annotate
      • label
    • 3.3删除資源
      • delete
  • 4.檢視資源狀态
    • get
    • describe
  • 5.容器管理
    • 5.1日志檢視
      • logs
    • 5.2執行指令
      • exec
    • 5.3檔案傳輸
      • cp
  • 6.叢集管理
    • 6.1叢集資訊檢視
      • cluster-info、version
    • 6.2節點管理
      • cordon、uncordon、drain

1.kubectl文法

command:子指令,指定要對資源執行的操作

TYPE:指定資源類型

NAME:指定資源名稱

flags:指定指令可選的參數

指令幫助文檔

kubectl --help
kubectl command --help
           

1.1常用指令簡要彙總(command)

kubectl作為kubernetes的指令行工具,主要的職責就是對叢集中的資源的對象進行操作,這些操作包括對資源對象的建立、删除和檢視等

操作 文法 描述
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版本。

1.2 資源類型彙總(type)

在kubernetes中,提供了很多的資源對象,開發和運維人員可以通過這些對象對容器進行編排。

資源對象類型 縮略别名
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

1.3kubectl輸出格式

輸出格式 說明
-o=custom-columns=<spec> 根據自定義列名進行輸出,以逗号分隔
-o=custom-colimns-file=<filename> 從檔案中擷取自定義列名進行輸出
-o=json 以JSON格式顯示結果
-o=jsonpath=<template> 輸出jsonpath表達式定義的字段資訊
-o=jsonpath-file=<filename> 輸出jsonpath表達式定義的字段資訊,來源于檔案
-o=name 僅輸出資源對象的名稱
-o=wide 輸出額外資訊。對于Pod,将輸出Pod所在的Node名
-o=yaml 以yaml格式顯示結果

2.聲明式資源對象管理

以聲明的形式,建立資源或更新資源,無需指定具體操作

apply

将來自于檔案或stdin的配置變更應用到主要對象中

kubernetes建議盡量使用apply指令,kubectl中大多數的建立、更新、删除資源的指令都可以使用apply來代替

kubectl apply (-f FILENAME | -k DIRECTORY) [options]
##-f 參數後跟yaml或json格式的資源配置檔案,-k 參數後跟kustomization.yaml配置檔案的位置。
           

聲明式管理:所有對叢集的增改操作,都能apply指令完成,取決于後面的配置檔案

  • 如果配置檔案中的資源在叢集中不存在,則建立這個資源。
  • 如果配置檔案中的資源在叢集中已存在,則根據配置對資源字段進行更新

例子:

#kubeadm部署叢集中根據資源配置檔案配置flannel網絡
kubectl apply -f kube-flannel.yml
           

apply指令的作用:使叢集的實際狀态朝使用者聲明的期望狀态變化,而使用者不用關心具體要進行怎樣的增删改操作才能達到這個期望狀态,也即Kubernetes的聲明式資源管理。

3.指令式資源對象管理

指令式管理就是直接通過指令執行增删改操作

3.1建立資源

create

用于根據檔案或輸入流建立叢集resource。如果有對應resource的yaml或json檔案,直接指定檔案建立。也可使用子指令等直接建立響應的resource。從追蹤和維護的角度,建議使用yaml或json格式

##通過檔案陳述式配置
kubectl create -f FILENAME [flags]
##通過指令
kubectl create [type] [NAME] [flags]
           

示例:

kubectl create -f nginx.yaml

kubectl create deployment nginx --image=nginx

kubectl create serviceaccount dashboard-admin -n kube-system		#建立服務賬戶

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
           

expose

為副本控制器、服務或Pod等暴露一個新的服務,即将服務暴露出去(建立service)

kubectl expose deployments/deployment_name --type="NodePort" --port=(要暴露的容器端口) --name=(Service對象名字)

kubectl expose rc nginx --port=80 --target-port=8000    # 建立一個svc,暴露nginx這個rc
           

run

類似于docker的run指令,用于在叢集上運作一個image執行個體

kubectl run name --image=(鏡像名) --replicas=(備份數) --port=(容器要暴露的端口) --labels=(設定自定義标簽)

kubectl run nginx --image=nginx
           

部分參數:

–dry-run:測試指令正确性,不執行建立

-o:輸出,指定yaml或json将執行指令生成對應格式檔案

kubectl run nginx --image=nginx --dry-run -o yaml > /bak
           

3.2更新資源

scale

擴容或縮容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod數量。

scale用于程式在負載加重或縮小時副本進行擴容或縮小,如建立的nginx有兩個副本,可以輕松的使用scale指令對副本數進行擴充或縮小。

kubectl scale --replicas=3 -f nginx.yaml	#将nginx.yaml中描述的對象擴充為3個

kubectl scale rc nginx —replicas=4 	#将nginx的pod副本設為4個,若比目前小,則為縮小

kubectl scale --current-replicas=2 --replicas=3 deployment/mysql	#如果目前副本為2,則擴充到3

kubectl scale --replicas=5 rc/foo rc/bar rc/baz		#設定多個rc中pod副本數量
           

autoscale

給定一個rc指定一個副本數 的範圍,實際運作中根據pod運作的程式負載自動在指定的範圍内對pod進行擴容或縮容

annotate

添加或更新一個或多個資源的注釋/備注

kubectl annotate pods pod_name key=value

kubectl annotate pods foo description='my frontend'        # 增加description='my frontend'備注,已有保留不覆寫
           

label

添加或更新一個或多個資源對象的标簽

kubectl label pods/pod_name key=value	#添加标簽,如果是修改的話需要後面添加--overwrite

kubectl label nodes node_name key=value
           
kubectl label --overwrite pods foo status=unhealthy        # 增加status=unhealthy 标簽,已有則覆寫
           

3.3删除資源

delete

删除資源對象

kubectl delete -f nginx.yaml	#删除nginx.yaml中對應的資源對象

kubectl delete pod,service nginx foo	#删除名為nginx、foo的pod和service

kubectl delete pods,services -l name=mylabel	#删除包含指定标簽為mylabel的資源對象

kubectl delete pod foo --grace-period=0 --force # 強制删除一個pod,在各種原因pod一直terminate不掉的時候很有用
           

4.檢視資源狀态

get

最常用的檢視指令,檢視一個或多個資源的詳細資訊

常見示例:

kubectl get services                          # 列出目前NS中所有service資源
kubectl get pod -n kube-systme				  # 列出叢集中指定命名空間的pod
kubectl get pods --all-namespaces             # 列出叢集所有NS中所有的Pod
kubectl get pods -o wide                      # -o wide也比較常用,可以顯示更多資源資訊,比如pod的IP等
kubectl get deployment my-dep                 # 可以直接指定資源名檢視
kubectl get deployment my-dep --watch         # --watch 參數可以監控資源的狀态,在狀态變換時輸出。在跟蹤服務部署情況時很有用
kubectl get pod my-pod -o yaml                # 檢視yaml格式的資源配置,這裡包括資實際的status,可以用--export排除
kubectl get pod my-pod -l app=nginx           # 檢視所有帶有标簽app: nginx的pod
           

describe

類似get,但get隻輸出資源本身的資訊,describe聚合了相關資源的資訊并輸出。比如,在describe node資訊時,同時會輸出該node下的pod的資源利用情況。是以describe指令在排錯和調試時非常有用。

示例:

kubectl describe nodes my-node	#檢視名為my-node的node節點詳細資訊
kubectl describe pods my-pod      # 檢視pod my-pod的詳細資訊
           

5.容器管理

5.1日志檢視

logs

示例:

kubectl logs my-pod		#檢視單容器pod的日志
kubectl logs my-pod -c nginx #檢視多容器pod中的某個nginx容器的日志
kubectl logs -l app=nginx 	#檢視包含app=nginx标簽的pod日志
kubectl logs -f my-pod	#加上-f,類似tail -f,實時更新追蹤日志
kubectl logs my-pod  -p  #輸出該pod的上一個退出的容器執行個體日志。在pod容器異常退出時很有用
kubectl logs my-pod  --since-time=2018-11-01T15:00:00Z	# 指定時間戳輸出日志
kubectl logs my-pod  --since=1h 	# 指定時間段輸出日志,機關s/m/h
           

5.2執行指令

exec

指令和docker exec一緻

kubectl exec -it nginx bash
           

5.3檔案傳輸

cp

容器和主控端之間互互相動檔案

kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir                 # 拷貝主控端本地檔案夾到pod
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar        # 指定namespace的拷貝pod檔案到主控端本地目錄
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container> # 對于多容器pod,用-c指定容器名
           

6.叢集管理

6.1叢集資訊檢視

cluster-info、version

kubectl cluster-info      # 檢視master和叢集服務的位址
 kubectl cluster-info dump # 檢視叢集詳細日志
 kubectl version           # 檢視Kubernetes叢集和用戶端版本
           

6.2節點管理

cordon、uncordon、drain

kubectl cordon my-node       
# 标記 my-node 為 unschedulable,禁止pod被排程過來。注意這時現有的pod還會繼續運作,不會被驅逐。
kubectl uncordon my-node 
# 與cordon相反,标記 my-node 為 允許排程。
kubectl drain  my-node
# drain字面意思為排水,實際就是把my-node的pod平滑切換到其他node,同時标記pod為unschedulable,也就是包含了cordon指令。
# 但是直接使用指令一般不會成功,建議在要維護節點時,加上以下參數:
kubectl drain my-node  --ignore-daemonsets  --force  --delete-local-data  
# --ignore-daemonsets 忽略daemonset部署的pod
# --force 直接删除不由workload對象(Deployment、Job等)管理的pod
# --delete-local-data  直接删除挂載有本地目錄(empty-dir方式)的pod
           

繼續閱讀