【Kubernets】kubernets进阶-注解(annotation)的使用

概述

Kubernetes注解(Annotations)是一种将非标识性元数据附加到Kubernetes对象的方法。这些对象可以是Pods、Deployments、Services等。注解与标签(Labels)不同,它们不用于识别和选择对象,而是存储额外的信息,这些信息对于工具和库来说是可检索的。

注解的功能:

  1. 存储额外信息:注解可以用来存储关于Kubernetes资源的额外信息,例如构建信息、文档链接、维护者联系信息等 。
  2. 自动化和策略传递:注解可以标记资源以用于未来的自动化任务,例如调度、升级、配置管理等 。
  3. 集成外部系统:注解可以用于集成Kubernetes与外部系统,如监控工具、CI/CD管道等 。
  4. 工作流自动化:注解可以触发自定义动作或配置特定行为,如备份、迁移过程或资源预热 。

注解的使用场景:

  1. 部署跟踪:注解可以用来跟踪Kubernetes资源的部署历史,例如存储应用的版本信息 。
  2. 自动化扩展:注解可以用于触发资源的自动扩展,如根据自定义指标配置水平Pod自动伸缩(HPA)。
  3. 文档链接:注解可以链接到相关文档,如设计提案、运行手册、警报和仪表板 。
  4. 所有权和联系人信息:注解可以记录资源的所有者、联系人和升级信息等 。

注解的语法和特点:

  • 注解以键/值对的形式存在,键可以有一个可选的前缀和一个名称,值是字符串。
  • 注解的键可以包含字母数字字符、破折号、下划线、点等,且没有长度限制。
  • 注解的值可以是任意字符串,没有类型限制。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  annotations:
    "key1": "value1"
    "key2": "value2"
spec:
  containers:
  - name: example-container
    image: example-image

在这个示例中,key1key2是注解的键,value1value2是对应的值。

使用注解的最佳实践:

  • 保持注解的数量有限,通常每个资源对象不超过10个注解。
  • 拥有注解的团队应该负责清理不再适用的注解,而不是让过时的注解积累。
  • 投资于能够查询和报告注解的工具,这可以提供强大的仪表板和洞察力。
  • 谨慎使用注解,它们应该补充而不是完全取代其他记录系统的概念,如标签和状态字段 。

注解在Ingress当中的使用

常见注解列表

以下是Kubernetes Ingress支持的一些常用注解,以及它们的用途说明:

注解名称用途
kubernetes.io/ingress.class指定应该使用哪个Ingress控制器来处理此Ingress资源。例如,如果你的集群中有多个Ingress控制器(如Nginx和Traefik),你可以使用这个注解来指定使用哪一个。
nginx.ingress.kubernetes.io/rewrite-target对于Nginx Ingress控制器,此注解用于重写URL的路径部分。例如,如果你希望将所有到达 /app 路径的请求重定向到 /,你可以使用这个注解。
nginx.ingress.kubernetes.io/ssl-redirect指示Nginx Ingress控制器将所有HTTP请求重定向到HTTPS。通常用于强制HTTPS。
nginx.ingress.kubernetes.io/force-ssl-redirect类似于 ssl-redirect,但更为严格。它会强制将所有HTTP请求重定向到HTTPS,并拒绝任何非HTTPS的请求。
nginx.ingress.kubernetes.io/affinity设置客户端IP的会话保持策略,以确保来自同一客户端的请求被路由到同一个后端Pod。
nginx.ingress.kubernetes.io/configuration-snippet允许你在Nginx的配置文件中插入自定义的片段。这可以用于实现Nginx的某些高级功能,这些功能不能通过标准的Ingress资源字段或注解来实现。
traefik.ingress.kubernetes.io/router.entrypoints对于Traefik Ingress控制器,此注解用于指定入口点(即监听的网络地址和端口)。
traefik.ingress.kubernetes.io/router.middlewares允许你在Traefik Ingress上附加中间件,以处理诸如重定向、重写、认证等任务。
cert-manager.io/cluster-issuer当使用cert-manager来自动管理TLS证书时,此注解指定了应该使用哪个ClusterIssuer来签发证书。
haproxy.org/ingress.class对于HAProxy Ingress控制器,类似于 kubernetes.io/ingress.class,用于指定Ingress类。
haproxy.org/path-rewrite在HAProxy Ingress控制器中,用于重写请求的路径。

这些注解的具体可用性和行为可能因Ingress控制器的版本和配置而异。在使用之前,建议查阅相应Ingress控制器的官方文档以获取最准确的信息。此外,随着Kubernetes和Ingress控制器生态系统的不断发展,新的annotations可能会不断被引入。

举例说明

当然,这里有一个使用Nginx Ingress控制器的Kubernetes Ingress资源的例子,其中使用了多个注解来配置不同的功能:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    # 指定默认的后端服务,当请求不匹配任何规则时
    nginx.ingress.kubernetes.io/default-backend: "default-http-backend:80"
    
    # 开启CORS支持,并设置允许的源
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
    
    # 重写目标URL
    nginx.ingress.kubernetes.io/rewrite-target: /$1

    # 设置请求头Host的值
    nginx.ingress.kubernetes.io/upstream-vhost: "example.com"

    # 启用基于cookie的会话亲和性
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "INGRESSCOOKIE"
    nginx.ingress.kubernetes.io/session-cookie-path: "/"

    # IP白名单,只允许特定IP范围的访问
    nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/16,10.0.0.0/8"
    
    # 为特定的路径设置重定向
    nginx.ingress.kubernetes.io/permanent-redirect: "https://www.example.com/newpath"
    nginx.ingress.kubernetes.io/permanent-redirect-code: "301"

spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /path/to/rewrite(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80
      - path: /path/to/redirect
        pathType: Exact
        backend:
          service:
            name: my-service
            port:
              number: 80

在这个例子中,我们定义了一个名为example-ingress的Ingress资源,并使用了一系列注解来配置不同的功能:

  1. nginx.ingress.kubernetes.io/default-backend注解指定了默认后端服务,用于处理不匹配任何规则的请求。

  2. nginx.ingress.kubernetes.io/enable-corsnginx.ingress.kubernetes.io/cors-allow-origin注解开启了CORS支持,并设置了允许的源为所有域(*)。

  3. nginx.ingress.kubernetes.io/rewrite-target注解用于重写URL路径。

  4. nginx.ingress.kubernetes.io/upstream-vhost注解设置了请求头Host的值。

  5. nginx.ingress.kubernetes.io/affinitynginx.ingress.kubernetes.io/session-cookie-namenginx.ingress.kubernetes.io/session-cookie-path注解启用了基于cookie的会话亲和性。

  6. nginx.ingress.kubernetes.io/whitelist-source-range注解设置了IP白名单,只允许特定IP范围的访问。

  7. nginx.ingress.kubernetes.io/permanent-redirectnginx.ingress.kubernetes.io/permanent-redirect-code注解为特定的路径设置了301永久重定向。

请注意,这些注解的具体行为可能因Ingress控制器的不同而有所差异,因此在使用前应查阅相应Ingress控制器的官方文档。此外,注解的使用也可能受到Kubernetes集群配置的影响。

🛠️ 在Kubernetes中,注解和标签有什么区别?

在Kubernetes中,注解(Annotations)和标签(Labels)都是以键/值对的形式附加到Kubernetes资源对象上(如Pods、Services、Deployments等)的元数据。尽管它们的格式相似,但它们的用途和特点有所不同:

标签(Labels):

  • 目的:标签主要用于识别和选择资源。它们用于分组和选择资源的子集,例如,使用标签可以选择一组具有特定角色或功能的Pod。
  • 限制:标签的键和值都有长度限制(63个字符以内),并且必须符合DNS子域名的标准(字母数字字符,以及破折号-)。
  • 查询:标签支持使用Kubernetes API和CLI工具(如kubectl)进行查询和观察,这使得它们非常适合在UI和CLI中使用。
  • 用途:标签通常用于逻辑分组、服务发现、路由和负载分配等场景。

注解(Annotations):

  • 目的:注解用于存储非标识性的元数据,例如构建信息、文档链接、维护者联系信息等。它们不用于选择或筛选资源。
  • 灵活性:注解的键和值没有长度限制,可以包含更丰富的字符集,包括破折号、下划线、点等。
  • 查询:虽然注解可以通过Kubernetes API检索,但它们不支持像标签那样的查询语法。
  • 用途:注解通常用于存储额外的信息,这些信息对于开发人员、运维人员或自动化工具是有用的,但不用于资源的选择或分组。

主要区别:

  1. 标识性:标签用于标识和选择资源,而注解用于存储额外的、非标识性的信息。
  2. 查询能力:标签支持查询和观察,注解不支持这种查询方式。
  3. 字符限制:标签的键和值有严格的字符和长度限制,注解则没有这些限制。
  4. 使用场景:标签常用于逻辑分组和选择资源,注解用于存储辅助信息,如构建数据、文档链接、维护者信息等。

在实际应用中,你可以根据资源的需要选择合适的标签或注解来组织和管理你的Kubernetes资源。通常,标签用于资源的逻辑分组和选择,而注解用于附加额外的、不用于选择的元数据。

相关文献

【Kubernets】kubernets资源类型ingress详细介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问道飞鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值