首页 > 解决方案 > Kubernetes statefulset:除了'replicas'、'template'和'updateStrategy'是被禁止的

问题描述

注意:nfs 服务器和权限都很好,我已经检查了 PV 和 PVC 正在创建良好,只有 statefulSet 给了我这个错误。

错误消息:StatefulSet“auth-mongo-ss”无效:规范:禁止:禁止更新“副本”、“模板”和“更新策略”以外的字段的状态集规范(错误消息很简单,但没有帮助解决它!我在这里缺少什么?)

Kubernetes(minkube)版本:

客户端版本:v1.20.2 服务器版本:v1.20.2

操作系统:

Linux 薄荷 - 20

apiVersion: v1
kind: PersistentVolume
metadata:
  name: auth-pv
spec:
  capacity:
    storage: 250Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  nfs:
    path: /nfs/auth
    server: 192.168.10.104
---
apiVersion: v1
kind: Service
metadata:
  name: auth-mongo-serv
  labels:
    app: auth-mongo-serv
spec:
  ports:
    - name: db
      protocol: TCP
      port: 27017
      targetPort: 27017
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: auth-mongo-ss
spec:
  selector:
    matchLabels:
      app: auth-mongo-serv # has to match .spec.template.metadata.labels
  serviceName: auth-mongo-ss
  replicas: 1 # by default is 1
  template:
    metadata:
      labels:
        app: auth-mongo-serv # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: auth-mongo-docker
          image: mongo
          ports:
            - containerPort: 27017
          resources:
            limits:
              memory: "250Mi"
              cpu: "250m"
          volumeMounts:
            - name: auth-mongo-data
              mountPath: /data/db
  volumeClaimTemplates:
    - metadata:
        name: auth-mongo-data
      spec:
        storageClassName: manual
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 250Mi
    ```

标签: kubernetesminikube

解决方案


错误spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden说明了一切。

StatefultSet只有可变(您可以更改/更新)replicas是,templateupdateStrategy. 除了这些字段之外,Spec您不能在更新期间更改其他字段。

更新

您有多个问题:

  1. StatefuleSet你使用的规范中serviceName: auth-mongo-ss,你有这个无头服务吗?

  2. 在此服务规范中,您没有提供selector

apiVersion: v1
kind: Service
metadata:
  name: auth-mongo-serv
  labels:
    app: auth-mongo-serv
spec:
  ports:
    - name: db
      protocol: TCP
      port: 27017
      targetPort: 27017

下面给出了来自 k8s 文档的 StatefulSet 示例,对于 statefulset,您需要一个无头服务。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

推荐阅读