3.6 资源注解
除了标签之外,Kubernetes的API对象还支持使用资源注解(annotations)。类似于标签,注解也是键值型数据,不过它不能用作标签,也不能用于挑选API对象。资源注解的核心目的是为资源提供“元数据”信息,但注解的值不受字符数量的限制,它可大可小,可以是结构化或非结构化形式,也支持在标签中禁用其他字符。
资源注解可由用户手动添加,也可由工具程序自动附加并使用。在Kubernetes的新版本(Alpha或Beta阶段)中计划为某资源引入新字段时常以注解方式提供,以避免字段名称变更、增删等变动给用户带去困扰,一旦确定使用这些新增字段,则将其引入资源规范中并淘汰相关的注解信息。另外,为资源添加注解也可让其他用户快速了解资源的相关信息,例如创建者身份等。以下为常用的场景案例。
▪由声明式配置(例如apply命令)管理的字段:将这些字段定义为注解,有助于识别由服务器或客户端设定的默认值、系统自动生成的字段以及由自动伸缩系统生成的字段。
▪构建、发行或镜像相关的信息,例如时间戳、发行ID、Git分支、PR号码、镜像哈希及仓库地址等。
▪指向日志、监控、分析或审计仓库的指针。
▪由客户端库或工具程序生成的用于调试目的的信息:例如名称、版本、构建信息等。
▪用户或工具程序的来源地信息,例如来自其他生态系统组件的相关对象的URL。
▪轻量化滚动升级工具的元数据,例如config及checkpoints。
▪相关人员的电话号码等联系信息,或指向类似信息的可寻址的目录条目,例如网站站点。
kubectl get -o yaml和kubectl describe命令均能显示资源的注解信息。例如,下面的命令打印出了节点对象k8s-master01.ilinux.io的注解信息:
~ $ kubectl get nodes k8s-master01.ilinux.io -o yaml apiVersion: v1 kind: Node metadata: annotations: flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"da:49:da:c7:8c:a1"}' flannel.alpha.coreos.com/backend-type: vxlan flannel.alpha.coreos.com/kube-subnet-manager: "true" flannel.alpha.coreos.com/public-ip: 172.29.9.1 kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: "0" volumes.kubernetes.io/controller-managed-attach-detach: "true" creationTimestamp: "2020-02-16T06:23:03Z" ……
annotations可在资源创建时由metadata.annotations字段指定,也可随时按需在活动的资源上使用kubectl annotate命令进行添加。例如,可以使用下面的命令为eshop名称空间添加注解:
~$ kubectl annotate namespaces/eshop ilinux.io/created-by='cluster admin' namespace/eshop annotated
删除活动对象上的注解时同样要使用kubectl annotate命令,但仅需指定注解键名并紧跟一个减号“–”即可。例如,下面的命令会删除eshop名称空间中的ilinux.io/created-by注解:
~$ kubectl annotate namespaces/eshop ilinux.io/created-by- namespace/eshop annotated
有些应用程序还支持通过注解信息进行高级配置,例如ingress-nginx提供了众多专用的注解,以允许用户向应用注入指定的高级配置。在下面配置清单中的Ingress资源示例中,注解nginx.org/server-snippets还使用了多行值的格式。
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: cafe-ingress-with-annotations annotations: nginx.org/proxy-connect-timeout: "30s" nginx.org/proxy-read-timeout: "20s" nginx.org/client-max-body-size: "4m" nginx.org/server-snippets: | location / { return 302 /somewhere; } spec: rules: ……
Nginx的Ingress Controller对应的Pod对象在读取Ingress配置清单时会将注解中给定的配置转换为Nginx程序的配置信息,并由相应的进程加载使用。