如何在部署中使用相同的标签?
How to use same labels in a deployment?
我正在尝试将相同的标签传递给部署,两个部署都有不同的图像和环境变量。我使用相同的标签,因此我可以将指标分组在一起。
但是部署失败。有人可以指点我一个解决方法还是因为我使用的 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"}
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 使用标签来控制 Deployment 的副本,因此我建议为 Deployment 添加第二个标签。这将使选择器独一无二,但您仍然可以通过其标签之一查询实体。
.spec.selector
是必填字段,用于指定此部署所针对的 Pods 的标签选择器。
.spec.selector
必须匹配 .spec.template.metadata.labels
,否则会被 API 拒绝。
在 API 版本 apps/v1
中,.spec.selector
和 .metadata.labels
如果未设置则不会默认为 .spec.template.metadata.labels
。因此必须明确设置它们。另请注意,.spec.selector
在 apps/v1
中创建 Deployment 后是不可变的
您不应该创建其他 Pods 其标签与此选择器匹配,无论是直接创建另一个 Deployment,还是创建另一个控制器,例如 ReplicaSet 或 ReplicationController。如果这样做,第一个 Deployment 会认为它创建了这些其他 Pods。 Kubernetes 不会阻止你这样做
我正在尝试将相同的标签传递给部署,两个部署都有不同的图像和环境变量。我使用相同的标签,因此我可以将指标分组在一起。
但是部署失败。有人可以指点我一个解决方法还是因为我使用的 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"}
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 使用标签来控制 Deployment 的副本,因此我建议为 Deployment 添加第二个标签。这将使选择器独一无二,但您仍然可以通过其标签之一查询实体。
.spec.selector
是必填字段,用于指定此部署所针对的 Pods 的标签选择器。
.spec.selector
必须匹配 .spec.template.metadata.labels
,否则会被 API 拒绝。
在 API 版本 apps/v1
中,.spec.selector
和 .metadata.labels
如果未设置则不会默认为 .spec.template.metadata.labels
。因此必须明确设置它们。另请注意,.spec.selector
在 apps/v1
您不应该创建其他 Pods 其标签与此选择器匹配,无论是直接创建另一个 Deployment,还是创建另一个控制器,例如 ReplicaSet 或 ReplicationController。如果这样做,第一个 Deployment 会认为它创建了这些其他 Pods。 Kubernetes 不会阻止你这样做