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
      • Pod
    • Helm Chart
    • OAuth2 Proxy
    • Isito-EnvoyFilter
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Vault
    • Longhorn – Storage
    • VictoriaMetrics
    • MetalLB
    • Kong Gateway
  • CI/CD
    • ArgoCD
    • ArgoWorkflows
    • Argo Events
    • Spinnaker
    • Jenkins
    • Harbor
    • TeamCity
    • Git
      • Bitbucket
  • Coding
    • DevSecOps
    • Terraform
      • GCP – Google Cloud
      • AWS – Amazon Web Service
      • Azure Cloud
    • Golang
    • Laravel
    • Python
    • Jquery & JavaScript
    • Selenium
  • Log, Monitor & Tracing
    • DataDog
    • Prometheus
    • Grafana
    • ELK
      • Kibana
      • Logstash
  • BareMetal
    • NextCloud
  • 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, 2021August 3, 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é

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

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

[istio] Sử dụng istio-operator và istioctl để cài đặt Istio Isito-EnvoyFilter
[Helm Chart] Learning Helm on Kubernetes in 60 minutes!! Helm Chart
[Kubernetes] Lesson7: k8s Easy – Pod Kubernetes & Container
[Kubernetes] Gateway API – Ingress And Service Mesh Spec Replacement? Kubernetes & Container
[Kubernestes] I waiting too long but my workload is still unavailable Kubernetes & Container
[OPA Gatekeeper] Sử dụng openpolicyagent để ngăn chặn việc apply yaml tuỳ tiện và sai lên kubernetes! Kubernetes & Container

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

  • [WordPress] Hướng dấn gửi mail trên WordPress thông qua gmail. June 15, 2025
  • [Bitbucket] Git Clone/Pull/Push with Bitbucket through API Token. June 12, 2025
  • [Teamcity] How to transfer the value from pipeline A to pipeline B June 9, 2025
  • [Windows] Remove the process that consumes too much CPU. June 3, 2025
  • Deploying Web-Based File Managers: File Browser and KubeFileBrowser with Docker and Kubernetes June 3, 2025

Archives

  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • 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
    • NextCloud
  • CI/CD
    • Argo Events
    • ArgoCD
    • ArgoWorkflows
    • Git
      • Bitbucket
    • Harbor
    • Jenkins
    • Spinnaker
    • TeamCity
  • Coding
    • DevSecOps
    • Golang
    • Jquery & JavaScript
    • Laravel
    • NextJS 14 & ReactJS & Type Script
    • Python
    • Selenium
    • Terraform
      • AWS – Amazon Web Service
      • Azure Cloud
      • GCP – Google Cloud
  • Kubernetes & Container
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Docker
    • Helm Chart
    • Isito-EnvoyFilter
    • Kong Gateway
    • Kubernetes
      • Ingress
      • Pod
    • Longhorn – Storage
    • MetalLB
    • OAuth2 Proxy
    • Vault
    • VictoriaMetrics
  • Log, Monitor & Tracing
    • DataDog
    • ELK
      • Kibana
      • Logstash
    • Fluent
    • Grafana
    • Prometheus
  • Uncategorized
  • Admin

Copyright © 2025 NimTechnology.