1. Experimento Spec.selector.matchLables
1.1 La forma correcta de escribir Deployment es hacer que el valor de spec.selector.matchLabels coincida exactamente con el valor de spec.template.metadata.lables para que no se informe ningún error.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: my-nginx
replicas: 2
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
Pod creado correctamente
# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-9b44d8f5-d6n8z 1/1 Running 0 3s
my-nginx-9b44d8f5-zzv52 1/1 Running 0 3s
1.2 Si no escribe el contenido del campo spec.selector.matchLabels, si lo crea directamente, se informará un error: falta el selector de campo necesario
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 2
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
# kubectl create -f test_pod_svc.yaml
error: error validating "test_pod_svc.yaml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false
1.3 Cuando el valor de la clave que coincide con spec.selector.matchLabels no se corresponde con el valor de la clave de spec.template.metadata.lables, se informará un error directamente: la etiqueta seleccionada y la plantilla no coinciden
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: my-nginx-add
replicas: 2
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx:1.14
ports:
- containerPort: 80
# kubectl create -f test_pod_svc.yaml
The Deployment "my-nginx" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{
"app":"my-nginx"}: `selector` does not match template `labels`
1.4 Ver el manual de ayuda
# kubectl explain Deployment.spec
selector <Object>
Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment.
pod的标签选择器。 由此选择其pod的现有ReplicaSet(副本集)将受此部署影响的副本。
2. Resumen
-
Spec.selector.matchLabels debe estar escrito en deployment.yaml
-
Al definir una plantilla de pod, debe definir spec.template.metadata.lables, porque spec.selector.matchLabels es un campo obligatorio y debe ser coherente con el valor clave de spec.template.metadata.lables.
-
El contenido definido en spec.template.metadata.lables se aplicará a todas las copias de pod definidas en spec.template.spec. Las etiquetas no se pueden definir en spec.template.spec.containers
3. Artículos de referencia
https://cloud.tencent.com/developer/article/1394657