我正在尝试将相同的标签传递给部署,这两个部署都具有不同的映像和环境变量。我使用的是同一标签,因此我可以将指标分组在一起。
但是部署失败。有人可以指出一个解决方法,还是因为我使用的是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
答案 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不会阻止您这样做