设置 postgres 环境变量 运行 图片

Setting postgres environmental variables running image

the documentation 所示,您应该在执行 docker run 时设置环境变量,如下所示:

docker run --name some-postgres -e POSTGRES_PASSWORD='foo' POSTGRES_USER='bar'

这将设置超级用户和密码来访问数据库,而不是 POSTGRES_PASSWORD=''POSTGRES_USER='postgres' 的默认值。

但是,我正在使用 Skaffold 来启动一个 k8s 集群,并且我正在尝试弄清楚如何做类似的事情。如何为 Kubernetes 和 Skaffold 做到这一点?

使用下面的 YAML

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres
  replicas: 1
  template:
    metadata:
      labels:
       name: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:11.2
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: "sampledb"
            - name: POSTGRES_USER
              value: "postgres"
            - name: POSTGRES_PASSWORD
              value: "secret"
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql
      volumes:
        - name: data
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
spec:
  type: ClusterIP
  ports:
    - port: 5432
  selector:
    name: postgres

@P Ekambaram 是正确的,但我想进一步探讨这个话题并解释 "whys and hows"。

在 Kubernetes 上传递密码时,强烈建议使用加密,您可以使用 secrets 来做到这一点。

创建自己的 Secret (Doc)

为了能够使用@P Ekambaram 所描述的秘密,您需要在您的 kubernetes 集群中有一个秘密。

要轻松创建secret,您还可以从generators创建一个Secret,然后应用它在Apiserver上创建对象。生成器应在目录内的 kustomization.yaml 中指定。

例如,要从文字 username=adminpassword=secret 生成一个 Secret,您可以将 kustomization.yaml 中的秘密生成器指定为

# Create a kustomization.yaml file with SecretGenerator
$ cat <<EOF >./kustomization.yaml
secretGenerator:
- name: db-user-pass
  literals:
  - username=admin
  - password=secret
EOF

应用kustomization目录创建Secret对象。

$ kubectl apply -k .
secret/db-user-pass-dddghtt9b5 created

使用机密作为环境变量 (Doc)

这是使用来自环境变量的秘密的 pod 示例:

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

来源:here and here.