Kubernetes Master-Node通信

概述

本文主要介绍master和Kubernetes集群之间通信路径。其目的是允许用户自定义安装,以增强网络配置,使集群可以在不受信任(untrusted)的网络上运行。

Cluster -> Master

从集群到Master节点的所有通信路径都在apiserver中终止。一个典型的deployment ,如果apiserver配置为监听运程连接上的HTTPS 443端口,应启用一种或多种client authentication,特别是如果允许anonymous requests或service account tokens 。

Node节点应该配置为集群的公共根证书,以便安全地连接到apiserver。

希望连接到apiserver的Pod可以通过service account来实现,以便Kubernetes在实例化时自动将公共根证书和有效的bearer token插入到pod中,kubernetes service (在所有namespaces中)都配置了一个虚拟IP地址,该IP地址由apiserver重定向(通过kube - proxy)到HTTPS。

Master组件通过非加密(未加密或认证)端口与集群apiserver通信。这个端口通常只在Master主机的localhost接口上暴露。

Master -> Cluster

从Master (apiserver)到集群有两个主要的通信路径。第一个是从apiserver到在集群中的每个节点上运行的kubelet进程。第二个是通过apiserver的代理功能从apiserver到任何node、pod或service 。

apiserver - > kubelet

从apiserver到kubelet的连接用于获取pod的日志,通过kubectl来运行pod,并使用kubelet的端口转发功能。这些连接在kubelet的HTTPS终端处终止。

默认情况下,apiserver不会验证kubelet的服务证书,这会使连接不受到保护。

要验证此连接,使用--kubelet-certificate-authority flag为apiserver提供根证书包,以验证kubelet的服务证书。

如果不能实现,那么请在apiserver和kubelet之间使用 SSH tunneling

最后,应该启用Kubelet认证或授权来保护Kubelet API。

apiserver -> nodes、pods、services

从apiserver到Node、Pod或Service的连接默认为HTTP连接,因此不需进行认证加密。也可以通过HTTPS的安全连接,但是它们不会验证HTTPS 端口提供的证书,也不提供客户端凭据,因此连接将被加密但不会提供任何诚信的保证。这些连接不可以在不受信任/或公共网络上运行。

SSH Tunnels

Google Container Engine 使用SSH tunnels来保护 Master -> 集群 通信路径,SSH tunnel能够使Node、Pod或Service发送的流量不会暴露在集群外部。

K8S中文社区微信公众号

Kubernetes Nodes

Node是什么?

Node是Kubernetes中的工作节点,最开始被称为minion。一个Node可以是VM或物理机。每个Node(节点)具有运行pod的一些必要服务,并由Master组件进行管理,Node节点上的服务包括Docker、kubelet和kube-proxy。有关更多详细信息,请参考架构设计文档中的“Kubernetes Node”部分。

Node Status

节点的状态信息包含:

  • Addresses
  • Phase (已弃用)
  • Condition
  • Capacity
  • Info

下面详细描述每个部分。

Addresses

这些字段的使用取决于云提供商或裸机配置。

  • HostName:可以通过kubelet 中 --hostname-override参数覆盖。
  • ExternalIP:可以被集群外部路由到的IP。
  • InternalIP:只能在集群内进行路由的节点的IP地址。

Phase

不推荐使用,已弃用。

Condition

conditions字段描述所有Running节点的状态。

Node Condition Description
OutOfDisk True:如果节点上没有足够的可用空间来添加新的pod;否则为:False
Ready True:如果节点是健康的并准备好接收pod;False:如果节点不健康并且不接受pod;Unknown:如果节点控制器在过去40秒内没有收到node的状态报告。
MemoryPressure True:如果节点存储器上内存过低; 否则为:False。
DiskPressure True:如果磁盘容量存在压力 - 也就是说磁盘容量低;否则为:False。

node condition被表示为一个JSON对象。例如,下面的响应描述了一个健康的节点。

"conditions": [
  {
    "kind": "Ready",
    "status": "True"
  }
]

如果Ready condition的Status是“Unknown” 或 “False”,比“pod-eviction-timeout”的时间长,则传递给“ kube-controller-manager”的参数,该节点上的所有Pod都将被节点控制器删除。默认的eviction timeout时间为5分钟。在某些情况下,当节点无法访问时,apiserver将无法与kubelet通信,删除Pod的需求不会传递到kubelet,直到重新与apiserver建立通信,这种情况下,计划删除的Pod会继续在划分的节点上运行。

在Kubernetes 1.5之前的版本中,节点控制器将强制从apiserver中删除这些不可达(上述情况)的pod。但是,在1.5及更高版本中,节点控制器在确认它们已经停止在集群中运行之前,不会强制删除Pod。可以看到这些可能在不可达节点上运行的pod处于"Terminating"或 “Unknown”。如果节点永久退出集群,Kubernetes是无法从底层基础架构辨别出来,则集群管理员需要手动删除节点对象,从Kubernetes删除节点对象会导致运行在上面的所有Pod对象从apiserver中删除,最终将会释放names。

Capacity

描述节点上可用的资源:CPU、内存和可以调度到节点上的最大pod数。

Info

关于节点的一些基础信息,如内核版本、Kubernetes版本(kubelet和kube-proxy版本)、Docker版本(如果有使用)、OS名称等。信息由Kubelet从节点收集。

Management

与 pods 和 services 不同,节点不是由Kubernetes 系统创建,它是由Google Compute Engine等云提供商在外部创建的,或使用物理和虚拟机。这意味着当Kubernetes创建一个节点时,它只是创建一个代表节点的对象,创建后,Kubernetes将检查节点是否有效。例如,如果使用以下内容创建一个节点:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

Kubernetes将在内部创建一个节点对象,并通过基于metadata.name字段的健康检查来验证节点,如果节点有效,即所有必需的服务会同步运行,则才能在上面运行pod。请注意,Kubernetes将保留无效节点的对象(除非客户端有明确删除它)并且它将继续检查它是否变为有效。

目前,有三个组件与Kubernetes节点接口进行交互:节点控制器(node controller)、kubelet和kubectl。

Node Controller

节点控制器(Node Controller)是管理节点的Kubernetes master组件。

节点控制器在节点的生命周期中具有多个角色。第一个是在注册时将CIDR块分配给节点。

第二个是使节点控制器的内部列表与云提供商的可用机器列表保持最新。当在云环境中运行时,每当节点不健康时,节点控制器将询问云提供程序是否该节点的VM仍然可用,如果不可用,节点控制器会从其节点列表中删除该节点。

第三是监测节点的健康状况。当节点变为不可访问时,节点控制器负责将NodeStatus的NodeReady条件更新为ConditionUnknown,随后从节点中卸载所有pod ,如果节点继续无法访问,(默认超时时间为40 --node-monitor-period秒,开始报告ConditionUnknown,之后为5m开始卸载)。节点控制器按每秒来检查每个节点的状态。

在Kubernetes 1.4中,我们更新了节点控制器的逻辑,以更好地处理大量节点到达主节点的一些问题(例如,主节某些网络问题)。从1.4开始,节点控制器将在决定关于pod卸载的过程中会查看集群中所有节点的状态。

在大多数情况下,节点控制器将逐出速率限制为 --node-eviction-rate(默认为0.1)/秒,这意味着它不会每10秒从多于1个节点驱逐Pod。

当给定可用性的区域中的节点变得不健康时,节点逐出行为发生变化,节点控制器同时检查区域中节点的不健康百分比(NodeReady条件为ConditionUnknown或ConditionFalse)。如果不健康节点的比例为 --unhealthy-zone-threshold(默认为0.55),那么驱逐速度就会降低:如果集群很小(即小于或等于--large-cluster-size-threshold节点 - 默认值为50),则停止驱逐,否则, --secondary-node-eviction-rate(默认为0.01)每秒。这些策略在可用性区域内实现的原因是,一个可用性区域可能会从主分区中被分区,而其他可用区域则保持连接。如果集群没有跨多个云提供商可用性区域,那么只有一个可用区域(整个集群)。

在可用区域之间传播节点的一个主要原因是,当整个区域停止时,工作负载可以转移到健康区域。因此,如果区域中的所有节点都不健康,则节点控制器以正常速率逐出--node-eviction-rate。如所有的区域都是完全不健康的(即群集中没有健康的节点),在这种情况下,节点控制器会假设主连接有一些问题,并停止所有驱逐,直到某些连接恢复。

从Kubernetes 1.6开始,节点控制器还负责驱逐在节点上运行的NoExecutepod。

Self-Registration of Nodes

当kubelet flag --register-node为true(默认值)时,kubelet将向API服务器注册自身。这是大多数发行版使用的首选模式。

对于self-registration,kubelet从以下选项开始:

  • --api-servers - Location of the apiservers.
  • --kubeconfig - Path to credentials to authenticate itself to the apiserver.
  • --cloud-provider - How to talk to a cloud provider to read metadata about itself.
  • --register-node - Automatically register with the API server.
  • --register-with-taints - Register the node with the given list of taints (comma separated <key>=<value>:<effect>). No-op if register-node is false.
  • --node-ip IP address of the node.
  • --node-labels - Labels to add when registering the node in the cluster.
  • --node-status-update-frequency - Specifies how often kubelet posts node status to master.

 

手动管理节点

集群管理员可以创建和修改节点对象。

如果管理员希望手动创建节点对象,请设置kubelet flag  --register-node=false。

管理员可以修改节点资源(不管--register-node设置如何),修改包括在节点上设置的labels 标签,并将其标记为不可调度的。

节点上的标签可以与pod上的节点选择器一起使用,以控制调度,例如将一个pod限制为只能在节点的子集上运行。

将节点标记为不可调度将防止新的pod被调度到该节点,但不会影响节点上的任何现有的pod,这在节点重新启动之前是有用的。例如,要标记节点不可调度,请运行以下命令:

kubectl cordon $NODENAME

注意,由daemonSet控制器创建的pod可以绕过Kubernetes调度程序,并且不遵循节点上无法调度的属性。

Node容量

节点的容量(cpu数量和内存数量)是节点对象的一部分。通常,节点在创建节点对象时注册并通知其容量。如果是手动管理节点,则需要在添加节点时设置节点容量。

Kubernetes调度程序可确保节点上的所有pod都有足够的资源。它会检查节点上容器的请求的总和不大于节点容量。

如果要明确保留非pod过程的资源,可以创建一个占位符pod。使用以下模板:

apiVersion: v1
kind: Pod
metadata:
  name: resource-reserver
spec:
  containers:
  - name: sleep-forever
    image: gcr.io/google_containers/pause:0.8.0
    resources:
      requests:
        cpu: 100m
        memory: 100Mi

将cpu和内存值设置为你想要保留的资源量,将文件放置在manifest目录中(--config=DIR flag of kubelet)。在要预留资源的每个kubelet上执行此操作。

API 对象

Node是Kubernetes REST API中的最高级别资源。有关API对象的更多详细信息,请参考:Node API对象

K8S中文社区微信公众号

在Azure上运行Kubernetes

Azure Container Service

Azure Container Service 支持开源容器编排工具有:DC/OS,Swarm,和Kubernetes。

关于使用Azure Container Service在Azure上部署Kubernetes集群示例:

Microsoft Azure Container Service - Kubernetes Walkthrough

Custom Deployments: ACS-Engine

Azure Container Service的核心是开源的,在GitHub上供社区使用和贡献的是:ACS-Engine

如果基于 Azure Container Service 自定义部署,那么acs-engine是一个不错的选择。这些自定义会部署到现有虚拟网络中,利用多个代理池,等等。

ACS-Engine的输入类似于使用Azure Container Service直接部署群集的ARM模板语法,输出生成的是一个Azure Resource Manager Template,然后通过迁入到源代码控制在Azure中部署Kubernetes集群。

CoreOS Tectonic for Azure

用于Azure的CoreOS Tectonic Installer是开源的,在GitHub供社区使用和贡献是:Tectonic Installer

当需要在 Hashicorp’s Terraform Azure Resource Manager (ARM)上自定义(customizations)集群时,Tectonic Installer是一个不错的选择,这使用户可以使用集成熟悉的Terraform工具或自定义(customize )。

参考“ Tectonic Installer for Azure Guide”

K8S中文社区微信公众号

在AWS EC2上运行Kubernetes

工具

kubernetes 1.6不再支持kube-up

kube-up.sh是启动集群的传统工具,已被弃用,完全从kubernetes 1.6中删除。

需要的条件

  1. 这仅适用于kubernetes 1.5及更早版本。考虑切换到支持的选项之一。
  2. 需要一个AWS帐户。可以访问http://aws.amazon.com创建使用
  3. 安装和配置AWS Command Line Interface
  4. 建议使用具有访问全部AWS API的帐户进行安装。

注意:此脚本默认使用“default”AWS配置文件,你可以使用AWS_DEFAULT_PROFILE环境变量显式设置AWS配置文件:

export AWS_DEFAULT_PROFILE=myawsprofile

开启群集

支持的程序: get-kube

#Using wget
export KUBERNETES_PROVIDER=aws; wget -q -O - https://get.k8s.io | bash
#Using cURL
export KUBERNETES_PROVIDER=aws; curl -sS https://get.k8s.io | bash

注:这个脚本调用cluster/kube-up.sh,它使用 cluster/aws/config-default.sh.来调用cluster/aws/util.sh

这个过程大约需要5到10分钟。一旦集群启动,您的主节点和节点(s)的IP地址将被打印,以及关于在集群中运行的缺省服务的信息(监视、日志、dns)。User credentials和security tokens是在 ~/.kube/config中编写的,它将需要使用CLI或HTTP Basic Auth。

默认情况下,该脚本将us-west-2a(Oregon)中提供一个新的VPC和一个4个node 的k8s集群,并在Debian上运行EC2实例。你可以覆盖config-default.sh中定义的变量,改变这种行为的方式如下:

export KUBE_AWS_ZONE=eu-west-1c
export NUM_NODES=2
export MASTER_SIZE=m3.medium
export NODE_SIZE=m3.medium
export AWS_S3_REGION=eu-west-1
export AWS_S3_BUCKET=mycompany-kubernetes-artifacts
export KUBE_AWS_INSTANCE_PREFIX=k8s
...

如果没有指定master和minion的sizes,脚本将尝试根据${NUM_NODES}来猜测master和工作节点的sizes。在1.3版本中,这些默认值是:

  • 对于master及小于5个nodes 的集群,它将使用一个 m3.medium,对于6-10个nodes,它将使用一个m3.large; 对于11-100个nodes,它将使用m3.xlarge。
  • 对于工作节点,小于50个节点的集群,它将使用一个t2.micro,对于50到150个节点之间的集群,它将使用一个t2.small,具有大于150个节点的集群,它将使用a t2.medium。

警告:要注意的是,t2实例每小时接收的CPU credits 是有限的,可能不适用于始终运行的CPU的集群。作为一个粗略的估计,考虑15 pods/node,通过一个t2.large实例(instances)可以处理,

在Kubernetes的早期版本中,我们将master 节点默认为一个t2类实例,但是发现当master节点耗尽内存或CPU时,这可能会出现一些奇葩的问题。如果集群用于测试,你可以指定export MASTER_SIZE=t2.micro。

对于生产中使用,我们建议export MASTER_SIZE=m3.medium和 export NODE_SIZE=m3.medium。如果使用的节点增加,请注意,一个m3.large实例具有比两个m3.medium实例更多的存储空间,价格却变化不大。

我们通常建议在m4实例上使用m3实例,因为m3实例包括本地实例存储。从历史上来看,本地实例存储比AWS更加可靠,性能应该更加稳定。

如果使用m4实例,或其他没有本地实例存储的实例类型,则可能需要增加该NODE_ROOT_DISK_SIZE值,尽管默认值为32可能足以满足m4系列中较小的实例类型。

该脚本还将尝试创建或重新使用“kubernetes”的keypair ,以及IAM配置文件名为“kubernetes-master”和“kubernet-minion”。

注意:如果使named 为“kubernetes”的现有keypair ,则必须将AWS_SSH_KEY key 设置为private key。

开始使用

命令行管理工具:kubectl

kubectl启动集群后会在工作站中留下一个Kubernetes directory,另外,可以从此页面下载最新的Kubernetes版本。

接下来,将二进制文件夹添加PATH中来访问kubectl:

# OS X
export PATH=<path/to/kubernetes-directory>/platforms/darwin/amd64:$PATH

# Linux
export PATH=<path/to/kubernetes-directory>/platforms/linux/amd64:$PATH

了解kubectl更多信息,参考:kubectl手册

在默认情况下,kubectl将使用在集群启动期间生成的kubeconfig文件,用于对API进行身份验证。要了解更多信息,请参考: kubeconfig files

示例

一个简单的nginx示例来开启你的集群之路。

“Guestbook”应用程序是你的集群之路另一个Kubernetes示例: guestbook example

有关更完整的应用程序,请查看 examples directory

扩展集群

不支持通过kubectl添加和删除节点。但仍然可以通过在安装过程中创建的自动扩展组的“Desired’ 和 ‘Max”属性来手动调整节点数量。

卸载集群

cluster/kube-down.sh

Support Level

IaaS Provider Config. Mgmt OS Networking Docs Conforms Support Level
AWS kops Debian k8s (VPC) docs Community (@justinsb)
AWS CoreOS CoreOS flannel docs Community

更多信息,请参考Table of solutions

继续学习

有关管理和使用Kubernetes集群的更多详细信息,请参阅Kubernetes文档

K8S中文社区微信公众号

在Google Compute Engine上运行Kubernetes

下面的例子用了4个node 节点的虚拟机和1个master 节点的虚拟机来(即集群中共有5个虚拟机)创建了一个Kubernetes集群。

说明

如果您想要简化入门体验和使用GUI来管理群集,可以考虑使用Google Container Engine (GKE)进行安装和管理和托管群集。如果要使用自定义二进制文件或纯原生的Kubernetes,请继续执行以下说明。

准备条件

  1. 需要Google Cloud Platform帐户,有关详细信息,请访问Google Developers Console
  2. 安装gcloud,gcloud可以作为Google Cloud SDK的一部分进行安装。
  3. 在 Google Cloud developers console中启用 Compute Engine Instance Group Manager API
  4. 确保在gcloud正确设置,可以使用gcloud config list project方法进行检查,通过gcloud config set project <project-id>方法来更改。
  5. 通过gcloud auth login,确保拥有Gcloud。
  6. (可选)为了对GCE进行API调用,还必须运行gcloud auth application-default login。
  7. 确保你可以用命令行启动GCE VM。
  8. 确保你可以使用ssh方式进入虚拟机。

启动群集

使用以下任一命令来安装客户端并启动集群:

curl -sS https://get.k8s.io | bash

wget -q -O - https://get.k8s.io | bash

安装完成后,将拥有一个Master节点主VM和4个Node节点的工作VM,作为Kubernetes集群来运行。

默认情况下,一些容器已经运行在集群上。如容器kibana和elasticsearch提供日志记录,而heapster提供监控服务。

上面提到的命令运行脚本创建的“kubernetes”集群。它定义了一个特定的集群配置,所以只能运行一次。

或者,可以从此页面下载并安装最新的Kubernetes版本,然后运行<kubernetes>/cluster/kube-up.sh脚本启动群集:

cd kubernetes
cluster/kube-up.sh

如果要在项目中运行多个集群,要使用不同的Name,或者想要不同数量的工作节点,请在启动集群之前参见 /cluster/gce/config-default.sh文件进行更详细配置。

如果遇到问题,请参考有关 troubleshooting的部分,发布到  kubernetes-users group,或者在 Slack上询问问题。

接下来的几个步骤将告诉你:

  1. 如何在工作站上安装命令管理工具来管理集群
  2. 如何使用集群的一些示例
  3. 如何删除集群
  4. 如何启动具有非默认选项的群集(更大的集群)

工作站上安装Kubernetes命令管理工具

集群启动脚本将为你提供一个运行中的集群和kubernetes 目录。

使用kubectl工具来控制Kubernetes集群管理器。它可以检查集群资源,创建,删除和更新组件等等。你将会用它来查看新集群并生成示例应用程序。

使用gcloud在你的工作站上安装kubectl命令管理工具:

 gcloud components install kubectl

注意:gcloud所捆绑的kubectl版本可能会比通过get.k8s.io安装脚本下载的版本旧。请参考kubectl安装 文档,了解如果在工作站上安装最新的kubectl。

开始使用集群

检查群集

在kubectl中使用以下命令来查看你的群集。

$ kubectl get --all-namespaces services

显示的services

NAMESPACE     NAME                  CLUSTER_IP       EXTERNAL_IP       PORT(S)        AGE
default       kubernetes            10.0.0.1         <none>            443/TCP        1d
kube-system   kube-dns              10.0.0.2         <none>            53/TCP,53/UDP  1d
kube-system   kube-ui               10.0.0.3         <none>            80/TCP         1d
...

通过以下命令查看在集群启动时创建的一组pod

$ kubectl get --all-namespaces pods

查看pod列表:

NAMESPACE     NAME                                           READY     STATUS    RESTARTS   AGE
kube-system   fluentd-cloud-logging-kubernetes-minion-63uo   1/1       Running   0          14m
kube-system   fluentd-cloud-logging-kubernetes-minion-c1n9   1/1       Running   0          14m
kube-system   fluentd-cloud-logging-kubernetes-minion-c4og   1/1       Running   0          14m
kube-system   fluentd-cloud-logging-kubernetes-minion-ngua   1/1       Running   0          14m
kube-system   kube-dns-v5-7ztia                              3/3       Running   0          15m
kube-system   kube-ui-v1-curt1                               1/1       Running   0          15m
kube-system   monitoring-heapster-v5-ex4u3                   1/1       Running   1          15m
kube-system   monitoring-influx-grafana-v1-piled             2/2       Running   0          15m

有些pod可能需要一定时间才能启动(在此期间他们会显示Pending)。

运行例子

然后,通过一个简单的nginx示例来尝试你的新集群。

有关更完整的应用示例,请查看 examples directory。该guestbook example是一个很好的“入门”例子。

卸载集群

使用kube-down.sh脚本来remove/delete/teardown集群。

cd kubernetes
cluster/kube-down.sh

同样的,kube-up.sh在同一个目录下将会备份。您不需要重新运行curl或wget命令:设置Kubernetes集群所需的一切现在都在您的工作站上。

定制

上述脚本依赖于Google Storage来推出Kubernetes版本。然后启动(默认情况下)单个主虚拟机以及4个工作虚拟机,你可以通过编辑kubernetes/cluster/gce/config-default.sh调整其中一些参数,可以在此处查看成功创建集群的脚本 。

故障排除

项目设置

需要启用Google Cloud Storage API,并启用Google Cloud Storage JSON API。新项目默认是激活的。如果未启动,可以在Google Cloud Console中完成。有关详细信息,请参阅Google Cloud Storage JSON API Overview

还要确保已启用Compute Engine Instance Group Manager API,并从命令行启动GCE VM,如GCE Quickstart说明那样。

群集初始化挂起

如果Kubernetes启动脚本挂起等待API可用,则可以通过SSH对Master和Node上的VM进行故障诊断,查看诸如/var/log/startupscript.log这样的日志。

一旦你解决了这些问题,当再次运行kube-up.sh前 ,应该在集群创建后运行kube-down.sh来做一下清理。

SSH

如果无法通过SSH连接到实例,请确保GCE防火墙没有屏蔽VM的22端口。默认情况是可以正常连接实例,但是如果编辑了防火墙规则或创建了一个新的非默认网络,则需要暴露它:

gcloud compute firewall-rules create default-ssh --network=<network-name> --description "SSH allowed from anywhere" --allow tcp:22

此外,你的GCE SSH key 必须没有密码,或者需要使用ssh-agent。

Networking

这些实例必须能用私有IP进行通信。该脚本使用“默认”网络,该网络应该有一个名为“default-allow-internal”的防火墙规则,允许私有IP上的任何端口上的流量。如果默认网络中缺少此规则,或者如果更改cluster/config-default.sh正在使用的网络,则需要创建下字段值的新规则:

  • Source Ranges: 10.0.0.0/8
  • Allowed Protocols and Port: tcp:1-65535;udp:1-65535;icmp

Support Level

aaS Provider Config. Mgmt OS Networking Docs Conforms Support Level
GCE Saltstack Debian GCE docs Project

有关所有解决方案的support level信息,请参考Table of solutions

继续学习

有关管理和使用Kubernetes集群的更多详细信息,请参阅Kubernetes文档

K8S中文社区微信公众号

Kubernetes Annotations

可以使用Kubernetes Annotations将任何非标识metadata附加到对象。客户端(如工具和库)可以检索此metadata。

将metadata附加到对象

可以使用Labels或Annotations将元数据附加到Kubernetes对象。标签可用于选择对象并查找满足某些条件的对象集合。相比之下,Annotations不用于标识和选择对象。Annotations中的元数据可以是small 或large,structured 或unstructured,并且可以包括标签不允许使用的字符。

Annotations就如标签一样,也是由key/value组成:

"annotations": {
  "key1" : "value1",
  "key2" : "value2"
}

以下是在Annotations中记录信息的一些例子:

  • 构建、发布的镜像信息,如时间戳,发行ID,git分支,PR编号,镜像hashes和注Registry地址。
  • 一些日志记录、监视、分析或audit repositories。
  • 一些工具信息:例如,名称、版本和构建信息。
  • 用户或工具/系统来源信息,例如来自其他生态系统组件对象的URL。
  • 负责人电话/座机,或一些信息目录。

注意:Annotations不会被Kubernetes直接使用,其主要目的是方便用户阅读查找。

下一步是什么

了解有关标签和选择器的更多信息。

K8S中文社区微信公众号