Secret 을 파드에서 사용중인 상태라면, Secret 이 수정되었을 때 자동으로 파드에 수정된 값이 반영될까? 이는 파드에서 Secret 을 사용하는 방식에 따라 다르다.

방식 시크릿 수정시 반영 방법
환경 변수 파드 재시작
볼륨 마운트 최대 1분(기본값) 이내 자동 반영

환경 변수 방식과 볼륨 마운트 방식에서 Secret 수정을 반영하는 방법을 각각 알아본다.

 

1. 환경 변수 방식

기본적으로 Pod 는 불변 객체로 취급되기 때문에 운영중에 환경 변수를 동적으로 변경할 수 없다. 환경 변수는 파드를 기동할 때에만 설정된다. 따라서, Secret 을 변경 후 파드에 반영하기 위해서는 파드를 삭제 후 재시작 하여야만 한다. Deployment 로 관리하는 경우에는 아래 커맨드로 재시작하면 된다.

$ kubectl rollout restart deployment <디플로이먼트명>

 

 

2. 볼륨 마운트 방식

볼륨 마운트 방식에서는 Secret 변경 후 최대 1분 이내에 변경사항이 파드에 자동 반영된다. 아래 매니페스트로 username 과 password 가 각각 "admin", "adminpassword" 로 설정된 시크릿을 생성 후, 이를 파드에서 볼륨 마운트한 후, 시크릿 내용을 "root", "rootpassword" 로 변경 후 1분 후에 파드의 볼륨을 확인해보자

# 시크릿 매니페스트
apiVersion: v1
kind: Secret
metadata:
  name: sample-db-auth
type: Opaque
data:
  username: YWRtaW4= # admin
  password: YWRtaW5wYXNzd29yZA== # adminpassword
# 파드 매니페스트
apiVersion: v1
kind: Pod
metadata:
  name: sample-secret-multi-volume
spec:
  containers:
    - name: secret-container
      image: nginx:1.27
      volumeMounts:
        - name: config-volume
          mountPath: /config
  volumes:
    - name: config-volume
      secret:
        secretName: sample-db-auth
# 파드 내 볼륨 확인
$ kubectl exec -it sample-secret-multi-volume -- paste /config/password /config/username
adminpassword	admin
# 시크릿 매니페스트 변경
apiVersion: v1
kind: Secret
metadata:
  name: sample-db-auth
type: Opaque
data:
  username: cm9vdA== # root
  password: cm9vdHBhc3N3b3Jk # rootpassword
# 변경된 시크릿 적용
$ kubectl apply -f sample-db-auth.yaml

# 파드에 반영되었는지 확인
$ kubectl exec -it sample-secret-multi-volume -- paste /config/username /config/password
root	rootpassword

 

3. 볼륨 갱신 메커니즘 설명

시크릿을 볼륨으로 파드에 마운트하였을 때는 자동 갱신 되는데, 이는 노드의 kubelet 이 Secret 리소스 수정을 감시하고 있기 때문이다. 감시하는 매커니즘은 아래 세가지 중 하나로 설정할 수 있다.

방식 설명
watch 이벤트 기반(실시간 감시)
ttl 캐시 만료 기반(기본값)
polling 주기적 변경여부 조회

이는 노드 kubelet 전역설정이며, 즉 해당 노드에서 동작하는 모든 파드에 일괄 적용되는 정책이다. 파드나 네임스페이스 단위에서 조정할 수는 없다. 

노드의 /var/lib/kubelet/config.yaml 파일에서 configMapAndSecretChangeDetectionStrategy 항목으로 설정하면 된다.

# watch 방식으로 변경
apiVersion: kubelet.config.k8s.io/v1beta1
...
configMapAndSecretChangeDetectionStrategy: watch
...
# ttl 방식의 캐시 유효시간 30초로 변경
apiVersion: kubelet.config.k8s.io/v1beta1
...
configMapAndSecretChangeDetectionStrategy: ttl
syncFrequency: 30s
...

설정파일 저장 후에는 kubelet 재시작이 필요하다.

 

4. 일반적으로 사용하는 방법

kubelet 의 ttl 시간을 변경하는 것은 보통 k8s 클러스터 관리자의 권한이다. 따라서 개발자의 경우에는 Secret 변경 후 rollout restart 를 하는 방식으로 운영하는게 일반적이다. 이렇게 적용하면 즉시 반영되며 예측 가능하게 된다.

kubectl apply -f <시크릿매니페스트파일명>
kubectl rollout restart deployment <디플로이먼트명>

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,