Kuberneres之六---kubectl應用快速入門

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區別:

  • NodePort:是在每一個節點上都會打開一個端口,最通透,最直接,但是缺點是需要每個節點都需要打開端口。
  • 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)則是基於集合關係的選擇 器。 另外,使用標籤選擇器時還將遵循以下邏輯。

  1. 同時指定的多個選擇器之間的邏輯關係爲“與”操作。
  2. 使用空值的標籤選擇器意味着每個資源對象都將被選中。
  3. 空的標籤選擇器將無法選出任何資源。

基於等值關係的標籤選擇器的可用操作符有“=”“==”和“!=” 三種,其中前兩個意 義相同,都表示“等值” 關係, 最後一個表示“不等” 關係。 “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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章