2016-05-20 17 views
11

Sử dụng Kubernetes 1.2.4, tại sao định nghĩa dưới đây là Deployment (redis.yaml) gây ra lỗi sau?Kubernetes - Tại sao trường chọn không xác thực cho Triển khai?

$ 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: {} 

Trả lời

10

chỉ Selector trong Triển khai require bạn sử dụng một tiểu lĩnh vực của một trong hai matchLabels hoặc matchExpressions, vì vậy trong trường hợp của tôi, tôi cần phải tận dụng matchLabels:

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

Trường selector củaĐối tượngthuộc loại v1beta1.LabelSelector thay vì chỉ là một bản đồ đơn giản. Vì vậy, bạn có thể thêm các nhãn dưới matchLabels lĩnh vực selector:

redis-với-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: {} 

Hoặc rời khỏi LabelSelector ra khỏi DeploymentSpec, trong trường hợp này nó sẽ phù hợp với nhãn từ 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: {} 

Xem tài liệu triển khai Selector section.

+0

Bạn có thể giải thích chi tiết về mục đích của '.spec.selector' không? Tôi hơi bối rối bởi tài liệu, đặc biệt là đoạn "Nếu được chỉ định,' .spec.selector' phải khớp với '.spec.template.metadata.labels' [...]. Nếu' .spec.selector' không được chỉ định , '.spec.selector.matchLabels' sẽ được mặc định thành' .spec.template.metadata.labels' ". Mục đích của việc có '.spec.selector' nếu nó cần khớp' .spec.selector.matchLabels' nhưng cũng mặc định là gì nếu không được chỉ định? –

+0

Tôi muốn nói '.spec.template.metadata.labels' thay vì' .spec.selector.matchLabels' trong câu cuối cùng của tôi, xin lỗi. –

Các vấn đề liên quan