2016-05-20 3 views
11

Mit Kubernetes 1.2.4, warum verursacht meine unter Deployment Definition (redis.yaml) den folgenden Fehler?Kubernetes - Warum kann das Selektorfeld nicht für die Bereitstellung validiert werden?

$ kubectl apply -f redis.yaml 
error validating "redis.yaml": error validating data: found invalid field name for v1beta1.LabelSelector; if you choose to ignore these errors, turn validation off with --validate=false 

redis.yaml:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

Antwort

10

Selector Richtlinien in Deployments require Sie ein Unterfeld entweder matchLabels oder matchExpressions, zu verwenden, so in meinem Fall muss ich den Einsatz von matchLabels machen:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    matchLabels: 
     name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 
11

Das selector Feld eines v1beta1.DeploymentSpec Objekt ist vom Typ v1beta1.LabelSelector und nicht nur eine einfache Karte. So können Sie entweder fügen Sie das Etikett unter dem matchLabels Feld des selector:

redis-mit-matchLabels.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
spec: 
    replicas: 3 
    selector: 
    matchLabels: 
     name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

Oder lassen Sie die LabelSelector aus dem DeploymentSpec, wobei in diesem Fall wird es passen die Etiketten von der PodSpec:

redis-podSpec-labels.yaml

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: redis 
    template: 
    metadata: 
     labels: 
     name: redis 
    spec: 
     containers: 
     - name: redis 
     image: kubernetes/redis:v1 
     ports: 
     - containerPort: 6379 
     resources: 
      limits: 
      cpu: "0.1" 
     volumeMounts: 
     - mountPath: /redis-master-data 
      name: data 
     volumes: 
     - name: data 
      emptyDir: {} 

Siehe Selector section der Deployment-Dokumentation.

+0

Könnten Sie bitte den Zweck von '.spec.selector' erläutern? Ich bin ein wenig verwirrt durch die Dokumentation, vor allem den Absatz "Wenn angegeben, .spec.selector" muss übereinstimmen .spec.template.metadata.labels "[...]. Wenn" .spec.selector "ist nicht angegeben , '.spec.selector.matchLabels' wird standardmäßig auf' .spec.template.metadata.labels' "gesetzt. Was ist der Zweck, '.spec.selector' zu haben, wenn es' .spec.selector.matchLabels' abgleichen muss, aber auch, wenn es nicht angegeben wird, wird es standardmäßig verwendet? –

+0

Ich wollte '.spec.template.metadata.labels' anstelle von' .spec.selector.matchLabels' in meinem letzten Satz sagen, sorry. –