Links repo:
https://github.com/external-secrets/kubernetes-external-secrets
Links cài đặt tham khảo:
https://medium.com/craftech/manage-your-kubernetes-secrets-with-hashicorp-vault-25d2fb8119f
https://www.linkedin.com/pulse/secret-management-kubernetes-external-secrets-hashicorp-stephen-kuntz
https://blog.container-solutions.com/tutorialexternal-secrets-with-hashicorp-vault (New Sat 18 Jun 2022)
Đây là Tắt các đặt sau khi đọc và text mấy ngày mấy đêm:
Đầu tiên install external secrets bằng helm
helm repo add external-secrets https://godaddy.github.io/kubernetes-external-secrets/
kubectl create namespace external-secrets
helm install kubernetes-external-secrets external-secrets/kubernetes-external-secrets --namespace external-secrets --values values.yaml
thay gia trị VAULT_ADDR bằng url vault cần có ssl xanh lè nhé
vault cần ở bản 1.7.3 và k8s 1.21
>>>>>>>>>>>>>>>>>>>>
Ở đây có 1 lưu ý cự kì quan trong nhé.
Khi bạn create app external-secrets trên Argocd thì bạn cần đặt tên áp là “kubernetes-external-secrets”
Còn nếu đặt tên là “external-secrets” thì service account sẽ ảnh bên dưới:
TRên master chạy cái này:
kubectl apply \
--filename=-<<EOH
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: role-tokenreview-binding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: kubernetes-external-secrets
namespace: external-secrets
EOH
####
Ở đây thì namespace ClusterRoleBinding là default có một số bài họ để cùng với ns của external-secrets
ở ClusterRole dùng name là system:auth-delegator(là gì tự đọc docx nhé)
ở ServiceAccount thì đặt biệt để ý
name: kubernetes-external-secrets
namespace: external-secrets
>>>>>>>>>>>>>>>>>>>>>>>>>>>
Để hiểu ClusterRoleBinding
Rồi service account “name: kubernetes-external-secrets” lấy đâu ra nhỉ, đây mình chỉ cho.
Bạn vào external-secrets mà bạn cài bằng hem ở mấy bước trên:
Giờ bạn cần exec vaò container vault bất kì login như hình
Vào vault:
kubectl -n vault exec -it pod/vault-0 -- sh
export CLUSTER_NAME=kubernetes-external-secrets
>>> Tạo policy là: kubernetes-external-secrets-kv-rw
vault policy write ${CLUSTER_NAME}-kv-rw - <<EOH
path "kv/data/${CLUSTER_NAME}/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
EOH
>>>>output "Success! Uploaded policy: kubernetes-external-secrets-kv-rw"
##step 5
>>> bước này tạm hiểu bạn cần liên kết policy mà bạn tạo trên vault và k8s
vault auth enable --path="${CLUSTER_NAME}" kubernetes
>>>output Success! Enabled kubernetes auth method at: kubernetes-external-secrets/
vault write auth/${CLUSTER_NAME}/config \
token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443" \
kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
disable_iss_validation=true
>>>>output Success! Data written to: auth/kubernetes-external-secrets/config
disable_iss_validation=true ta bắt buộc phải có cái này
lý do: https://github.com/external-secrets/kubernetes-external-secrets/issues/721
##step 7
>>> Bạn tạo role
vault write auth/${CLUSTER_NAME}/role/${CLUSTER_NAME}-role \
bound_service_account_names="kubernetes-external-secrets" \
bound_service_account_namespaces="external-secrets" \
policies="default,${CLUSTER_NAME}-kv-rw" \
ttl="15m"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>output: Success! Data written to: auth/kubernetes-external-secrets/role/kubernetes-external-secrets-role
về lại k8s master
kubectl apply \
--filename=-<<EOH
---
apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
name: test
spec:
backendType: vault
vaultMountPoint: kubernetes-external-secrets #created at step 5
vaultRole: kubernetes-external-secrets-role #created at step 7
dataFrom:
- kv/data/kubernetes-external-secrets/test
EOH
>>>>> gõ command trong vault nhé
vault secrets enable -path kv/ kv-v2
vault kv put kv/kubernetes-external-secrets/test \
secret="your-random-string-shared-secret"
>>>output
Key Value
--- -----
created_time 2021-09-11T13:49:39.297424961Z
deletion_time n/a
destroyed false
version 1
Sau khi động bộ được rồi. áp dụng với cái env from secret trên k8s là người dùng khai báo env trên vault có vẻ bảo mật he.
Nếu lỗi:
>>>>>>Giờ tìm hiểu thêm 1 vài thứ
Và bạn sẽ thấy secret có tên là env-test
>>>>Giờ muốn thêm secret thì sao nhỉ?
vault kv put kv/kubernetes-external-secrets/nim \
secret="your-random-string-shared-secret"
Tạo 1 file external-secret dành cho secret mới và apply vaò ns default
apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
name: env-nim
spec:
backendType: vault
vaultMountPoint: kubernetes-external-secrets #created at step 5
vaultRole: kubernetes-external-secrets-role #created at step 7
dataFrom:
- kv/data/kubernetes-external-secrets/nim
>>>>>>>>> giờ tạo 1 secret cho 1 namespace khác (sample).
Tạo 1 ClusterRoleBinding để external-secrets create secret trên namespace: sample
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: role-tokenreview-binding
namespace: sample
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: kubernetes-external-secrets
namespace: external-secrets
tạo external-secrets
apiVersion: 'kubernetes-client.io/v1'
kind: ExternalSecret
metadata:
name: env-nim
namespace: sample
spec:
backendType: vault
vaultMountPoint: kubernetes-external-secrets #created at step 5
vaultRole: kubernetes-external-secrets-role #created at step 7
dataFrom:
- kv/data/kubernetes-external-secrets/nim
apply trên ns sample nhé
Sync secret on vault to configmap on k8s
# define your template in a config map apiVersion: v1 kind: ConfigMap metadata: name: grafana-config-tpl data: config.yaml: | datasources: - name: Graphite type: graphite access: proxy url: http://localhost:8080 password: "{{ .password }}" user: "{{ .user }}" --- apiVersion: external-secrets.io/v1alpha1 kind: ExternalSecret metadata: name: my-template-example spec: # ... target: name: secret-to-be-created template: engineVersion: v2 templateFrom: - configMap: # name of the configmap to pull in name: grafana-config-tpl # here you define the keys that should be used as template items: - key: config.yaml data: - secretKey: user remoteRef: key: /grafana/user - secretKey: password remoteRef: key: /grafana/password
https://external-secrets.io/v0.4.4/guides-templating/#templatefrom
đại ca viết guide line đọc nổ não 😀
Khó hiểu chỗ nào cứ pm hoặc command để mình chỉnh lại nè!
Công nhận bài này cần phải mấy mục lục với mấy cái hình mới dễ hiểu
Có 1 cái quan trọng là phải hiểu sơ về vault 1 chút síu.
nào mình refactor lại bài này.
Bạn cứ gõ theo command và nghiễm chút là hiểu thôi ấy mà