首页 > 解决方案 > 如何在部署中使用相同的标签?

问题描述

我正在尝试将相同的标签传递给部署,两个部署都有不同的图像和环境变量。我使用相同的标签,所以我可以将指标组合在一起。

但部署失败。有人可以指点我一个解决方法还是因为我使用的api版本?

部署1:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: stg-postgres-exporter-pgauth
  namespace: prometheus-exporters
spec:
  replicas: 1
  template:
    metadata:
      labels:
        db: foo
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9187"
        prometheus.io/job_name: "postgres-exporter"
    spec:
      containers:
        - name: stg-rds-exporter
          image: wrouesnel/postgres_exporter:v0.8.0
          ....

部署2:

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: stg-rds-exporter-pgauth
  namespace: prometheus-exporters
spec:
  replicas: 1
  template:
    metadata:
      labels:
        db: foo
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9042"
        prometheus.io/job_name: "rds-exporter"
        prometheus.io/path: "/basic"
    spec:
      containers:
        - name: stg-rds-exporter-pgauth
          image: hbermu/rds_exporter:latest 
          ....

错误:

15:27:39 部署“stg-rds-exporter-pgauth”无效:spec.template.metadata.labels:无效值:map[string]string{"db":"foo"}:selector不匹配模板labels

kubectl 版本:

Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.1", GitCommit:"d647ddbd755faf07169599a625faf302ffc34458", GitTreeState:"clean", BuildDate:"2019-10-02T23:49:20Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.9-eks-502bfb", GitCommit:"502bfb383169b124d87848f89e17a04b9fc1f6f0", GitTreeState:"clean", BuildDate:"2020-02-07T01:31:02Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

标签: kubernetesamazon-eks

解决方案


Kubernetes 使用标签和选择器来控制部署的副本,请查看k8s 文档中的以下示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

您有选择器 matchLabels:

selector:
    matchLabels:
      app: nginx

和模板标签:

template:
    metadata:
      labels:
        app: nginx

它们必须匹配,这就是您的部署失败的原因。

Kubernetes 使用标签来控制部署的副本,因此我建议向部署中添加第二个标签。这将使选择器独一无二,但您仍然可以通过其标签之一查询实体。


推荐阅读