本文收錄在容器技術學習系列文章總目錄 1、使用kubectl 1.1 介紹 kubectl用於運行Kubernetes集群命令的管理工具。 1.2 語法 command:指定要在一個或多個資源執行的操作,例如操作create,get,describe,delete。TYPE:指定資源類型Resour ...
本文收錄在容器技術學習系列文章總目錄
1、使用kubectl
1.1 介紹
kubectl用於運行Kubernetes集群命令的管理工具。
1.2 語法
kubectl [command] [TYPE] [NAME] [flags]
- command:指定要在一個或多個資源執行的操作,例如操作create,get,describe,delete。TYPE:指定資源類型Resource types。
- Name區分大小寫,如果省略Name,則顯示所有資源的詳細信息,例如:$ kubectl get pods。
1.3 選項
Operation |
Description |
Syntax |
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 |
列出支持的API版本。 |
kubectl api-versions [flags] |
apply |
對文件或stdin的資源進行配置更改。 |
kubectl apply -f FILENAME [flags] |
attach |
連接到一個運行的容器,既可以查看output stream,也可以與容器(stdin)進行交互。 |
kubectl attach POD -c CONTAINER [-i] [-t] [flags] |
autoscale |
自動擴容/縮容由replication controller管理的一組pod。 |
kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] |
cluster-info |
顯示有關集群中master和services的終端信息。 |
kubectl cluster-info [flags] |
config |
修改kubeconfig文件。有關詳細信息,請參閱各個子命令。 |
kubectl config SUBCOMMAND [flags] |
create |
從file或stdin創建一個或多個資源。 |
kubectl create -f FILENAME [flags] |
delete |
從file,stdin或指定label 選擇器,names,resource選擇器或resources中刪除resources。 |
kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] |
describe |
顯示一個或多個resources的詳細狀態。 |
kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] |
edit |
使用預設編輯器編輯和更新伺服器上一個或多個定義的資源。 |
kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags] |
exec |
對pod中的容器執行命令。 |
kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] |
explain |
獲取各種資源的文檔。例如pod,node,services等 |
kubectl explain [--include-extended-apis=true] [--recursive=false] [flags] |
expose |
將 replication controller,service或pod作為一個新的Kubernetes service顯示。 |
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] |
get |
列出一個或多個資源。 |
kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] |
label |
添加或更新一個或多個資源的flags。 |
kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags] |
logs |
在pod中列印容器的日誌。 |
kubectl logs POD [-c CONTAINER] [--follow] [flags] |
patch |
使用strategic merge 補丁程式更新資源的一個或多個欄位。 |
kubectl patch (-f FILENAME | TYPE NAME | TYPE/NAME) --patch PATCH [flags] |
port-forward |
將一個或多個本地埠轉發到pod。 |
kubectl port-forward POD [LOCAL_PORT:]REMOTE_PORT [...[LOCAL_PORT_N:]REMOTE_PORT_N] [flags] |
proxy |
在Kubernetes API伺服器運行代理。 |
kubectl proxy [--port=PORT] [--www=static-dir] [--www-prefix=prefix] [--api-prefix=prefix] [flags] |
replace |
從file或stdin替換資源。 |
kubectl replace -f FILENAME |
rolling-update |
通過逐步替換指定的replication controller及其pod來執行滾動更新。 |
kubectl rolling-update OLD_CONTROLLER_NAME ([NEW_CONTROLLER_NAME] --image=NEW_CONTAINER_IMAGE | -f NEW_CONTROLLER_SPEC) [flags] |
run |
在集群上運行指定的鏡像。 |
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [flags] |
scale |
更新指定replication controller的大小。 |
kubectl scale (-f FILENAME | TYPE NAME | TYPE/NAME) --replicas=COUNT [--resource-version=version] [--current-replicas=count] [flags] |
stop |
已棄用 |
kubectl stop |
version |
顯示客戶端和伺服器上運行的Kubernetes版本。 |
kubectl version [--client] [flags] |
1.4 示例演示
(1)簡單的查詢操作
查詢節點詳細信息
[root@master ~]# kubectl describe node node1 Name: node1 Roles: <none> Labels: beta.kubernetes.io/arch=amd64 ... ...
查看版本
[root@master ~]# kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
查看集群信息
[root@master ~]# kubectl cluster-info Kubernetes master is running at https://192.168.10.103:6443 KubeDNS is running at https://192.168.10.103:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
2、run運行
2.1 介紹
創建並運行一個或多個容器鏡像。
2.2 命令
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
2.3 常用選項
- --port:要暴露的埠
- --replicas:期望創建幾個Pod,預設1個
- --dry-run:true為乾跑
2.4 演示
(1)運行一個nginx的pod
[root@master ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps/nginx-deploy created
(2)在master上查詢驗證
[root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deploy 1 1 1 1 44s [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-6kw54 1/1 Running 0 51s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-6kw54 1/1 Running 0 1m 10.244.2.2 node2
(3)在部署的node節點上查詢
[root@node2 ~]# ifconfig |head -2 cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 inet 10.244.2.1 netmask 255.255.255.0 broadcast 0.0.0.0
(4)訪問pod內的nginx服務
[root@node1 ~]# curl 10.244.2.2 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
3、delete刪除
3.1 介紹
- 通過配置文件名、stdin、資源名稱或label選擇器來刪除資源。
- 支持JSON和YAML格式文件。可以只指定一種類型的參數:文件名、資源名稱或label選擇器。
3.2 語法
$ kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
3.3 演示
刪除剛纔的pod,立刻會生成一個新的pod,因為此pod是控制器管理的
[root@master ~]# kubectl delete pods nginx-deploy-5b595999-6kw54 pod "nginx-deploy-5b595999-6kw54" deleted [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deploy-5b595999-jf5gm 0/1 ContainerCreating 0 16s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-jf5gm 1/1 Running 0 47s 10.244.1.2 node1
4、expose暴露
4.1 介紹
- 將資源暴露為新的Kubernetes Service。
- 指定deployment、service、replica set、replication controller或pod ,並使用該資源的選擇器作為指定埠上新服務的選擇器。deployment 或 replica set只有當其選擇器可轉換為service支持的選擇器時,即當選擇器僅包含matchLabels組件時才會作為暴露新的Service。
- 資源包括(不區分大小寫):pod(po),service(svc),replication controller(rc),deployment(deploy),replica set(rs)
4.2 語法
$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
4.3 常用選項
- --port:暴露在service上的埠
- --target-port:容器中的埠
4.4 演示
(1)將nginx-deploy控制器中相關的Pod資源創建一個名為nginx的服務
[root@master ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP service/nginx exposed [root@master ~]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h nginx ClusterIP 10.96.212.79 <none> 80/TCP 9s [root@master ~]# kubectl get svc #簡寫 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h nginx ClusterIP 10.96.212.79 <none> 80/TCP 13s
(2)驗證,在集群內部節點訪問服務
[root@master ~]# curl 10.96.212.79 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title>
(3)刪除pod,立即生產新的pod,但是service還是不變,繼續提供服務,只是指定到新的pod
---刪除pod [root@master ~]# kubectl delete pods nginx-deploy-5b595999-jf5gm ---立即生產新的pod,service繼續提供服務 [root@master ~]# curl 10.96.212.79 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ---指定到新的pod [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-deploy-5b595999-2z769 1/1 Running 0 29m 10.244.1.2 node2 [root@master ~]# kubectl describe svc nginx Name: nginx Namespace: default Labels: run=nginx-deploy Annotations: <none> Selector: run=nginx-deploy Type: ClusterIP IP: 10.96.212.79 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 10.244.1.2:80 Session Affinity: None Events: <none>
5、scale動態擴容/縮容
5.1 介紹
- 擴容或縮容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod數量。
- scale也可以指定多個前提條件,如:當前副本數量或 --resource-version ,進行伸縮比例設置前,系統會先驗證前提條件是否成立。
5.2 語法
$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
5.3 演示
(1)先運行名為myapp標簽選擇器的2個pod,鏡像是我用於測試演示自己構建的
[root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 deployment.apps/myapp created [root@master ~]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE myapp 2 2 2 2 6s [root@master ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE myapp-848b5b879b-58jcr 1/1 Running 0 11s 10.244.2.53 node2 myapp-848b5b879b-wpx9v 1/1 Running 0 11s 10.244.1.56 node1
(2)創建service,並驗證
[root@master ~]# kubectl expose deployment myapp --name=myapp --port=80 service/myapp exposed [root@master ~]# kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.104.205.158 <none> 80/TCP 8s [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> ---因為有2個pod,所以是隨機調度 [root@master ~]# curl 10.104.205.158/hostname.html myapp-848b5b879b-58jcr [root@master ~]# curl 10.104.205.158/hostname.html myapp-848b5b879b-wpx9v
(3)使用scale,將pod擴容到5個
[root@master ~]# kubectl scale --replicas=5 deployment myapp deployment.extensions/myapp scaled [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1/1 Running 0 8s myapp-848b5b879b-58jcr 1/1 Running 0 4m myapp-848b5b879b-hp7zs 1/1 Running 0 8s myapp-848b5b879b-sfq8r 1/1 Running 0 8s myapp-848b5b879b-wpx9v 1/1 Running 0 4m
(4)使用scale,將pod縮容到3個
[root@master ~]# kubectl scale --replicas=3 deployment myapp [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-2sj8n 1/1 Running 0 1m myapp-848b5b879b-58jcr 1/1 Running 0 6m myapp-848b5b879b-wpx9v 1/1 Running 0 6m
6、set動態升級版本
6.1 介紹
(1)set
- 配置應用資源。
- 使用這些命令能幫你更改現有應用資源一些信息。
- 子命令:image、resources、selector、subject
(2)set image
- 更新現有的資源對象的容器鏡像。
- 可使用資源對象包括(不區分大小寫):pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)
6.2 語法
$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
6.3 演示
將鏡像版本從v1升級到v2版
[root@master ~]# kubectl set image deployment myapp myapp=ikubernetes/myapp:v2 deployment.extensions/myapp image updated [root@master ~]# kubectl rollout status deployment myapp #動態顯示版本升級過程 ---因為版本升級,所以pod都是新建的,名字都改變了 [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE client 1/1 Running 0 3h myapp-74c94dcb8c-d5fgk 1/1 Running 0 55s myapp-74c94dcb8c-f2ntn 1/1 Running 0 21s myapp-74c94dcb8c-ht9v7 1/1 Running 0 38s ---驗證,版本升級成功 [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
7、rollout undo回滾版本
7.1 介紹
(1)rollout
- 對資源進行管理
- 可用資源包括:deployments、daemonsets
- 子命令:history(查看歷史版本)、pause(暫停資源)、resume(恢復暫停資源)、status(查看資源狀態)、undo(回滾版本)
(2)rollout undo
回滾pod到之前的版本。
7.2 語法
$ kubectl rollout undo (TYPE NAME | TYPE/NAME) [flags]
7.3 演示
[root@master ~]# kubectl rollout undo deployment myapp deployment.extensions/myapp [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE myapp-848b5b879b-gg9lr 1/1 Running 0 15s myapp-848b5b879b-km4t6 1/1 Running 0 16s myapp-848b5b879b-nq98c 1/1 Running 0 17s ---驗證,回滾成功 [root@master ~]# curl 10.104.205.158 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
8、edit編輯修改
8.1 介紹
- 使用預設編輯器,編輯伺服器上定義的資源。
- 使用命令行工具獲取的任何資源都可以使用edit命令編輯。edit命令會打開使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR環境變數定義的編輯器,可以同時編輯多個資源,但所編輯過的資源只會一次性提交。edit除命令參數外還接受文件名形式。
- 文件預設輸出格式為YAML。要以JSON格式編輯,請指定“-o json”選項。
- 如果在更新資源時報錯,將會在磁碟上創建一個臨時文件來記錄。在更新資源時最常見的錯誤是幾個用戶同時使用編輯器更改伺服器上資源,發生這種情況,你需要將你的更改應用到最新版本的資源上,或者更新保存的臨時副本。
8.2 語法
$ kubectl edit (RESOURCE/NAME | -f FILENAME)
8.3 演示
(1)修改service,將類型type: ClusterIP,修改為type: NodePort;修改後,可以在集群外訪問到pod中的服務
[root@master ~]# kubectl edit svc myapp ... ... spec: ... ... type: NodePort ... ... service/myapp edited [root@master ~]# kubectl get svc myapp NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp NodePort 10.104.205.158 <none> 80:31599/TCP 23m
(2)在集群外的主機上訪問了
9、label標簽
9.1 介紹
更新(增加、修改或刪除)資源上的 label(標簽)。
- label 必須以字母或數字開頭,可以使用字母、數字、連字元、點和下劃線,最長63個字元。
- 如果--overwrite 為 true,則可以覆蓋已有的 label,否則嘗試覆蓋 label 將會報錯。
- 如果指定了--resource-version,則更新將使用此資源版本,否則將使用現有的資源版本。
9.2 語法
$ kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
9.3 演示
(1)運行一個標簽為app=nginx的pod
[root@master ~]# kubectl run nginx --image=nginx:1.14-alpine --replicas=1 --labels="app=nginx" deployment.apps/nginx created
(2)-l 指定標簽,實現標簽過濾
[root@master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-848b5b879b-5blnx 1/1 Running 0 4m pod-template-hash=4046164356,run=myapp myapp-848b5b879b-6hgpp 1/1 Running 0 4m pod-template-hash=4046164356,run=myapp myapp-848b5b879b-hzj5g 1/1 Running 0 4m pod-template-hash=4046164356,run=myapp nginx-86d5b5ddb6-rwv2z 1/1 Running 0 53s app=nginx,pod-template-hash=4281618862 [root@master ~]# kubectl get pods --show-labels -l app NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1/1 Running 0 1m app=nginx,pod-template-hash=4281618862
(3)打一個新的標簽
[root@master ~]# kubectl label pods nginx-86d5b5ddb6-rwv2z release=canary pod/nginx-86d5b5ddb6-rwv2z labeled [root@master ~]# kubectl get pods --show-labels -l release NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1/1 Running 0 4m app=nginx,pod-template-hash=4281618862,release=canary
(4)修改標簽
[root@master ~]# kubectl label pods nginx-86d5b5ddb6-rwv2z release=stable --overwrite pod/nginx-86d5b5ddb6-rwv2z labeled [root@master ~]# kubectl get pods --show-labels -l release NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1/1 Running 0 5m app=nginx,pod-template-hash=4281618862,release=stable
9.4 標簽選擇器
(1)等值關係:=,==,!=
[root@master ~]# kubectl get pods -l release --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1/1 Running 0 6m app=nginx,pod-template-hash=4281618862,release=stable [root@master ~]# kubectl get pods -l release=stable --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-86d5b5ddb6-rwv2z 1/1 Running 0 6m app=nginx,pod-template-hash=4281618862,release=stable [root@master ~]# kubectl get pods -l release!=stable --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-848b5b879b-5blnx 1/1 Running 0 10m pod-template-hash=4046164356,run=myapp myapp-848b5b879b-6hgpp 1/1 Running 0 10m pod-template-hash=4046164356,run=myapp myapp-848b5b879b-hzj5g 1/1 Running 0 10m pod-template-hash=4046164356,run=myapp
(2)集合關係
- KEY in (VALUE1,VALUE2,...):集合中存在此健
- KEY notin (VALUE1,VALUE2,...):集合中不存在此健
- KEY:存在此健
- !KEY:不存在此健
[root@master ~]# kubectl get pods -l "release in (stable,beta,alpha)" NAME READY STATUS RESTARTS AGE nginx-86d5b5ddb6-rwv2z 1/1 Running 0 9m [root@master ~]# kubectl get pods -l "release notin (stable,beta,alpha)" NAME READY STATUS RESTARTS AGE myapp-848b5b879b-5blnx 1/1 Running 0 12m myapp-848b5b879b-6hgpp 1/1 Running 0 12m myapp-848b5b879b-hzj5g 1/1 Running 0 12m
未完待續,後續還會補充更多的kubectl 應用及演示。