如何在部署中使用相同的标签?

时间:2020-04-13 13:30:13

标签: kubernetes amazon-eks aws-eks

我正在尝试将相同的标签传递给部署,这两个部署都具有不同的映像和环境变量。我使用的是同一标签,因此我可以将指标分组在一起。

但是部署失败。有人可以指出一个解决方法,还是因为我使用的是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”}:{{ 1}}与模板selector

不匹配

kubectl版本:

labels

2 个答案:

答案 0 :(得分:2)

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

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使用标签来控制部署的副本,因此建议您在部署中添加第二个标签。这样可以使选择器唯一,但是您仍然可以通过其标签之一查询该实体。

答案 1 :(得分:1)

.spec.selector是必填字段,用于为此部署目标的Pod指定标签选择器。 .spec.selector必须与.spec.template.metadata.labels匹配,否则它将被API拒绝。 如果未设置API版本apps/v1.spec.selector.metadata.labels,则默认不设置为.spec.template.metadata.labels。因此,必须明确设置它们。另请注意,在.spec.selector

中创建部署后,apps/v1是不可变的

您不应直接通过创建另一个Deployment或创建另一个控制器(例如ReplicaSet或ReplicationController)来创建其标签与该选择器匹配的其他Pod。如果这样做,则第一个Deployment会认为它创建了其他Pod。 Kubernetes不会阻止您这样做