Skip to content

NimTechnology

Trình bày các công nghệ CLOUD một cách dễ hiểu.

  • Kubernetes & Container
    • Docker
    • Kubernetes
      • Ingress
    • Helm Chart
    • Isito-EnvoyFilter
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Vault
    • Longhorn – Storage
    • VictoriaMetrics
  • CI/CD
    • ArgoCD
    • ArgoWorkflows
    • Spinnaker
    • Jenkins
  • Coding
    • Terraform
      • GCP – Google Cloud
      • AWS – Amazon Web Service
    • Golang
    • Laravel
    • Jquery & JavaScript
    • Git
    • Selenium
  • Log & Monitor
    • Prometheus
    • Grafana
    • ELK
      • Kibana
      • Logstash
  • BareMetal
  • Toggle search form

[ExternalSecrets-Vault-k8s] Hướng dẫn đồng bộ secret từ Vault sang K8s bằng 1 opensouce Godady

Posted on June 30, 2021June 18, 2022 By nim 3 Comments on [ExternalSecrets-Vault-k8s] Hướng dẫn đồng bộ secret từ Vault sang K8s bằng 1 opensouce Godady

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)

architecture.png

Đâ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
>>>>>>>>>>>>>>>>>>>>
Phải thay chỗ này nhé.

Ở đâ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:

Nó thêm refix kiểu này thì khi đó view log external-secrets sẽ thấy lỗi “service account name not authorized”
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

Bạn cần exec vào pod bất kì của vault nhé.
Che như không che 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
recheck lại bằng cách edit
##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
Vì chưa tạo secret nên là statú 404
>>>>> 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
Log trong external-secrets

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:

Bị lỗi trên đó external-secrets gọi vào url của vaul bị sai nên lỗi.
Bạn kiểm tra value của helm khi install và mình có nhắc đầu bài các bạn cần chú ý.

>>>>>>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é

Kubernetes & Container, Vault

Post navigation

Previous Post: [Helm-k8s] Researching to write a unit test for your helm chart – Kubernetes
Next Post: [Jenkins] Hướng dẫn kết nối kết nối Jenkins master và Agent

More Related Articles

[Longhorn] fix No schedule volumes in Taint Toleration Nodes Kubernetes & Container
[Kaniko]Hướng dẫn build image docker chạy trong container Kubernetes & Container
[Longhorn] Store label with longhorn in order to create many storage classes and have many storage styles “SSD, HDD, fast, slow” Kubernetes & Container
[Helm Chart] Làm chủ Helm trên Kubernetes trong 60 phút!! Helm Chart
[Kubernetes] How to delete namespace is Terminating and very stubborn Kubernetes
[Istio/multi cluster] Install multi-cluster Istio with mode “Primary-Remote” for Kubernetes on Google Cloud Platform. Isito-EnvoyFilter

Comments (3) on “[ExternalSecrets-Vault-k8s] Hướng dẫn đồng bộ secret từ Vault sang K8s bằng 1 opensouce Godady”

  1. Thanh Hung says:
    March 2, 2022 at 2:12 pm

    đại ca viết guide line đọc nổ não 😀

    Reply
    1. nim says:
      March 4, 2022 at 12:22 am

      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

      Reply
    2. nim says:
      March 4, 2022 at 12:28 am

      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à

      Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Tham Gia Group DevOps nhé!
Để Nim có nhiều động lực ra nhiều bài viết.
Để nhận được những thông báo mới nhất.

Recent Posts

  • Protected: My Assignment  June 24, 2022
  • [Spinnaker] Spinnaker writes too many logs – Reduce spinnaker log level June 22, 2022
  • [Jenkins] Jobs will be created automatically by Jenkins Job Builder June 20, 2022
  • [Postgresql] Install postgresql client and trying a few command postgresql. June 20, 2022
  • [Mount/Nextcloud] How do you mount a hard disk that was used windows into Linux. June 19, 2022

Archives

  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021

Categories

  • BareMetal
  • CI/CD
    • ArgoCD
    • ArgoWorkflows
    • Jenkins
    • Spinnaker
  • Coding
    • Git
    • Golang
    • Jquery & JavaScript
    • Laravel
    • Selenium
    • Terraform
      • AWS – Amazon Web Service
      • GCP – Google Cloud
  • Kubernetes & Container
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Docker
    • Helm Chart
    • Isito-EnvoyFilter
    • Kubernetes
      • Ingress
    • Longhorn – Storage
    • Vault
    • VictoriaMetrics
  • Log & Monitor
    • ELK
      • Kibana
      • Logstash
    • Grafana
    • Prometheus
  • Uncategorized
  • Admin

Copyright © 2022 NimTechnology.