Будет ли работать StorageClass kubernetes.io/no-provisioner для многоузлового кластера? - PullRequest
0 голосов
/ 12 июня 2018

Кластер: 1 мастер 2 рабочих

Я внедряю StatefulSet с использованием локального тома, используя PV (kubernetes.io/no-provisioner storageClass) с 3 репликами.Создано 2 PV для обоих рабочих узлов.

Ожидание: модули будут запланированы на обоих рабочих и совместно использовать один и тот же том.

результат: на одном рабочем узле создано 3 модуля с сохранением состояния.yaml: -

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: example-local-claim
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv-1
spec:
  capacity:
    storage: 2Gi
  # volumeMode field requires BlockVolume Alpha feature gate to be enabled.
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/vol1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-node1 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-pv-2
spec:
  capacity:
    storage: 2Gi
  # volumeMode field requires BlockVolume Alpha feature gate to be enabled.
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/vol2
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-node2

---
# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
  name: test
  labels:
    app: test
spec:
  ports:
  - name: test-headless
    port: 8000
  clusterIP: None
  selector:
    app: test
---
apiVersion: v1
kind: Service
metadata:
  name: test-service
  labels:
    app: test
spec:
  ports:
  - name: test
    port: 8000
    protocol: TCP
    nodePort: 30063
  type: NodePort
  selector:
    app: test

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: test-stateful
spec:
  selector:
    matchLabels:
      app: test
  serviceName: stateful-service
  replicas: 6
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: container-1
        image: <Image-name>
        imagePullPolicy: Always
        ports:
        - name: http
          containerPort: 8000
        volumeMounts:
        - name: localvolume 
          mountPath: /tmp/
      volumes:
      - name: localvolume
        persistentVolumeClaim:
          claimName: example-local-claim

1 Ответ

0 голосов
/ 12 июня 2018

Это произошло потому, что Kubernetes не заботится о распространении.У этого есть механизм для обеспечения определенного распределения, названного Pod Affinity.Для раздачи капсул всем работникам вы можете использовать Pod Affinity .Кроме того, вы можете использовать мягкое сходство (различия, которые я объясняю здесь ), оно не является строгим и позволяет порождать все ваши стручки.Например, StatefulSet будет выглядеть следующим образом:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 3 
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - my-app
          topologyKey: kubernetes.io/hostname      
      terminationGracePeriodSeconds: 10
      containers:
      - name: app-name
        image: k8s.gcr.io/super-app:0.8
        ports:
        - containerPort: 21
          name: web

Этот StatefulSet будет пытаться порождать каждый модуль у нового работника;если рабочих не хватает, то будет запущен модуль в узле, где модуль уже существует.

...