1、使用kubectl
1.1 介紹
kubectl用於運行Kubernetes集羣命令的管理工具。
1.2 語法
1
|
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)簡單的查詢操作
查詢節點詳細信息
1
2
3
4
5
|
[root@master ~] # kubectl describe node node1 Name: node1 Roles: <none> Labels: beta.kubernetes.io /arch =amd64 ... ... |
查看版本
1
2
3
|
[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" } |
查看集羣信息
1
2
3
|
[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 命令
1
|
$ 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
1
2
|
[root@master ~] # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 deployment.apps /nginx-deploy created |
(2)在master上查詢驗證
1
2
3
4
5
6
7
8
9
|
[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節點上查詢
1
2
3
|
[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服務
1
2
3
4
5
|
[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 語法
1
|
$ kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)]) |
3.3 演示
刪除剛纔的pod,立刻會生成一個新的pod,因爲此pod是控制器管理的
1
2
3
4
5
6
7
8
|
[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 語法
1
|
$ 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的服務
1
2
3
4
5
6
7
8
9
10
|
[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)驗證,在集羣內部節點訪問服務
1
2
3
4
5
|
[root@master ~] # curl 10.96.212.79 <!DOCTYPE html> <html> < head > <title>Welcome to nginx!< /title > |
(3)刪除pod,立即生產新的pod,但是service還是不變,繼續提供服務,只是指定到新的pod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
---刪除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 語法
1
|
$ kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) |
5.3 演示
(1)先運行名爲myapp標籤選擇器的2個pod,鏡像是我用於測試演示自己構建的
1
2
3
4
5
6
7
8
9
|
[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,並驗證
1
2
3
4
5
6
7
8
9
10
11
12
|
[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個
1
2
3
4
5
6
7
8
9
|
[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個
1
2
3
4
5
6
|
[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 語法
1
|
$ kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N |
6.3 演示
將鏡像版本從v1升級到v2版
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[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 語法
1
|
$ kubectl rollout undo (TYPE NAME | TYPE /NAME ) [flags] |
7.3 演示
1
2
3
4
5
6
7
8
9
10
|
[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 語法
1
|
$ kubectl edit (RESOURCE /NAME | -f FILENAME) |
8.3 演示
(1)修改service,將類型type: ClusterIP,修改爲type: NodePort;修改後,可以在集羣外訪問到pod中的服務
1
2
3
4
5
6
7
8
9
10
|
[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.create與apply區別演示
創建一個develop-ns.yaml配置文件(create用法)
[root@master manifests]# mkdir manifests # 創建一個目錄 [root@master manifests]# cd manifests [root@master manifests]# cat develop-ns.yaml # 創建一個develop-ns.yaml的配置文件 apiVersion: v1 kind: Namespace # 類型是名稱空間 metadata: name: develop # 定義develop名稱空間
使用create開始創建develop名稱空間,如果繼續對此文件繼續創建,就會提示報錯信息
[root@master manifests]# kubectl create -f develop-ns.yaml # create是陳述式創建名稱空間,從develop-ns.yaml文件中加載定義空間名稱 namespace/develop created [root@master manifests]# kubectl get ns # 查看創建的名稱空間 NAME STATUS AGE default Active 6h51m develop Active 57s kube-node-lease Active 6h51m kube-public Active 6h51m kube-system Active 6h51m
創建一個聲明式配置文件(apply用法)
[root@master manifests]# cat prod-ns.yaml # 創建一個prod-ns.yaml聲明式配置文件 apiVersion: v1 kind: Namespace metadata: name: prod
使用apply創建新的pod,如果pod名稱發生改變,就會進行創建pod,如果未發生改變,就會源文件輸出,不會報錯
[root@master manifests]# kubectl apply -f prod-ns.yaml # 使用apply 執行此配置文件,實現聲明式創建 namespace/prod created [root@master manifests]# kubectl get ns # 查看此時創建的名稱空間 NAME STATUS AGE default Active 7h develop Active 9m19s kube-node-lease Active 7h kube-public Active 7h kube-system Active 7h prod Active 2m52s # 創建的新的Prod名稱空間
apply和create之間區別:
apply:可以重複創建一個文件,如果文件內容相同,不發生改變,如果文件內容改變了,可以創建新的pod。
create:只能對相同文件名創建一次名稱空間,如果繼續對一個源文件進行修改後,就會提示報錯信息。
10. 自定義資源配置文件,實現暴露端口
containerPort: 暴露容器端口
- Node Network: 與外部網絡接口
- Service Network:
- Pod Network:
NotePort、hostNetwork和hostPort區別:
- hostPort:是在pod所在節點上打開一個端口
- hostNetwork:讓pod直接共享所在主機的網絡名稱空間,因此pod監聽的端口就是主機的端口,pod的IP就是主機的IP。
1、定義多個容器名稱
[root@master manifests]# cat pod-daem.yaml # 自定義一個pod-daem.yaml資源文件 apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: prod spec: containers: - name: myapp # 第一個容器名稱 image: ikubernetes/myapp:v1 # 指定了鏡像路徑,個人提交的鏡像路徑 - name: bbox # 第二個容器名稱 image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","sleep 86400"]
2、執行資源配置文件,並查看此時執行完成後的pod狀態
[root@master manifests]# kubectl apply -f pod-daem.yaml # 創建並聲明pod-daem.yaml配置文件 pod/pod-demo created [root@master manifests]# kubectl get pods -n prod # 查看此時的prod名稱空間狀態 NAME READY STATUS RESTARTS AGE pod-demo 2/2 Running 0 13s # pod-demo有兩個容器已經運行
3、執行kubectl命令進入進入到pod-demo名稱空間中,查看指定的bbox容器信息
[root@master ~]# kubectl exec pod-demo -c bbox -n prod -it -- /bin/sh # 其中pod-demo是名稱空間 / # ls bin dev etc home proc root sys tmp usr var / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 3: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue link/ether ae:4b:24:1c:2b:3f brd ff:ff:ff:ff:ff:ff inet 10.224.1.11/24 brd 10.224.1.255 scope global eth0 valid_lft forever preferred_lft forever / # netstat -nlt # 可以看出監聽了80端口,實際是上面創建的myapp監聽的端口,因爲pod-demo名稱空間中有兩個容器 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN / # wget -O - -q 127.0.0.1 # 此時訪問myapp容器中的web頁面也可以訪問 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
4、通過kubectl 命令,我們也可以查看到容器裏邊的日誌信息:
[root@master ~]# kubectl logs pod-demo -n prod -c myapp # 查看pod-demo名稱空間裏邊的myapp容器訪問日誌信息 127.0.0.1 - - [24/Jul/2020:14:22:05 +0000] "GET / HTTP/1.1" 200 65 "-" "Wget" "-" 127.0.0.1 - - [24/Jul/2020:14:26:51 +0000] "GET / HTTP/1.1" 200 65 "-" "Wget" "-" 127.0.0.1 - - [24/Jul/2020:14:26:52 +0000] "GET / HTTP/1.1" 200 65 "-" "Wget" "-" 127.0.0.1 - - [24/Jul/2020:14:26:53 +0000] "GET / HTTP/1.1" 200 65 "-" "Wget" "-"
5、我們也可以直接查看容器的IP地址之後,對IP地址進行訪問,然後直接查看pod名稱對應的日誌即可
[root@master ~]# kubectl get pods -o wide # 查看pod名稱 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-5d587c4d45-dlz84 1/1 Running 1 5h48m 10.224.2.8 node2 <none> <none> myapp-5d587c4d45-mwvq5 1/1 Running 1 5h56m 10.224.1.10 node1 <none> <none> nginx-6dd57bccf7-mkrmx 1/1 Running 1 7h12m 10.224.1.9 node1 <none> <none> nginx-dep-84b6dfdcd5-gm9dd 1/1 Running 1 7h5m 10.224.2.10 node2 <none> <none> ngx-dep-5d855b5b54-98rc2 1/1 Running 1 6h42m 10.224.2.9 node2 <none> <none> [root@master ~]# curl 10.224.2.8 # 訪問對應的IP地址 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> [root@master ~]# curl 10.224.2.8 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> [root@master ~]# curl 10.224.2.8 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> [root@master ~]# kubectl logs myapp-5d587c4d45-dlz84 # 查看對應pod的訪問日誌 10.224.0.0 - - [24/Jul/2020:14:30:03 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-" 10.224.0.0 - - [24/Jul/2020:14:30:05 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-" 10.224.0.0 - - [24/Jul/2020:14:30:05 +0000] "GET / HTTP/1.1" 200 65 "-" "curl/7.29.0" "-"
6、創建一個可以暴露容器和宿主機端口的容器
[root@master manifests]# cat pod-daem1.yaml # 創建一個yaml文件 apiVersion: v1 kind: Pod metadata: name: mypod # Pod名稱爲mypod namespace: default spec: containers: - name: myapp # 容器名稱爲myapp image: ikubernetes/myapp:v1 ports: - protocol: TCP # 模式爲TCP containerPort: 80 # 暴露端口是80 name: http # 命名爲http hostPort: 8080 # 暴露宿主機端口號
此時我們可以看到隨機分配到node2宿主機上了,
[root@master manifests]# kubectl apply -f pod-daem1.yaml # 通過yaml配置文件創建一個pod文件 pod/mypod created [root@master manifests]# kubectl get pods -o wide # 查看pod的詳細信息,可以看到mypod在node2容器上運行中 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-5d587c4d45-dlz84 1/1 Running 1 6h 10.224.2.8 node2 <none> <none> myapp-5d587c4d45-mwvq5 1/1 Running 1 6h8m 10.224.1.10 node1 <none> <none> mypod 1/1 Running 0 12s 10.224.2.11 node2 <none> <none> nginx-6dd57bccf7-mkrmx 1/1 Running 1 7h24m 10.224.1.9 node1 <none> <none> nginx-dep-84b6dfdcd5-gm9dd 1/1 Running 1 7h18m 10.224.2.10 node2 <none> <none> ngx-dep-5d855b5b54-98rc2 1/1 Running 1 6h54m 10.224.2.9 node2 <none> <none>
通過node2宿主機的IP地址和暴露的8080端口可以訪問到指定的網頁:
11、label標籤和標籤選擇器
11.1 介紹
更新(增加、修改或刪除)資源上的 label(標籤)。
- label 必須以字母或數字開頭,可以使用字母、數字、連字符、點和下劃線,最長63個字符。
- 如果--overwrite 爲 true,則可以覆蓋已有的 label,否則嘗試覆蓋 label 將會報錯。
- 如果指定了--resource-version,則更新將使用此資源版本,否則將使用現有的資源版本。
標籤(Label)
標籤就是"鍵值"類型的數據,他們可於資源創建時直接指定,也可隨時按需添加於活動對象,而後即可由標籤選擇器進行匹配度檢查從而完成資源挑選。
-
一個對象可擁有不止一個標籤,而同一個標籤也可被添加至多個資源之上
-
實踐中,可以爲資源附加多個不同維度的標籤以實現靈活的資源分組管理功能,例如版本標籤、環境標籤、分層架構標籤等,用於交叉標識同一個資源所屬的不同版本、環境及架構層級等
-
標籤中的鍵名通常由鍵前綴和鍵名組成,其中鍵前綴可選,其格式形如"KEY_PREFIX/KEY_NAME"
-
鍵名之多能使用63個字符,可使用字母、數字、連接號(-),下劃線(_)、點號(.)等字符,且只能以字母或數字開頭
-
鍵前綴必須爲DNS子域名格式,且不餓能超過253個字符。省略鍵前綴時,鍵將被視爲用戶的私有數據,不過由Kubernetes系統組件或第三方組件自動爲用戶資源添加的鍵必須使用鍵前綴,而"Kubernetes.io/"前綴預留給kubernetes的核心組件使用
-
標籤中的兼職必須不能多餘63個祖父,它要麼爲空。要麼時以字母或數字開頭及結尾,且中間僅使用了字母、數字、連接號(-),下劃線(_)、點號(.)等字符的數據
標籤選擇器:
標籤選擇器用於表達標籤的查詢條件或選擇標準, Kubernetes API 目前支持兩個選擇 器:基於等值關係(equality-based)以及基於集合關係(set-based) 。 例如, env=production 和 env!=qa 是基於等值關係的選擇器,而 tier in (fronte時, backend)則是基於集合關係的選擇 器。 另外,使用標籤選擇器時還將遵循以下邏輯。
- 同時指定的多個選擇器之間的邏輯關係爲“與”操作。
- 使用空值的標籤選擇器意味着每個資源對象都將被選中。
- 空的標籤選擇器將無法選出任何資源。
基於等值關係的標籤選擇器的可用操作符有“=”“==”和“!=” 三種,其中前兩個意 義相同,都表示“等值” 關係, 最後一個表示“不等” 關係。 “kubectl get”命令的“”l ”選 項能夠指定使用標籤選擇器,例如,顯示鍵名 env 的值不爲 qa 的所有 Pod 對象:
此外, Kubemetes 的諸多資源對象必須以標籤選擇器的方式關聯到 Pod 資源對象,例如 Service、 Deployment 和 ReplicaSet 類型的資源等,它們在 spec 字段中嵌套使用嵌套的“selector” 字段, 通過“ matchLabels”來指定標籤選擇器,有的甚至還支持使用“mate阻xpressions”構造 複雜的標籤選擇機制。
-
matchLabels:通過直接給定鍵值對來指定標籤選擇器。
-
matchExpressions : 基於表達式指定的標籤選擇器列表,每個選擇器都形如“{key: 阻Y_NAME, operator: OPERATOR, values: [VALUE!, VALUE2,…]}”,選擇器列表 間爲“邏輯與”關係 ;使用 In 或 Notln 操作符時, 其 values 不強制要求爲非空的字 符串列表,而使用 Exists 或 DostNotExist 時,其 values 必須爲空。
11.2 語法
1
|
$ kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version] |
11.3 演示
(1)運行一個標籤爲app=nginx的pod
1
2
|
[root@master ~] # kubectl run nginx --image=nginx:1.14-alpine --replicas=1 --labels="app=nginx" deployment.apps /nginx created |
(2)-l 指定標籤,實現標籤過濾
1
2
3
4
5
6
7
8
9
|
[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)打一個新的標籤
1
2
3
4
5
|
[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)修改標籤
1
2
3
4
5
|
[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 |
11.4 標籤選擇器
(1)等值關係:=,==,!=
1
2
3
4
5
6
7
8
9
10
11
|
[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
標籤實例:
1、查看pods的所有標籤:
[root@master ~]# kubectl get pods --show-labels # 查看此時的pods標籤 NAME READY STATUS RESTARTS AGE LABELS myapp-5d587c4d45-dlz84 0/1 Completed 1 17h app=myapp,pod-template-hash=5d587c4d45 myapp-5d587c4d45-mwvq5 0/1 Completed 1 17h app=myapp,pod-template-hash=5d587c4d45 mypod 0/1 Completed 0 11h <none> nginx-6dd57bccf7-mkrmx 0/1 Completed 1 18h app=nginx,pod-template-hash=6dd57bccf7 nginx-dep-84b6dfdcd5-gm9dd 0/1 Completed 1 18h app=nginx-dep,pod-template-hash=84b6dfdcd5 ngx-dep-5d855b5b54-98rc2 0/1 Completed 1 18h app=ngx-dep,pod-template-hash=5d855b5b54
2、自定義一個標籤資源文件
[root@master manifests]# cat pod-daem.yaml apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: prod labels: # 定義多個標籤 app: pod-demo # 標籤名稱爲pod-demo rel: stable 第二個標籤,試出版本是stable spec: containers: - name: myapp image: ikubernetes/myapp:v1 - name: bbox image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh","-c","sleep 86400"
執行pod-demo.yaml文件,創建附帶標籤的pod,並查看此時的標籤名稱。
[root@master manifests]# kubectl apply -f pod-daem.yaml # 重新創建pod pod/pod-demo configured [root@master manifests]# kubectl get pods -n prod --show-labels # 查看此時添加的標籤名稱 NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 2 11h app=pod-demo,rel=stable # 可以看到此時就有兩個標籤名稱
我們也可以使用label指令指明要創建的標籤,需要指定pod名稱爲pod-demo和指定的namespace名稱空間信息爲prod
[root@master manifests]# kubectl label pods pod-demo -n prod tier=frontend # 創建一個frontend的標籤名稱 pod/pod-demo labeled [root@master manifests]# kubectl get pods -n prod --show-labels # 查看此時新創建的標籤名frontend NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 2 11h app=pod-demo,rel=stable,tier=frontend # 查看此時定義的標籤名
修改此時的標籤的鍵,即:將app改爲myapp,使用--overwrite選項即可
[root@master manifests]# kubectl label pods pod-demo -n prod --overwrite app=myapp #將app修改爲myapp pod/pod-demo labeled [root@master manifests]# kubectl get pods -n prod --show-labels NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 2 11h app=myapp,rel=stable,tier=frontend
如果我們想刪除一個標籤怎麼辦?直接在標籤的鍵後面加一個減號即可,如下所示,想刪除rel的標籤,直接在鍵後面加減號即
[root@master manifests]# kubectl label pods pod-demo -n prod rel- # 刪除rel標籤,此時在rel後面加-即可 pod/pod-demo labeled [root@master manifests]# kubectl get pods -n prod --show-labels # 查看此時的標籤已經被刪除 NAME READY STATUS RESTARTS AGE LABELS pod-demo 2/2 Running 2 12h app=myapp,tier=frontend
標籤選擇器
-l選項是指定標籤,然後實現過濾信息:
[root@master manifests]# kubectl get pods --show-labels -l app=myapp # 查看標籤中app=myapp的pod NAME READY STATUS RESTARTS AGE LABELS myapp-5d587c4d45-dlz84 1/1 Running 2 17h app=myapp,pod-template-hash=5d587c4d45 myapp-5d587c4d45-mwvq5 1/1 Running 2 17h app=myapp,pod-template-hash=5d587c4d45 [root@master manifests]# kubectl get pods --show-labels -l app!=myapp # 查看標籤中app不等於myapp的pod NAME READY STATUS RESTARTS AGE LABELS mypod 1/1 Running 1 11h <none> nginx-6dd57bccf7-mkrmx 1/1 Running 2 18h app=nginx,pod-template-hash=6dd57bccf7 nginx-dep-84b6dfdcd5-gm9dd 1/1 Running 2 18h app=nginx-dep,pod-template-hash=84b6dfdcd5 ngx-dep-5d855b5b54-98rc2 1/1 Running 2 18h app=ngx-dep,pod-template-hash=5d855b5b54
查看指定app標籤中的信息
[root@master manifests]# kubectl get pods --show-labels -l "app in (myapp,ngx-dep)" # 查看與app關聯的pod NAME READY STATUS RESTARTS AGE LABELS myapp-5d587c4d45-dlz84 1/1 Running 2 17h app=myapp,pod-template-hash=5d587c4d45 myapp-5d587c4d45-mwvq5 1/1 Running 2 17h app=myapp,pod-template-hash=5d587c4d45 ngx-dep-5d855b5b54-98rc2 1/1 Running 2 18h app=ngx-dep,pod-template-hash=5d855b5b54 [root@master manifests]# kubectl get pods -l "app in (myapp,ngx-dep)" -L app # -L選項是隻看app的鍵值對中的值 NAME READY STATUS RESTARTS AGE APP myapp-5d587c4d45-dlz84 1/1 Running 2 17h myapp myapp-5d587c4d45-mwvq5 1/1 Running 2 17h myapp ngx-dep-5d855b5b54-98rc2 1/1 Running 2 18h ngx-dep
轉載:https://www.cnblogs.com/along21/p/10304362.html