上一节讲到了label标签,label标签属于metadata元数据对象的一个属性,这节讲下另外两个属性 annotations 和 namespace 以及 label 在 node 节点的使用。
Annotations 是注解的意思,和Label类似,也使用key/value 键值对进行定义,Annotations 的作用类似代码的注释功能,可以为资源添加说明,可以是镜像的相关信息,日志记录,负责人信息等等。
编辑deployment 资源配置文件,添加 Annotations 注释 imageregistry: "https://index.docker.io/v1/":
[root@ylserver10686071 ~]# cat deployment.yml apiVersion: apps/v1 kind: Deployment metadata: name: app003 spec: replicas: 1 selector: matchLabels: app: web template: metadata: annotations: imageregistry: "https://index.docker.io/v1/" labels: app: web spec: containers: - name: tomcat image: tomcat:8.0
创建deployment,查看 pod annotations 信息,可以看到添加的 imageregistry ,另外2个 key/value 则为自动写入信息,记录 pod的IP地址:
[root@ylserver10686071 ~]# kubectl describe pod app003|grep -5 Annotations
Priority: 0
Node: ylserver10686072/10.68.60.72
Start Time: Sun, 18 Jul 2021 21:47:18 +0800
Labels: app=web
pod-template-hash=569979b4c7
Annotations: cni.projectcalico.org/podIP: 10.233.67.26/32
cni.projectcalico.org/podIPs: 10.233.67.26/32
imageregistry: https://index.docker.io/v1/
Status: Running
IP: 10.233.67.26
IPs:
[root@ylserver10686071 ~]#
在metadata元数据对象里还有一个很重要的属性,就是namespace 命名空间,namespace 是 k8s 支持多个虚拟集群,底层依赖于同一个物理集群,当多团队或多项目的场景可以用到命名空间,命名空间也可以进行资源配额。
查看系统已经创建的namespace,其中default为默认namespace,资源不指定namespace时,默认使用该namespace,kube-system则为系统创建对象所使用的namespace:
[root@ylserver10686071 ~]# kubectl get namespace NAME STATUS AGE default Active 6d8h ingress-nginx Active 6d7h kube-node-lease Active 6d8h kube-public Active 6d8h kube-system Active 6d8h [root@ylserver10686071 ~]#
创建一个名为 prod 的namespace:
[root@ylserver10686071 ~]# kubectl create namespace prod namespace/prod created [root@ylserver10686071 ~]#
创建 deployment 资源,namespace 为 prod:
[root@ylserver10686071 ~]# cat deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app004
namespace: prod
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
annotations:
imageregistry: "https://index.docker.io/v1/"
labels:
app: web
spec:
containers:
- name: tomcat
image: tomcat:8.0
应用配置文件并查看,参数 -n 为跳转到指定命名空间:
[root@ylserver10686071 ~]# kubectl apply -f deployment.yml
deployment.apps/app004 created
[root@ylserver10686071 ~]# kubectl get deployments -n prod
NAME READY UP-TO-DATE AVAILABLE AGE
app004 1/1 1 1 15s
metadata元数据对象的一些属性也可以注释到pod 的env对象的属性中,最终在Container的环境变量中可以直接调用,编写deployment 资源配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app005
namespace: prod
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
annotations:
imageregistry: "https://index.docker.io/v1/"
labels:
app: web
spec:
containers:
- name: tomcat
image: tomcat:8.0
env:
- name: "NODENAME"
valueFrom:
fieldRef:
fieldPath: metadata.name
创建deployment资源,并进入 pod的 tomcat 容器中:
[root@ylserver10686071 ~]# kubectl apply -f deployment.yml
deployment.apps/app005 created
[root@ylserver10686071 ~]# kubectl exec -it app005-569979b4c7-gfrr2 -c tomcat -n prod -- env|grep -2 NODENAME
HOSTNAME=app005-569979b4c7-gfrr2
TERM=xterm
NODENAME=app005-569979b4c7-gfrr2
KUBERNETES_PORT_443_TCP=tcp://10.233.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
[root@ylserver10686071 ~]#
允许注入pod env的对象有: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP", "status.podIPs"
label标签还可以应用到 node 节点上,node 节点就是宿主机,查看之前创建的pod 在哪个node上创建:
[root@ylserver10686071 ~]# kubectl get pods -n prod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app004-569979b4c7-h4zxx 1/1 Running 0 10m 10.233.67.28 ylserver10686072 <none> <none> app005-569979b4c7-gfrr2 1/1 Running 0 3m51s 10.233.75.61 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#
如果pod在创建的时候没有指定某个node,则会根据k8s 内置的调度算法在某个node上启动,我们也可以给某个node 做 label标记,然后使用标签选择器指定该label,从而达到pod在指定的node上启动。
查看集群所有node节点:
[root@ylserver10686071 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION ylserver10686071 Ready master 6d8h v1.19.10 ylserver10686072 Ready master 6d8h v1.19.10 ylserver10686073 Ready master 6d8h v1.19.10 [root@ylserver10686071 ~]#
给node节点 ylserver10686073 打上标签 disk=ssd :
[root@ylserver10686071 ~]# kubectl label node ylserver10686073 disk=ssd node/ylserver10686073 labeled [root@ylserver10686071 ~]#
查看 node 节点 ylserver10686073 所有label,可以看到已经打上 disk=ssd 标签:
[root@ylserver10686071 ~]# kubectl get node ylserver10686073 --show-labels
NAME STATUS ROLES AGE VERSION LABELS
ylserver10686073 Ready master 6d8h v1.19.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=ylserver10686073,kubernetes.io/os=linux,node-role.kubernetes.io/master=
[root@ylserver10686071 ~]#
编辑deployment配置文件,指定在label 包含 disk=ssd 的node上启动:
[root@ylserver10686071 ~]# cat deployment.yml apiVersion: apps/v1 kind: Deployment metadata: name: app006 namespace: prod spec: replicas: 1 selector: matchLabels: app: web template: metadata: annotations: imageregistry: "https://index.docker.io/v1/" labels: app: web spec: nodeSelector: "disk": ‘ssd‘ containers: - name: tomcat image: tomcat:8.0 env: - name: "NODENAME" valueFrom: fieldRef: fieldPath: metadata.name
创建deployment app006,并查看 pod:
[root@ylserver10686071 ~]# kubectl apply -f deployment.yml deployment.apps/app006 created [root@ylserver10686071 ~]# kubectl get pods -n prod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app004-569979b4c7-h4zxx 1/1 Running 0 28m 10.233.67.28 ylserver10686072 <none> <none> app005-569979b4c7-gfrr2 1/1 Running 0 22m 10.233.75.61 ylserver10686071 <none> <none> app006-748746dccf-pjj9d 1/1 Running 0 3m43s 10.233.72.37 ylserver10686073 <none> <none> [root@ylserver10686071 ~]#
node label也可以删除,只需要在key后面加 - ,删除disk=ssd 标签如下:
[root@ylserver10686071 ~]# kubectl label node ylserver10686073 disk- node/ylserver10686073 labeled [root@ylserver10686071 ~]# kubectl get node ylserver10686073|grep disk [root@ylserver10686071 ~]#
删除node label,已经创建的pod 不会受到影响:
[root@ylserver10686071 ~]# kubectl get pods -n prod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app004-569979b4c7-h4zxx 1/1 Running 0 30m 10.233.67.28 ylserver10686072 <none> <none> app005-569979b4c7-gfrr2 1/1 Running 0 24m 10.233.75.61 ylserver10686071 <none> <none> app006-748746dccf-pjj9d 1/1 Running 0 5m51s 10.233.72.37 ylserver10686073 <none> <none> [root@ylserver10686071 ~]#
总结一下:
- metadata元数据对象属性中 Annotations 和 Label 都用 key/value 键值对 定义,Annotations 为用户添加的额外注解,Label为上层控制器对下层控制器的匹配定位;
- metadata元数据的一些对象属性以及spec、status的一些对象属性可以注入到pod 的env环境变量中;
- Label标签也可以应用到node节点上,pod可以根据node节点包含的label 选择在哪些node上启动。