首页 > 解决方案 > 让序数索引为 0 的 Kuberentes StatefulSet Pod 停止服务?

问题描述

我正在将应用程序作为带有 2 个 Pod 的 StatefulSet 运行。我最近发现了一个问题,需要清除磁盘上的一些内容并重新启动应用程序。

我想通过至少运行一个 Pod 来最大程度地减少对客户的影响。

这是相当微不足道的,pod-1因为我可以缩小它并做必要的事情并扩大它的备份。pod-1但是,如果没有运行, StatefulSets 将不会运行,pod-0因此我不能直接pod-0退出服务。

我知道也许有一种方法可以重新标记 Pod 以pod-0退出服务。不幸的是,这不是一个选择,因为它会启动一个新的pod-0(据我所知)。

是否有方法通过服务公开选择的 Pod 或将其从服务端点中删除并重新添加?

示例规范文件

spec:
  podManagementPolicy: OrderedReady
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: myapp
  serviceName: myapp-headless
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: myapp
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: app
                operator: NotIn
                values:
                - confluence
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - myapp
            topologyKey: kubernetes.io/hostname
      containers:
      - env:
        - name: JVM_MINIMUM_MEMORY
          value: 4g
        - name: JVM_MAXIMUM_MEMORY
          value: 4g
        - name: CATALINA_CONNECTOR_PROXYNAME
          value: myapp.dev.example.com
        - name: CATALINA_CONNECTOR_PROXYPORT
          value: "443"
        - name: CATALINA_CONNECTOR_SCHEME
          value: https
        - name: CATALINA_CONNECTOR_SECURE
          value: "true"
        - name: CLUSTER
          value: "true"
        - name: CLUSTER_DOMAIN
          value: myapp-headless.proteus.svc.cluster.local
        - name: CROWD_SSO
          value: "false"
        - name: CROWD_APP_NAME
          value: myapp
        - name: CROWD_APP_PASSWORD
          value: xxx
        - name: CROWD_BASEURL
          value: https://crowd.dev.example.com
        image: xxx
        imagePullPolicy: IfNotPresent
        name: myapp
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP
        - containerPort: 40001
          name: ehcache
          protocol: TCP
        resources:
          limits:
            memory: 8Gi
          requests:
            memory: 4Gi
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/vendor/application-data/myapp-home
          name: home
        - mountPath: /var/vendor/application-data/myapp-home/shared
          name: shared
        - mountPath: /var/vendor/application-data/myapp-home/dbconfig.xml
          name: myapp-db-config
          subPath: dbconfig.xml
        - mountPath: /opt/vendor/myapp/logs
          name: tomcat-logs
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: ecr
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 2
        runAsUser: 2
      terminationGracePeriodSeconds: 30
      volumes:
      - configMap:
          defaultMode: 420
          name: myapp-dbconfig-cm
        name: myapp-db-config
      - name: shared
        persistentVolumeClaim:
          claimName: myapp-shared
      - emptyDir: {}
        name: tomcat-logs
  updateStrategy:
    type: OnDelete
  volumeClaimTemplates:
  - metadata:
      creationTimestamp: null
      name: home
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: myapp-home-volume

标签: kubernetesload-balancing

解决方案


推荐阅读