kubernetes $(POD_NAME)位于状态集+自定义的子路径中,未扩展

ct2axkht  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(2)|浏览(149)

我有一个有状态集,其中的卷使用子路径:$(POD_NAME)我也试过$HOSTNAME,但也不起作用。如何将volumeMount的子路径设置为Pod的名称或$HOSTNAME?
这是我的资料:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ravendb
  namespace: pltfrmd
  labels:
    app: ravendb
spec:
  serviceName: ravendb
  template:
    metadata:
      labels:
        app: ravendb
    spec:
      containers:
        - command:
            # ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
            - /bin/sh
            - -c
            - /opt/RavenDB/Server/Raven.Server --log-to-console  --config-path /configuration/settings.json
          image: ravendb/ravendb:latest
          imagePullPolicy: Always
          name: ravendb
          env:
            - name: POD_HOST_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: RAVEN_Logs_Mode
              value: Information
          ports:
            - containerPort: 8080
              name: http-api
              protocol: TCP
            - containerPort: 38888
              name: tcp-server
              protocol: TCP
            - containerPort: 161
              name: snmp
              protocol: TCP
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /data
              name: data
              subPath: $(POD_NAME)
            - mountPath: /configuration
              name: configuration
              subPath: ravendb
            - mountPath: /certificates
              name: certificates
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 120
      volumes:
        - name: certificates
          secret:
            secretName: ravendb-certificate
        - name: configuration
          persistentVolumeClaim:
            claimName: configuration
        - name: data
          persistentVolumeClaim:
            claimName: ravendb

以及永久卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: pltfrmd
  name: ravendb
  labels:
    type: local
spec:
  storageClassName: local-storage
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /volumes/ravendb
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  namespace: pltfrmd
  name: ravendb
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

$HOSTNAME曾经可以使用,但由于某种原因不再可以使用。是否是主机路径存储提供程序中的错误?

6fe3ivhb

6fe3ivhb1#

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx
          mountPath: /usr/share/nginx/html
          subPath: $(POD_NAME)
      volumes:
      - name: nginx
        configMap:
          name: nginx
3lxsmp7m

3lxsmp7m2#

好吧,经过大量的试验,我找到了一个仍然有效的方法:
第一步,Map一个环境变量:

env:
    - name: POD_HOST_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name

这将根据字段www.example.com创建$(POD_HOST_NAMEmetadata.name
然后在你的坐骑上你这样做:

volumeMounts:
    - mountPath: /data
      name: data
      subPathExpr: $(POD_HOST_NAME)

使用subPathExpr是很重要的,因为subPath(以前的方法)不起作用。然后它将使用您创建的环境变量并正确地展开它。

相关问题