目录
-
Kubernetes之(七)Pod控制器应用进阶
-
Pod控制器下spec常用字段
- 标签(Labels)和标签选择器(LabelSelector)
-
标签
* 标签选择器
Kubernetes之(七)Pod控制器应用进阶
Pod控制器下spec常用字段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1#containers
2[root@master ~]# kubectl explain pods.spec.containers.
3name <string> -required- #容器名,必选字段
4image <string> #镜像,默认是dockerhub仓库,可以客户自己定义仓库
5imagePullPolicy <string> #镜像获取策略,Always(总是下载),IfNotPresent(如果本地不存在就下载),Never(从不下载,使用本地镜像),默认IfNotPresent,如果镜像标签是latest,默认是Always
6ports <[]Object> # 对象列表,可以暴漏多个端口,也可以对每个端口的属性进行单独定义,此处暴漏端口只是提供额外信息,不能限制系统是否真的暴漏
7 - containerPort <integer>#容器端口
8 hostIP <string> #主机IP(一般不需要)
9 hostPort <integer> #节点端口
10 name <string> #名称
11 protocol <string> #使用协议,默认是TCP
12args <[]string> #为command传递参数,相当于docker的CMD
13
14command <[]string> #运行的命令 相当于docker中的ENTRYPOINT
15
the command run by container
entrypoint
command
the arguments passed to the command
Cmd
args
说明:
1、如果pod不提供command和args则默认使用docker镜像中的entrypoint和Cmd;
2、如果pod只提供command但是不提供args,则只使用command,docker镜像中的entrypoint和cmd都会被忽略;
3、如果pod不提供command但是只提供args,则使用docker镜像中默认的entrypoint,并且把pod中定义的args当作参数传给entrypoint,docker镜像中的cmd被忽略;
4、如果pod既提供command又提供args,那么就直接运行command和args,docker镜像中的entrypoint和cmd都被忽略。
标签(Labels)和标签选择器(LabelSelector)
标签
- 使用标签把资源分类分组,可以方便管理资源
- 所谓标签就是资源附加的键值对,key:只能使用,字母,数字 _ – . (只能以字母数字开头,不能超过63给字符),value: 可以为空,只能使用,字母,数字开头
- 每一个标签都可以被标签选择器进行匹配度检查,从而完成资源挑选
- 一个资源对象可有多个标签,同一个标签也可以对应多个资源
- 可以在创建资源的时候配置标签,也可以使用kubectl label进行后期打标
显示所有pod的所有标签
1
2
3
4
5
6
7
8
9 1[root@master ~]# kubectl get pods --show-labels
2NAME READY STATUS RESTARTS AGE LABELS
3client-f5cdb799f-pklmc 1/1 Running 0 19h pod-template-hash=f5cdb799f,run=client
4myapp-9b4987d5-47sjj 1/1 Running 0 19h pod-template-hash=9b4987d5,run=myapp
5myapp-9b4987d5-684q9 1/1 Running 0 19h pod-template-hash=9b4987d5,run=myapp
6myapp-9b4987d5-djdr9 1/1 Running 0 19h pod-template-hash=9b4987d5,run=myapp
7nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 23h pod-template-hash=84cbfc56b6,run=nginx-deploy
8pod-demo 2/2 Running 1 16h app=myapp,tier=frontend
9
筛选包含app标签的pod
1
2
3
4 1[root@master ~]# kubectl get pods -l app
2NAME READY STATUS RESTARTS AGE
3pod-demo 2/2 Running 2 17h
4
显示所有pod标签为app的值,没有则显示为空
1
2
3
4
5
6
7
8
9 1[root@master ~]# kubectl get pods -L app
2NAME READY STATUS RESTARTS AGE APP
3client-f5cdb799f-pklmc 1/1 Running 0 20h
4myapp-9b4987d5-47sjj 1/1 Running 0 20h
5myapp-9b4987d5-684q9 1/1 Running 0 20h
6myapp-9b4987d5-djdr9 1/1 Running 0 20h
7nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 24h
8pod-demo 2/2 Running 2 17h myapp
9
使用kubectl label给资源打标签
1
2
3
4 1#语法
2 kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N
3[--resource-version=version] [options]
4
1
2
3
4
5
6
7
8
9
10
11
12 1[root@master manifests]# kubectl label pod pod-demo release=canary
2pod/pod-demo labeled
3
4[root@master manifests]# kubectl get pods --show-labels
5NAME READY STATUS RESTARTS AGE LABELS
6client-f5cdb799f-pklmc 1/1 Running 0 20h pod-template-hash=f5cdb799f,run=client
7myapp-9b4987d5-47sjj 1/1 Running 0 20h pod-template-hash=9b4987d5,run=myapp
8myapp-9b4987d5-684q9 1/1 Running 0 20h pod-template-hash=9b4987d5,run=myapp
9myapp-9b4987d5-djdr9 1/1 Running 0 20h pod-template-hash=9b4987d5,run=myapp
10nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 24h pod-template-hash=84cbfc56b6,run=nginx-deploy
11pod-demo 2/2 Running 2 17h app=myapp,release=canary,tier=frontends
12
筛选同时包含多个标签的pod
1
2
3
4 1[root@master manifests]# kubectl get pods -l release,app
2NAME READY STATUS RESTARTS AGE
3pod-demo 2/2 Running 2 17h
4
标签选择器
- 等值关系:=,==,!=
- 集合关系:
- KEY in (VALUE1,VALUE2…)
- KEY notin (VALUE1,VALUE2…)
- KEY (表示存在KEY)
- !KEY (表示不存在KEY)
许多资源支持内嵌字段定义其使用的标签选择器:
- matchLabels: 直接给定键值 类似等值关系
- matchExpressions: 基于给定的表达式来定义使用标签选择器,{key: "KEY", opeartor: "OPERATOR", values: [VAL1,VAL2…]}
意思是给定的key键对values的值做基于operator表达式的比较,是否满足条件。其中 operator常用的有 In NotIn Exits NotExits,
- In NotIn: value必须是非空列表,
- Exits NotExits: values必须是空列表
- annotations:与label不同的地方:它不能用于挑选资源对象,仅用于为对象提供"元数据",没有键值长度限制。
节点标签选择器
在添加资源时,可以让资源对节点有倾向性。
1
2
3
4 1[root@master ~]# kubectl explain pods.spec.
2 nodeName <string> #指定node名称
3 nodeSelector <map[string]string> #使用标签选择器
4
给node01打标签disktype=ssd,然后运行pod-demo使用节点标签选择器,使之运行在node01上
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 1#给node01打标签
2[root@master manifests]# kubectl label node node01 disktype=ssd
3node/node01 labeled
4[root@master manifests]# kubectl get nodes --show-labels
5NAME STATUS ROLES AGE VERSION LABELS
6master Ready master 43h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=master,node-role.kubernetes.io/master=
7node01 Ready <none> 42h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=node01
8node02 Ready <none> 42h v1.13.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=node02
9
10#编辑pod-demo.yaml
11[root@master manifests]# vim pod-demo_1.yaml
12apiVersion: v1
13kind: Pod
14metadata:
15 name: pod-demo
16 namespace: default
17 #labels: {"app": "myapp","tier": "frontend"} 和下面效果一样,建议使用下面格式
18 labels:
19 app: myapp
20 tier: frontend
21spec:
22 containers:
23 - name: myapp
24 image: ikubernetes/myapp:v1
25 - name: busybox
26 image: busybox
27 command:
28 - "/bin/sh"
29 - "-c"
30 - "sleep 3600"
31 nodeSelector:
32 disktype: ssd
33
34#重新部署pod-demo,需提前删除原pod-demo
35[root@master manifests]# kubectl delete -f pod-demo.yaml
36pod "pod-demo" deleted
37[root@master manifests]# kubectl apply -f pod-demo_1.yaml
38pod/pod-demo created
39
40#验证结果
41[root@master manifests]# kubectl get pods -o wide
42NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
43client-f5cdb799f-pklmc 1/1 Running 0 20h 10.244.2.7 node02 <none> <none>
44myapp-9b4987d5-47sjj 1/1 Running 0 20h 10.244.1.13 node01 <none> <none>
45myapp-9b4987d5-684q9 1/1 Running 0 20h 10.244.1.12 node01 <none> <none>
46myapp-9b4987d5-djdr9 1/1 Running 0 20h 10.244.2.13 node02 <none> <none>
47nginx-deploy-84cbfc56b6-tcssz 1/1 Running 0 24h 10.244.2.4 node02 <none> <none>
48pod-demo 2/2 Running 0 10s 10.244.1.14 node01 <none> <none>
49
增加annotations注解,使用kubectl describe查看
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
26
27
28
29
30
31
32
33
34
35
36
37
38 1[root@master manifests]# cat pod-demo_1.yaml
2apiVersion: v1
3kind: Pod
4metadata:
5 name: pod-demo
6 namespace: default
7 labels:
8 app: myapp
9 tier: frontend
10 annotations:
11 white.io/created-by: "cluster white"
12spec:
13 containers:
14 - name: myapp
15 image: ikubernetes/myapp:v1
16 - name: busybox
17 image: busybox
18 command:
19 - "/bin/sh"
20 - "-c"
21 - "sleep 3600"
22 nodeSelector:
23 disktype: ssd
24#需要使用kubectl describe pods pod-demo来查看才看的到
25[root@master manifests]# kubectl describe pods pod-demo
26Name: pod-demo
27Namespace: default
28Priority: 0
29PriorityClassName: <none>
30Node: node01/10.0.0.11
31Start Time: Fri, 29 Mar 2019 11:30:51 +0800
32Labels: app=myapp
33 tier=frontend
34Annotations: white.io/created-by: cluster white
35Status: Running
36IP: 10.244.1.15
37... ...
38