当保管库部署在专用集群上时,如何从另一个 kubernetes 集群访问保管库机密?
How to access vault secrets from another kubernetes cluster when vault is deployed on a dedicated cluster?
我在 AWS 的同一区域的同一 VPC
中创建了 2 个 kubernetes
集群。
第一个集群专用于我的微型 services.Let 的名字 "MS"
第二个专用于保管库及其高可用性存储(consul)。我们将其命名为 "V"
问题是我如何从 "MS" 集群中的容器访问我在 "V" 集群中创建的秘密?
到目前为止我尝试过的:
我首先在 "MS" 集群中创建一个新的服务帐户,该帐户使用审查令牌 API.
进行身份验证
然后我不得不从 "MI" 集群
中提取令牌审查器 JWT、Kuberenetes CA 证书和 Kubernetes 主机
然后我切换到 "V" 集群上下文以启用并创建一个附加到该服务帐户的新 kubernetes 身份验证方法。
从那里我不知道该怎么做,我不确定该方法在使用 2 个不同的集群时是否真的有效?
服务帐号:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: consul
labels:
app: consul
rules:
- apiGroups: [""]
resources:
- pods
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: consul
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: consul
subjects:
- kind: ServiceAccount
name: consul
namespace: default
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: consul
labels:
app: consul
从 "MI" 集群中导出令牌审查变量
export VAULT_SA_NAME=$(kubectl get sa postgres-vault -o jsonpath="{.secrets[*]['name']}")
export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data.token}" | base64 --decode; echo)
export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data['ca\.crt']}" | base64 --decode; echo)
export K8S_HOST=$(kubectl exec consul-consul-0 -- sh -c 'echo $KUBERNETES_SERVICE_HOST')
创建kubernetes auth方法
vault auth enable kubernetes
vault write auth/kubernetes/config \
token_reviewer_jwt="$SA_JWT_TOKEN" \
kubernetes_host="https://$K8S_HOST:443" \
kubernetes_ca_cert="$SA_CA_CRT"
我希望通过我的微服务访问存储在保险库中的秘密。虽然我不确定在专用集群中部署 vault 时该方法是否有效。
我想可能还有其他东西可以加入这两个集群?可能正在使用领事?
你已经完成了 80%。接下来的步骤是:
1. 运行 使用正确服务帐户的部署
2. Login/Authenticate 使用 Kubernetes 身份验证方法进行保管并获取相关的保管库令牌。
3. 取回秘密。
这是将服务帐户添加到您的部署的示例:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: xxx
labels:
app: xxx
spec:
replicas: 1
template:
metadata:
...
spec:
serviceAccountName: vault-auth
...
要使用 kube auth 登录,请参阅 here. I would suggest that you take a look at this project 以获取具体示例。
获得具有正确权限的令牌后,您可以使用 vault cli/rest api 访问机密。
我在 AWS 的同一区域的同一 VPC
中创建了 2 个 kubernetes
集群。
第一个集群专用于我的微型 services.Let 的名字 "MS" 第二个专用于保管库及其高可用性存储(consul)。我们将其命名为 "V"
问题是我如何从 "MS" 集群中的容器访问我在 "V" 集群中创建的秘密?
到目前为止我尝试过的:
我首先在 "MS" 集群中创建一个新的服务帐户,该帐户使用审查令牌 API.
进行身份验证
然后我不得不从 "MI" 集群
中提取令牌审查器 JWT、Kuberenetes CA 证书和 Kubernetes 主机
然后我切换到 "V" 集群上下文以启用并创建一个附加到该服务帐户的新 kubernetes 身份验证方法。
从那里我不知道该怎么做,我不确定该方法在使用 2 个不同的集群时是否真的有效?
服务帐号:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: consul
labels:
app: consul
rules:
- apiGroups: [""]
resources:
- pods
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: consul
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: consul
subjects:
- kind: ServiceAccount
name: consul
namespace: default
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: consul
labels:
app: consul
从 "MI" 集群中导出令牌审查变量
export VAULT_SA_NAME=$(kubectl get sa postgres-vault -o jsonpath="{.secrets[*]['name']}")
export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data.token}" | base64 --decode; echo)
export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data['ca\.crt']}" | base64 --decode; echo)
export K8S_HOST=$(kubectl exec consul-consul-0 -- sh -c 'echo $KUBERNETES_SERVICE_HOST')
创建kubernetes auth方法
vault auth enable kubernetes
vault write auth/kubernetes/config \
token_reviewer_jwt="$SA_JWT_TOKEN" \
kubernetes_host="https://$K8S_HOST:443" \
kubernetes_ca_cert="$SA_CA_CRT"
我希望通过我的微服务访问存储在保险库中的秘密。虽然我不确定在专用集群中部署 vault 时该方法是否有效。
我想可能还有其他东西可以加入这两个集群?可能正在使用领事?
你已经完成了 80%。接下来的步骤是: 1. 运行 使用正确服务帐户的部署 2. Login/Authenticate 使用 Kubernetes 身份验证方法进行保管并获取相关的保管库令牌。 3. 取回秘密。
这是将服务帐户添加到您的部署的示例:
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: xxx
labels:
app: xxx
spec:
replicas: 1
template:
metadata:
...
spec:
serviceAccountName: vault-auth
...
要使用 kube auth 登录,请参阅 here. I would suggest that you take a look at this project 以获取具体示例。
获得具有正确权限的令牌后,您可以使用 vault cli/rest api 访问机密。