cert-manager를 사용한 Vault Agent Injector TLS

cert-manager를 사용한 Vault Agent Injector TLS

다음 지침은 Vault Agent Injector가 cert-manager가 생성한 인증서를 사용하도록 구성하는 방법을 보여줍니다. 이를 통해 Kubernetes 클러스터에서 Vault Agent Injector의 여러 복제본을 실행할 수 있습니다.

본문

전제 조건

cert-manager가 아직 설치되지 않았다면 설치합니다(cert-manager 문서 참고). 예를 들어 helm으로:

$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true

인증 기관(CA) 만들기

이 예시에서는 자체 서명 CA Issuer를 부트스트래핑합니다. 클러스터에 이미 ClusterIssuer가 구성되어 있다면 이 단계를 건너뛸 수 있습니다.

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: selfsigned
spec:
  selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: injector-selfsigned-ca
spec:
  isCA: true
  commonName: Agent Inject CA
  secretName: injector-ca-secret
  duration: 87660h  # 10 years
  privateKey:
    algorithm: ECDSA
    size: 256
  issuerRef:
    name: selfsigned
    kind: Issuer
    group: cert-manager.io
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: injector-ca-issuer
spec:
  ca:
    secretName: injector-ca-secret

이것을 ca-issuer.yaml 파일에 저장하고 Kubernetes 클러스터에 적용합니다.

$ kubectl apply -n vault -f ca-issuer.yaml
issuer.cert-manager.io/selfsigned created
certificate.cert-manager.io/injector-selfsigned-ca created
issuer.cert-manager.io/injector-ca-issuer created

$ kubectl -n vault get issuers -o wide
NAME                 READY   STATUS                AGE
injector-ca-issuer   True    Signing CA verified   7s
selfsigned           True                          7s

$ kubectl -n vault get certificates injector-selfsigned-ca -o wide
NAME                     READY   SECRET               ISSUER       STATUS                                          AGE
injector-selfsigned-ca   True    injector-ca-secret   selfsigned   Certificate is up to date and has not expired   32s

Vault Agent Injector 인증서 만들기

다음으로 cert-manager가 위의 CA가 서명한 인증서와 키를 생성하도록 요청할 수 있습니다. 이 인증서와 키는 Vault Agent Injector가 Kubernetes API와의 TLS 통신에 사용합니다.

Certificate 요청 개체는 위에서 만든 CA Issuer를 참조하고, cert-manager가 CA, 인증서, 키를 저장할 Secret의 이름을 지정합니다.

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: injector-certificate
spec:
  secretName: injector-tls
  duration: 24h
  renewBefore: 144m  # roughly 10% of 24h
  dnsNames:
  - vault-agent-injector-svc
  - vault-agent-injector-svc.vault
  - vault-agent-injector-svc.vault.svc
  issuerRef:
    name: injector-ca-issuer
  commonName: Agent Inject Cert

중요 참고: 인증서의 dnsNames는 Vault Agent Injector Kubernetes 서비스와 배포된 네임스페이스의 이름을 사용하도록 구성해야 합니다. 이 예시에서 Vault Agent Injector 서비스 이름은 vault 네임스페이스의 vault-agent-injector-svc입니다. <k8s 서비스 이름>.<k8s 네임스페이스>.svc 패턴을 사용합니다.

Certificate YAML을 파일에 저장하고 클러스터에 적용합니다.

$ kubectl -n vault apply -f injector-certificate.yaml
certificate.cert-manager.io/injector-certificate created

$ kubectl -n vault get certificates injector-certificate -o wide
NAME                   READY   SECRET         ISSUER               STATUS                                          AGE
injector-certificate   True    injector-tls   injector-ca-issuer   Certificate is up to date and has not expired   41s

$ kubectl -n vault get secret injector-tls
NAME           TYPE                DATA   AGE
injector-tls   kubernetes.io/tls   3      6m59s

구성 (Configuration)

이제 인증 기관과 서명된 인증서를 만들었으니 Helm과 Vault Agent Injector가 이를 사용하도록 구성할 수 있습니다.

다음 사용자 지정 값으로 Vault Agent Injector를 설치합니다.

$ helm install vault hashicorp/vault \
  --namespace=vault \
  --set injector.replicas=2 \
  --set injector.leaderElector.enabled=false \
  --set injector.certs.secretName=injector-tls \
  --set injector.webhook.annotations="cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/injector-certificate"

출처: 문서

더 알아보기 (Learn more)