2.7. 使用外部 secret 存储为 pod 提供敏感数据
有些应用程序需要密码和用户名等敏感信息,但您不希望开发人员持有这些信息。
使用 Kubernetes Secret
对象提供敏感信息的一个替代选择是,使用外部 secret 存储来存储敏感信息。您可以使用 Secrets Store CSI Driver Operator 与外部 secret 存储集成,并将 secret 内容挂载为 pod 卷。
Secret Store CSI Driver Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
2.7.1. 关于 Secret Store CSI Driver Operator 复制链接链接已复制到粘贴板!
Kubernetes secret 以 Base64 编码的形式存储。etcd 为这些 secret 提供加密,但在检索 secret 时,它们会被解密并提供给用户。如果没有在集群中正确配置基于角色的访问控制,则具有 API 或 etcd 访问权限的任何人都可以检索或修改 secret。另外,有权在命名空间中创建 pod 的任何人都可以使用该命名空间中的任何 secret 来读取该命名空间中的任何 secret。
要安全地存储和管理您的 secret,您可以将 OpenShift Container Platform Secrets Store Container Storage Interface (CSI) Driver Operator 配置为使用供应商插件从外部 secret 管理系统(如 Azure Key Vault)挂载 secret。应用程序可以使用 secret,但 secret 在应用程序 pod 被销毁后不会在系统中保留。
Secret Store CSI Driver Operator(secrets-store.csi.k8s.io
)允许 OpenShift Container Platform 将存储在企业级外部 secret 中的多个 secret、密钥和证书作为卷挂载到 pod 中。Secrets Store CSI Driver Operator 使用 gRPC 与供应商通信,以从指定的外部 secret 存储获取挂载内容。附加卷后,其中的数据将挂载到容器的文件系统。Secret 存储卷以 in-line 形式挂载。
2.7.1.1. Secret 存储供应商 复制链接链接已复制到粘贴板!
以下 secret 存储供应商可用于 Secret Store CSI Driver Operator:
- AWS Secrets Manager
- AWS Systems Manager Parameter Store
- Azure Key Vault
- Google Secret Manager
- HashiCorp Vault
2.7.1.2. 自动轮转 复制链接链接已复制到粘贴板!
Secrets Store CSI 驱动程序会定期使用外部 secret 存储中的内容轮转挂载卷中的内容。如果外部 secret 存储中更新了 secret,secret 将在挂载的卷中更新。Secrets Store CSI Driver Operator 每 2 分钟轮询一次更新。
如果启用了将挂载内容作为 Kubernetes secret 同步,则 Kubernetes secret 也会被轮转。
使用 secret 数据的应用程序必须监视是否有对 secret 的更新。
2.7.2. 安装 Secret Store CSI 驱动程序 复制链接链接已复制到粘贴板!
先决条件
- 访问 OpenShift Container Platform Web 控制台。
- 集群的管理员访问权限。
流程
安装 Secret Store CSI 驱动程序:
安装 Secret Store CSI Driver Operator:
- 登录到 web 控制台。
-
点 Operators
OperatorHub。 - 通过在过滤器框中输入 "Secrets Store CSI" 来查找 Secrets Store CSI Driver Operator。
- 点 Secrets Store CSI Driver Operator 按钮。
- 在 Secrets Store CSI Driver Operator 页面中,点 Install。
在 Install Operator 页面中,确保:
- 选择 All namespaces on the cluster (default)。
- 安装的命名空间 被设置为 openshift-cluster-csi-drivers。
点 Install。
安装完成后,Secret Store CSI Driver Operator 会在 web 控制台的 Installed Operators 部分列出。
为驱动程序创建
ClusterCSIDriver
实例 (secrets-store.csi.k8s.io
):-
点 Administration
CustomResourceDefinitions ClusterCSIDriver。 在 Instances 选项卡上,单击 Create ClusterCSIDriver。
使用以下 YAML 文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Create。
-
点 Administration
2.7.3. 将 secret 从外部 secret 存储挂载到 CSI 卷 复制链接链接已复制到粘贴板!
安装 Secret Store CSI Driver Operator 后,您可以将 secret 从以下外部 secret 存储挂载到 CSI 卷:
2.7.3.1. 从 AWS Secrets Manager 挂载 secret 复制链接链接已复制到粘贴板!
您可以使用 Secrets Store CSI Driver Operator 将 secret 从 AWS Secret Manager 挂载到 OpenShift Container Platform 中的 Container Storage Interface (CSI) 卷。要从 AWS Secrets Manager 挂载 secret,您的集群必须安装在 AWS 上,并使用 AWS 安全令牌服务 (STS)。
先决条件
- 您的集群安装在 AWS 上,并使用 AWS 安全令牌服务 (STS)。
- 已安装 Secrets Store CSI Driver Operator。具体步骤请参阅 安装 Secret Store CSI 驱动程序。
- 已将 AWS Secret Manager 配置为存储所需的 secret。
-
已提取并准备好
ccoctl
二进制文件。 -
已安装
jq
CLI 工具。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
安装 AWS Secrets Manager 供应商:
使用供应商资源的以下配置创建一个 YAML 文件:
重要Secret Store CSI 驱动程序的 AWS Secrets Manager 供应商是一个上游供应商。
此配置会根据上游 AWS 文档中提供的配置进行修改,以便它可以与 OpenShift Container Platform 正常工作。对此配置的更改可能会影响功能。
aws-provider.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,授予
csi-secrets-store-provider-aws
服务帐户的特权访问权限:oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建供应商资源:
oc apply -f aws-provider.yaml
$ oc apply -f aws-provider.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
授予服务帐户读取 AWS secret 对象的权限:
运行以下命令,创建一个目录使其包含凭证请求:
mkdir credentialsrequest-dir-aws
$ mkdir credentialsrequest-dir-aws
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下配置为凭证请求创建 YAML 文件:
credentialsrequest.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来检索 OIDC 供应商:
oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
$ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
https://<oidc_provider_name>
https://<oidc_provider_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制 OIDC 供应商名称
<oidc_provider_name>
,在下一步中使用。运行以下命令,使用
ccoctl
工具处理凭证请求:ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output
$ ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制
<aws_role_arn>
以在下一步中使用。例如,arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds
。运行以下命令,使用角色 ARN 绑定服务帐户:
oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
$ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 secret 供应商类以定义您的 secret 存储供应商:
创建定义
SecretProviderClass
对象的 YAML 文件:secret-provider-class-aws.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SecretProviderClass
对象:oc create -f secret-provider-class-aws.yaml
$ oc create -f secret-provider-class-aws.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署以使用此 secret 供应商类:
创建定义
Deployment
对象的 YAML 文件:deployment.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Deployment
对象:oc create -f deployment.yaml
$ oc create -f deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您可以从 pod 卷挂载中的 AWS Secrets Manager 访问 secret:
运行以下命令,列出 pod 挂载中的 secret:
oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
$ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
testSecret
testSecret
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 pod 挂载中的 secret:
oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
$ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<secret_value>
<secret_value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
您可以使用 Secrets Store CSI Driver Operator 将 AWS Systems Manager 参数 Store 中的 secret 挂载到 OpenShift Container Platform 中的 Container Storage Interface (CSI) 卷。要从 AWS Systems Manager Parameter Store 挂载 secret,您的集群必须安装在 AWS 上,并使用 AWS 安全令牌服务(STS)。
先决条件
- 您的集群安装在 AWS 上,并使用 AWS 安全令牌服务 (STS)。
- 已安装 Secrets Store CSI Driver Operator。具体步骤请参阅 安装 Secret Store CSI 驱动程序。
- 您已配置了 AWS 系统管理器参数存储来存储所需的 secret。
-
已提取并准备好
ccoctl
二进制文件。 -
已安装
jq
CLI 工具。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
安装 AWS Systems Manager Parameter Store 供应商:
使用供应商资源的以下配置创建一个 YAML 文件:
重要Secret Store CSI 驱动程序的 AWS Systems Manager Parameter Store 供应商是一个上游供应商。
此配置会根据上游 AWS 文档中提供的配置进行修改,以便它可以与 OpenShift Container Platform 正常工作。对此配置的更改可能会影响功能。
aws-provider.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,授予
csi-secrets-store-provider-aws
服务帐户的特权访问权限:oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-aws -n openshift-cluster-csi-drivers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建供应商资源:
oc apply -f aws-provider.yaml
$ oc apply -f aws-provider.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
授予服务帐户读取 AWS secret 对象的权限:
运行以下命令,创建一个目录使其包含凭证请求:
mkdir credentialsrequest-dir-aws
$ mkdir credentialsrequest-dir-aws
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下配置为凭证请求创建 YAML 文件:
credentialsrequest.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来检索 OIDC 供应商:
oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
$ oc get --raw=/.well-known/openid-configuration | jq -r '.issuer'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
https://<oidc_provider_name>
https://<oidc_provider_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制 OIDC 供应商名称
<oidc_provider_name>
,在下一步中使用。运行以下命令,使用
ccoctl
工具处理凭证请求:ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output
$ ccoctl aws create-iam-roles \ --name my-role --region=<aws_region> \ --credentials-requests-dir=credentialsrequest-dir-aws \ --identity-provider-arn arn:aws:iam::<aws_account>:oidc-provider/<oidc_provider_name> --output-dir=credrequests-ccoctl-output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds
2023/05/15 18:10:34 Role arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds created 2023/05/15 18:10:34 Saved credentials configuration to: credrequests-ccoctl-output/manifests/my-namespace-aws-creds-credentials.yaml 2023/05/15 18:10:35 Updated Role policy for Role my-role-my-namespace-aws-creds
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从输出中复制
<aws_role_arn>
以在下一步中使用。例如,arn:aws:iam::<aws_account_id>:role/my-role-my-namespace-aws-creds
。运行以下命令,使用角色 ARN 绑定服务帐户:
oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
$ oc annotate -n my-namespace sa/aws-provider eks.amazonaws.com/role-arn="<aws_role_arn>"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 secret 供应商类以定义您的 secret 存储供应商:
创建定义
SecretProviderClass
对象的 YAML 文件:secret-provider-class-aws.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SecretProviderClass
对象:oc create -f secret-provider-class-aws.yaml
$ oc create -f secret-provider-class-aws.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署以使用此 secret 供应商类:
创建定义
Deployment
对象的 YAML 文件:deployment.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Deployment
对象:oc create -f deployment.yaml
$ oc create -f deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您可以从 pod 卷挂载中的 AWS Systems Manager Parameter Store 访问 secret:
运行以下命令,列出 pod 挂载中的 secret:
oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
$ oc exec my-aws-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
testParameter
testParameter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 pod 挂载中的 secret:
oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
$ oc exec my-aws-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<secret_value>
<secret_value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.3.3. 从 Azure Key Vault 挂载 secret 复制链接链接已复制到粘贴板!
您可以使用 Secrets Store CSI Driver Operator 将 secret 从 Azure Key Vault 挂载到 OpenShift Container Platform 中的 Container Storage Interface (CSI) 卷。要从 Azure Key Vault 挂载 secret,您的集群必须安装在 Microsoft Azure 上。
先决条件
- 集群安装在 Azure 上。
- 已安装 Secrets Store CSI Driver Operator。具体步骤请参阅 安装 Secret Store CSI 驱动程序。
- 已将 Azure Key Vault 配置为存储所需的 secret。
-
已安装 Azure CLI (
az
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
安装 Azure Key Vault 供应商:
使用供应商资源的以下配置创建一个 YAML 文件:
重要Secrets Store CSI 驱动程序的 Azure Key Vault 供应商是一个上游供应商。
此配置会根据上游 Azure 文档中提供的配置进行修改,以便它可以与 OpenShift Container Platform 正常工作。对此配置的更改可能会影响功能。
azure-provider.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,授予
csi-secrets-store-provider-azure
服务帐户的特权访问权限:oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-azure -n openshift-cluster-csi-drivers
$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-azure -n openshift-cluster-csi-drivers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建供应商资源:
oc apply -f azure-provider.yaml
$ oc apply -f azure-provider.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建服务主体来访问密钥库:
运行以下命令,将服务主体客户端 secret 设置为环境变量:
SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --name https://$KEYVAULT_NAME --query 'password' -otsv)"
$ SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --name https://$KEYVAULT_NAME --query 'password' -otsv)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将服务主体客户端 ID 设置为环境变量:
SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name https://$KEYVAULT_NAME --query '[0].appId' -otsv)"
$ SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name https://$KEYVAULT_NAME --query '[0].appId' -otsv)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,使用服务主体客户端 secret 和 ID 创建通用 secret:
oc create secret generic secrets-store-creds -n my-namespace --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
$ oc create secret generic secrets-store-creds -n my-namespace --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
secrets-store.csi.k8s.io/used=true
标签,以允许供应商查找此nodePublishSecretRef
secret:oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
$ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 secret 供应商类以定义您的 secret 存储供应商:
创建定义
SecretProviderClass
对象的 YAML 文件:secret-provider-class-azure.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SecretProviderClass
对象:oc create -f secret-provider-class-azure.yaml
$ oc create -f secret-provider-class-azure.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署以使用此 secret 供应商类:
创建定义
Deployment
对象的 YAML 文件:deployment.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Deployment
对象:oc create -f deployment.yaml
$ oc create -f deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您可以从 pod 卷挂载中的 Azure Key Vault 访问 secret:
运行以下命令,列出 pod 挂载中的 secret:
oc exec my-azure-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
$ oc exec my-azure-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
secret1
secret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 pod 挂载中的 secret:
oc exec my-azure-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/secret1
$ oc exec my-azure-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/secret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
my-secret-value
my-secret-value
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.3.4. 从 Google Secret Manager 挂载 secret 复制链接链接已复制到粘贴板!
您可以使用 Secrets Store CSI Driver Operator 将 Google Secret Manager 中的 secret 挂载到 OpenShift Container Platform 中的 Container Storage Interface (CSI) 卷。要从 Google Secret Manager 挂载 secret,您的集群必须安装在 Google Cloud Platform (GCP) 上。
先决条件
- 已安装 Secrets Store CSI Driver Operator。具体步骤请参阅 安装 Secret Store CSI 驱动程序。
- 已将 Google Secret Manager 配置为存储所需的 secret。
-
您已从 Google Cloud 服务帐户创建一个名为
key.json
的服务帐户密钥。 -
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
安装 Google Secret Manager 供应商:
使用供应商资源的以下配置创建一个 YAML 文件:
gcp-provider.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为
csi-secrets-store-provider-gcp
服务帐户授予特权访问权限:oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers
$ oc adm policy add-scc-to-user privileged -z csi-secrets-store-provider-gcp -n openshift-cluster-csi-drivers
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建供应商资源:
oc apply -f gcp-provider.yaml
$ oc apply -f gcp-provider.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
授予读取 Google Secret Manager secret 的权限:
运行以下命令创建新项目:
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为 pod 安全准入标记
my-namespace
命名空间:oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
$ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为 pod 部署创建服务帐户:
oc create serviceaccount my-service-account --namespace=my-namespace
$ oc create serviceaccount my-service-account --namespace=my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,从
key.json
文件创建通用 secret:oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json
$ oc create secret generic secrets-store-creds -n my-namespace --from-file=key.json
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 您已从 Google Secret Manager 创建此
key.json
文件。
应用
secrets-store.csi.k8s.io/used=true
标签,以允许供应商查找此nodePublishSecretRef
secret:oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
$ oc -n my-namespace label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 secret 供应商类以定义您的 secret 存储供应商:
创建定义
SecretProviderClass
对象的 YAML 文件:secret-provider-class-gcp.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SecretProviderClass
对象:oc create -f secret-provider-class-gcp.yaml
$ oc create -f secret-provider-class-gcp.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署以使用此 secret 供应商类:
创建定义
Deployment
对象的 YAML 文件:deployment.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Deployment
对象:oc create -f deployment.yaml
$ oc create -f deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您是否可以从 pod 卷挂载中的 Google Secret Manager 访问 secret:
运行以下命令,列出 pod 挂载中的 secret:
oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
$ oc exec my-gcp-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
testsecret1
testsecret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 pod 挂载中的 secret:
oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1
$ oc exec my-gcp-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testsecret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<secret_value>
<secret_value>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.3.5. 从 HashiCorp Vault 挂载 secret 复制链接链接已复制到粘贴板!
您可以使用 Secrets Store CSI Driver Operator 将 secret 从 HashiCorp Vault 挂载到 OpenShift Container Platform 中的 Container Storage Interface (CSI) 卷。
使用 Secrets Store CSI Driver Operator 从 HashiCorp Vault 挂载 secret 已使用以下云供应商测试:
- Amazon Web Services (AWS)
- Microsoft Azure
其他云供应商可能可以正常工作,但还没有测试。以后可能会测试其他云供应商。
先决条件
- 已安装 Secrets Store CSI Driver Operator。具体步骤请参阅 安装 Secret Store CSI 驱动程序。
- 已安装 Helm。
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
运行以下命令来添加 HashiCorp Helm 仓库:
helm repo add hashicorp https://helm.releases.hashicorp.com
$ helm repo add hashicorp https://helm.releases.hashicorp.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,更新所有仓库以确保 Helm 了解最新版本:
helm repo update
$ helm repo update
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 安装 HashiCorp Vault 供应商:
运行以下命令,为 Vault 创建一个新项目:
oc new-project vault
$ oc new-project vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,为 pod 安全准入标记
vault
命名空间:oc label ns vault security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
$ oc label ns vault security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,授予
vault
服务帐户的特权访问权限:oc adm policy add-scc-to-user privileged -z vault -n vault
$ oc adm policy add-scc-to-user privileged -z vault -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,授予
vault-csi-provider
服务帐户的访问权限:oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault
$ oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来部署 HashiCorp Vault:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,修补
vault-csi-driver
守护进程,将securityContext
设置为privileged
:oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'
$ oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
vault-csi-provider
pod 是否已正确启动:oc get pods -n vault
$ oc get pods -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 24m vault-csi-provider-87rgw 1/2 Running 0 5s vault-csi-provider-bd6hp 1/2 Running 0 4s vault-csi-provider-smlv7 1/2 Running 0 5s
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 24m vault-csi-provider-87rgw 1/2 Running 0 5s vault-csi-provider-bd6hp 1/2 Running 0 4s vault-csi-provider-smlv7 1/2 Running 0 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
配置 HashiCorp Vault 以存储所需的 secret:
运行以下命令来创建 secret:
oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value
$ oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证
secret/example1
的路径是否可读:oc exec vault-0 --namespace=vault -- vault kv get secret/example1
$ oc exec vault-0 --namespace=vault -- vault kv get secret/example1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
将 Vault 配置为使用 Kubernetes 身份验证:
运行以下命令来启用 Kubernetes auth 方法:
oc exec vault-0 --namespace=vault -- vault auth enable kubernetes
$ oc exec vault-0 --namespace=vault -- vault auth enable kubernetes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Success! Enabled kubernetes auth method at: kubernetes/
Success! Enabled kubernetes auth method at: kubernetes/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 配置 Kubernetes auth 方法:
运行以下命令,将令牌查看器设置为环境变量:
TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
$ TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将 Kubernetes 服务 IP 地址设置为环境变量:
KUBERNETES_SERVICE_IP="$(oc get svc kubernetes -o go-template="{{ .spec.clusterIP }}")"
$ KUBERNETES_SERVICE_IP="$(oc get svc kubernetes -o go-template="{{ .spec.clusterIP }}")"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来更新 Kubernetes auth 方法:
oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc.cluster.local" \ token_reviewer_jwt="${TOKEN_REVIEWER_JWT}" \ kubernetes_host="https://${KUBERNETES_SERVICE_IP}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
$ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc.cluster.local" \ token_reviewer_jwt="${TOKEN_REVIEWER_JWT}" \ kubernetes_host="https://${KUBERNETES_SERVICE_IP}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Success! Data written to: auth/kubernetes/config
Success! Data written to: auth/kubernetes/config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行以下命令,为应用程序创建一个策略:
oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF path "secret/data/*" { capabilities = ["read"] } EOF
$ oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF path "secret/data/*" { capabilities = ["read"] } EOF
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Success! Uploaded policy: csi
Success! Uploaded policy: csi
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,创建一个身份验证角色来访问应用程序:
oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/role/csi \ bound_service_account_names=default \ bound_service_account_namespaces=default,test-ns,negative-test-ns,my-namespace \ policies=csi \ ttl=20m
$ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/role/csi \ bound_service_account_names=default \ bound_service_account_namespaces=default,test-ns,negative-test-ns,my-namespace \ policies=csi \ ttl=20m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Success! Data written to: auth/kubernetes/role/csi
Success! Data written to: auth/kubernetes/role/csi
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证所有
vault
pod 是否都正常运行:oc get pods -n vault
$ oc get pods -n vault
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 43m vault-csi-provider-87rgw 2/2 Running 0 19m vault-csi-provider-bd6hp 2/2 Running 0 19m vault-csi-provider-smlv7 2/2 Running 0 19m
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 43m vault-csi-provider-87rgw 2/2 Running 0 19m vault-csi-provider-bd6hp 2/2 Running 0 19m vault-csi-provider-smlv7 2/2 Running 0 19m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证所有
secrets-store-csi-driver
pod 是否正常运行:oc get pods -n openshift-cluster-csi-drivers | grep -E "secrets"
$ oc get pods -n openshift-cluster-csi-drivers | grep -E "secrets"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 secret 供应商类以定义您的 secret 存储供应商:
创建定义
SecretProviderClass
对象的 YAML 文件:secret-provider-class-vault.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
SecretProviderClass
对象:oc create -f secret-provider-class-vault.yaml
$ oc create -f secret-provider-class-vault.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建部署以使用此 secret 供应商类:
创建定义
Deployment
对象的 YAML 文件:deployment.yaml
示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建
Deployment
对象:oc create -f deployment.yaml
$ oc create -f deployment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
验证您是否可以从 pod 卷挂载中的 HashiCorp Vault 访问 secret:
运行以下命令,列出 pod 挂载中的 secret:
oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
$ oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
testSecret1
testSecret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 pod 挂载中的 secret:
oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1
$ oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
my-secret-value
my-secret-value
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.4. 启用对作为 Kubernetes secret 挂载的内容进行同步 复制链接链接已复制到粘贴板!
您可以启用同步,从挂载的卷中的内容创建 Kubernetes secret。您可能要启用同步的示例是使用部署中的环境变量来引用 Kubernetes secret。
如果您不想将 secret 存储在 OpenShift Container Platform 集群和 etcd 中,请不要启用同步。仅在需要它时启用此功能,比如当您想要使用环境变量来引用 secret 时。
如果启用了同步,在启动挂载 secret 的 pod 后,来自挂载卷的 secret 会同步为 Kubernetes secret。
当所有挂载内容的 pod 被删除时,同步的 Kubernetes secret 会被删除。
先决条件
- 已安装 Secrets Store CSI Driver Operator。
- 已安装 secret 存储供应商。
- 您已创建了 secret 供应商类。
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
运行以下命令来编辑
SecretProviderClass
资源:oc edit secretproviderclass my-azure-provider
$ oc edit secretproviderclass my-azure-provider
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
my-azure-provider
替换为 secret 供应商类的名称。
使用同步的 Kubernetes secret 配置添加
secretsObjects
部分:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 保存文件以使改变生效。
2.7.5. 查看 pod 卷挂载中的 secret 状态 复制链接链接已复制到粘贴板!
您可以查看 pod 卷挂载中 secret 的详细信息,包括版本。
Secrets Store CSI Driver Operator 在与 pod 相同的命名空间中创建一个 SecretProviderClassPodStatus
资源。您可以查看此资源来查看详细信息,包括版本,以及 pod 卷挂载中的 secret。
先决条件
- 已安装 Secrets Store CSI Driver Operator。
- 已安装 secret 存储供应商。
- 您已创建了 secret 供应商类。
- 您已部署了从 Secrets Store CSI Driver Operator 挂载卷的 pod。
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
运行以下命令,查看 pod 卷挂载中 secret 的详细信息:
oc get secretproviderclasspodstatus <secret_provider_class_pod_status_name> -o yaml
$ oc get secretproviderclasspodstatus <secret_provider_class_pod_status_name> -o yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- secret 供应商类 pod 状态对象的名称采用
<pod_name>-<namespace>-<secret_provider_class_name>
的格式。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.7.6. 卸载 Secret Store CSI Driver Operator 复制链接链接已复制到粘贴板!
先决条件
- 访问 OpenShift Container Platform Web 控制台。
- 集群的管理员访问权限。
流程
卸载 Secret Store CSI Driver Operator:
-
停止所有使用
secrets-store.csi.k8s.io
供应商的应用程序 pod。 - 为所选 secret 存储删除任何第三方供应商插件。
删除 Container Storage Interface (CSI) 驱动程序和相关清单:
-
点 Administration
CustomResourceDefinitions ClusterCSIDriver。 - 在 Instances 选项卡上,对于 secrets-store.csi.k8s.io,点左侧的下拉菜单,然后点 Delete ClusterCSIDriver。
- 出现提示时,单击 Delete。
-
点 Administration
- 验证 CSI 驱动程序 pod 是否不再运行。
卸载 Secret Store CSI Driver Operator:
注意在卸载 Operator 前,必须先删除 CSI 驱动程序。
-
点 Operators
Installed Operators。 - 在 Installed Operators 页面中,在 Search by name 框中输入 "Secrets Store CSI" 来查找 Operator,然后点击它。
-
在 Installed Operators > Operator 详情页面 的右上角,点 Actions
Uninstall Operator。 当在 Uninstall Operator 窗口中提示时,点 Uninstall 按钮从命名空间中删除 Operator。Operator 在集群中部署的任何应用程序都需要手动清理。
卸载后,Secret Store CSI Driver Operator 不再列在 web 控制台的 Installed Operators 部分。
-
点 Operators