设置 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=admin
和 password=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
如 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=admin
和 password=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