[Kubernetes] Cert Manager 알아보기

Joseph's Engineering Blog·2023년 9월 13일
0
post-thumbnail

포스팅 이유

Cert manager를 사용하며 발생한 이슈를 통해 Cert manager에 대해 자세히 알아보고자 함



1. Cert manager란?

Cert Manager는 K8s 내부에서 https 통신을 하기 위한 인증서를 생성하고 자동으로 갱신해주는 역할을 하는 모듈입니다.


1.1 구조

(이미지 출처 : https://picluster.ricsanfre.com/docs/certmanager/ )

전체적인 구조는 다음과 같이 크게 세 개의 Component들로 구성되어 있습니다. 각 Component들을 간단하게 알아보겠습니다.

Issuer

Issuer는 CA와 같은 역할을 K8s에서 합니다. CSR 요청을 받으면 Issuer에 정의한 ca(Self-signed, Private CA, Public CA)를 통해 Certificate에 sign을합니다. 따라서 Cert Manager의 모든 Certificate들은 어떤 Issuer를 통할지 명시되어야 합니다.
Issuer는 namespace에 종속되지 않고 사용할 수 있는 ClusterIssuer와 특정 namespace에 종속되는 Issuer로 나뉩니다.

Certificate

Certificate는 Issuer를 통해 생성된 하나의 인증서라고 생각하면 됩니다. Certificate는 namespace에 종속되고 인증서 정보는 Secret에 저장되어 있습니다. 인증서의 유효기간, 갱신시기, 생성할 secret명 등을 정의할 수 있습니다. 인증서 갱신 시기가 되면 Certificaterequest라는 Component를 생성하여 Issuer를 통해 인증서 갱신을 수행합니다.

Secret(TLS Secret)

K8s의 Secret입니다. Certificate가 관리하며 내부에는 ca인증서를 비롯한 tls 인증서와 키파일을 포함하고 있습니다. ca인증서는 Issuer에 정의된 ca인증서라, 같은 Issuer를 통해 생성된 Certificate의 Secret들은 모두 같은 값을 가집니다. tls인증서와 키는 Certificate별로 생성되어 서로 다른 값을 가지게 됩니다. Pod에 해당 Secret을 mount하여 사용할 수 있습니다.



2. 발생 이슈

구성을 먼저 살펴보겠습니다. Self-signed로 설정한 ClusterIssuer(test-selfsigned)를 통해 Certificate가 self-signed-ca(Secret)를 생성합니다.
이 Certificate(test-ca)는 duration이 8760h0m0s(365일), renewBefore는 720h0m0s(30일)으로 설정되어 있었습니다.

duration과 renewBefore는 Certificate에서 설정할 수 있는 부분으로 duration은 해당 Certificate의 유효기간을 의미하고 renewBefore는 유효기간이 만료되기 얼마 전에 갱신을 할지 설정하는 부분입니다.


생성된 self-signed-ca를 ca로하는 ClusterIssuer(test-issuer)를 통해 K8s 내부의 모듈들이 사용하는 Certificate를이 각 모듈에서 https 통신에 사용할 tls를 Secret으로 생성합니다.


이슈 상황

이렇게 구성되어 있는 환경에서 아주 가끔씩 Opensearch가 Internal Service Error로 접속이 되지 않는다는 문의를 받았습니다. Opensearch server(elasticsearch)쪽 문제로 생각하여 opensearch쪽 파드 로그를 확인해도 문제는 없어보였습니다.

하지만 dashboard(kibana)쪽 ssl 에러 로그가 확인되었습니다.

내부 통신 인증서 문제로 파악하고 Certificate쪽을 다시 확인하니 dashboard-cert와 opensearch-cert쪽 duration과 renewBefore 값을 누락되어 있었습니다. 그 결과 default 값인 duration은 90일 renewBefore값은 30일로 설정되어 있었고 생성 후 60일이 지나 새로운 인증서로 갱신이 되었을것이라 추측했습니다.

Certificaterequest를 조회하니 실제로 갱신 된 이력이 있었고 바뀐 인증서를 사용할 수 있게 파드를 재기동해주니 정상적으로 opensearch 접속이 가능함을 확인할 수 있었습니다.

대책

일단 이 문제에 대한 해결로는 두가지 방법을 생각할 수 있었습니다.

첫번째는 인증서 주기를 1년으로 모두 맞춰주고 secret이 수정되면 Pod를 자동으로 재기동시켜주는 third party를 설치하는 방법입니다.

두번째는 인증서 기간을 10년(혹은 더 길게)으로 설정되도록 duration과 renewBefore값을 수정하는것입니다.

길게 봤을 때는 첫번째 방법이 더 나아보이지만 두번째 방법을 원했기 때문에.. 해당 방법으로 설정하여 마무리하였습니다.

profile
Kubernetes / DevOps / Git / Network / AWS / Terraform / Opensource / Java / Springboot

2개의 댓글

comment-user-thumbnail
2024년 3월 12일

좋은 글 감사합니다. 잘 읽고 가요.

답글 달기
comment-user-thumbnail
2024년 3월 12일

좋은 글 감사합니다. 잘 읽고 가요.

답글 달기