如何在 GKE 上创建 CloudSQL 代理凭据作为机密
How to create CloudSQL Proxy credentials as secrets on GKE
我已按照 https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine 中的步骤设置 MySQL 用户帐户和服务帐户。我已经下载了包含我的凭据的 JSON 文件。
我的问题是,在我从网站复制的代码中:
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
路径 /secrets/cloudsql/credentials.json 已指定,我不知道它来自哪里。
我想我应该通过
创建凭据作为秘密
kubectl create secret generic cloudsql-instance-credentials --from-file=k8s\secrets\my-credentials.json
但在那之后我不知道该怎么办。这个秘密如何成为路径/secrets/cloudsql/credentials.json
?
您必须像这样在规范下添加卷条目:
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 420
secretName: cloudsql-instance-credentials
注意:这属于部署规范而不是容器规范。
编辑: 可在此处找到更多信息:https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume 感谢 shalvah 指出这一点。
实际上我们可以将 configmaps 或 secrets 作为文件挂载到 pod 的容器运行时中。然后在运行时我们可以在任何需要的情况下使用它们。但要做到这一点,我们需要正确设置它们。
- 创建secret/configmap
- 在 pod 中为
.spec.volumes
中的秘密添加卷(如果您使用 deployment 部署 pod,则在 .spec.template.spec.volumes
中添加卷)
- 在
.spec.container[].volumemount
中安装创建的卷
有一个适用于您的用例的示例:
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 511
secretName: cloudsql-instance-credentials
目前的答案很好,但我想提供一个更完整的例子。这来自两年前的一些旧 google 文档(不再存在)。将 @@PROECT@@ 和 @@DBINST@@ 替换为您自己的值。
volumes
加载一个秘密,然后 volumeMounts
使其对位于 /secrets/cloudsql
的 postgres-proxy
容器可见
spec:
volumes:
- name: cloudsql-oauth-credentials
secret:
secretName: cloudsql-oauth-credentials
- name: cloudsql
emptyDir:
containers:
- name: postgres-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.09
imagePullPolicy: Always
command: ["/cloud_sql_proxy",
"--dir=/cloudsql",
"-instances=@@PROJECT@@:us-central1:@@DBINST@@=tcp:5432",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-oauth-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: cloudsql
mountPath: /cloudsql
我已按照 https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine 中的步骤设置 MySQL 用户帐户和服务帐户。我已经下载了包含我的凭据的 JSON 文件。
我的问题是,在我从网站复制的代码中:
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
路径 /secrets/cloudsql/credentials.json 已指定,我不知道它来自哪里。
我想我应该通过
创建凭据作为秘密kubectl create secret generic cloudsql-instance-credentials --from-file=k8s\secrets\my-credentials.json
但在那之后我不知道该怎么办。这个秘密如何成为路径/secrets/cloudsql/credentials.json
?
您必须像这样在规范下添加卷条目:
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 420
secretName: cloudsql-instance-credentials
注意:这属于部署规范而不是容器规范。
编辑: 可在此处找到更多信息:https://kubernetes.io/docs/tasks/inject-data-application/distribute-credentials-secure/#create-a-pod-that-has-access-to-the-secret-data-through-a-volume 感谢 shalvah 指出这一点。
实际上我们可以将 configmaps 或 secrets 作为文件挂载到 pod 的容器运行时中。然后在运行时我们可以在任何需要的情况下使用它们。但要做到这一点,我们需要正确设置它们。
- 创建secret/configmap
- 在 pod 中为
.spec.volumes
中的秘密添加卷(如果您使用 deployment 部署 pod,则在.spec.template.spec.volumes
中添加卷) - 在
.spec.container[].volumemount
中安装创建的卷
有一个适用于您的用例的示例:
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 511
secretName: cloudsql-instance-credentials
目前的答案很好,但我想提供一个更完整的例子。这来自两年前的一些旧 google 文档(不再存在)。将 @@PROECT@@ 和 @@DBINST@@ 替换为您自己的值。
volumes
加载一个秘密,然后 volumeMounts
使其对位于 /secrets/cloudsql
postgres-proxy
容器可见
spec:
volumes:
- name: cloudsql-oauth-credentials
secret:
secretName: cloudsql-oauth-credentials
- name: cloudsql
emptyDir:
containers:
- name: postgres-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.09
imagePullPolicy: Always
command: ["/cloud_sql_proxy",
"--dir=/cloudsql",
"-instances=@@PROJECT@@:us-central1:@@DBINST@@=tcp:5432",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-oauth-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: cloudsql
mountPath: /cloudsql