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"
출처: 문서