인스턴스 파드 구성
Cluster 리소스의 spec에서 인스턴스 파드가 어떻게 구성되는지 살펴볼게요. 프로젝티드 볼륨, 임시 볼륨, ServiceAccount 토큰, 환경 변수 설정 방법을 차례로 알아봐요.
출처: 문서
본문
프로젝티드 볼륨(Projected volumes)
CloudNativePG는 .spec.projectedVolumeTemplate을 통해 Postgres 파드 안에 커스텀 파일을 마운트하는 것을 지원해요. 이 기능은 추가 데이터 파일이 필요한 여러 Postgres 기능과 확장에 유용해요. CloudNativePG에서 .spec.projectedVolumeTemplate 필드는 Kubernetes의 프로젝티드 볼륨 템플릿으로, Postgres 파드의 /projected 폴더 아래에 임의의 데이터를 마운트할 수 있게 해줘요.
이 간단한 예시는 기존 TLS 시크릿(이름이 sample-secret)을 파일로 Postgres 파드에 마운트하는 방법을 보여줘요. sample-secret에 있는 시크릿 키 tls.crt와 tls.key의 값들이 Postgres 파드의 /projected/certificate/tls.crt와 /projected/certificate/tls.key 경로에 파일로 마운트돼요.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example-projected-volumes
spec:
instances: 3
projectedVolumeTemplate:
sources:
- secret:
name: sample-secret
items:
- key: tls.crt
path: certificate/tls.crt
- key: tls.key
path: certificate/tls.key
storage:
size: 1Gi
프로젝티드 볼륨 템플릿을 사용해 시크릿과 ConfigMap을 마운트하는 완전한 예시는 cluster-example-projected-volume.yaml 배포 매니페스트에서 찾을 수 있어요.
임시 볼륨(Ephemeral volumes)
CloudNativePG는 내부 활동의 일부에 임시 볼륨을 사용해요. 임시 볼륨은 파드의 수명 동안만 존재하며, 파드 재시작 시에도 유지되지 않아요.
임시 스토리지를 위한 볼륨 클레임 템플릿
오퍼레이터는 기본적으로 emptyDir 볼륨을 사용하는데, 이는 .spec.ephemeralVolumesSizeLimit 필드를 사용해 커스터마이즈할 수 있어요. .spec.ephemeralVolumeSource 필드에 볼륨 클레임 템플릿을 지정하면 이를 오버라이드할 수도 있어요.
다음 예시에서는 1Gi 임시 볼륨이 설정돼요.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example-ephemeral-volume-source
spec:
instances: 3
ephemeralVolumeSource:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
# example storageClassName, replace with one existing in your Kubernetes cluster
storageClassName: "scratch-storage-class"
resources:
requests:
storage: 1Gi
.spec.emphemeralVolumeSource와 .spec.ephemeralVolumesSizeLimit.temporaryData는 동시에 지정할 수 없어요.
공유 메모리용 볼륨
이 볼륨은 Postgres의 공유 메모리 공간으로 사용되며, 임시 타입이지만 메모리에 저장돼요. 클러스터 spec의 .spec.ephemeralVolumesSizeLimit.shm 필드를 사용해 크기의 상한을 구성할 수 있어요. 이 필드는 PostgreSQL이 posix 공유 메모리 동적 할당으로 실행되는 경우에만 사용하세요.
ServiceAccount 토큰 마운트
클러스터 spec의 automountServiceAccountToken 필드는 인스턴스 파드와 오퍼레이터가 실행하는 Job에서 ServiceAccount 토큰의 자동 마운트를 제어해요. 이를 false로 설정하면 강화된 환경에서 시행되는 허용 정책을 준수하는 데 도움이 되는데, 이때 오퍼레이터는 인스턴스 매니저가 계속 동작할 수 있도록 동등한 프로젝티드 볼륨을 마운트해요. 자세한 내용은 "Disabling the automatic mount of the ServiceAccount token"을 참고해 주세요.
환경 변수
:::important
오퍼레이터 사용을 위해 예약된 환경 변수(PG 또는 CNPG_로 시작하는 이름, 그리고 POD_NAME, NAMESPACE, CLUSTER_NAME)는 env와 envFrom 필드를 통해 설정할 수 없으며 허용(admission) 시점에 거부돼요.
:::
환경 변수를 사용해 일부 시스템 동작을 커스터마이즈할 수 있어요. 한 예로 LDAPCONF 변수는 커스텀 LDAP 구성 파일을 가리킬 수 있어요. 또 다른 예로 TZ 환경 변수는 PostgreSQL 컨테이너가 사용하는 시간대를 나타내요.
CloudNativePG는 클러스터 spec의 env와 envFrom stanza를 사용해 커스텀 환경 변수를 설정할 수 있게 해줘요.
이 예시는 Australia/Sydney 시간대를 클러스터 레벨 기본 시간대로 사용하는 PostgreSQL 클러스터를 정의해요:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
env:
- name: TZ
value: Australia/Sydney
storage:
size: 1Gi
envFrom stanza는 ConfigMap이나 시크릿을 참조해 그 내용을 환경 변수로 사용할 수 있어요:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
envFrom:
- configMapRef:
name: config-map-name
- secretRef:
name: secret-name
storage:
size: 1Gi
오퍼레이터는 다음 환경 변수의 설정을 허용하지 않아요:
POD_NAMENAMESPACE- 이름이
PG로 시작하는 모든 환경 변수.
env 또는 envFrom 섹션의 변경은 PostgreSQL 파드의 롤링 업데이트를 트리거해요.
env 또는 envFrom 섹션이 시크릿이나 ConfigMap을 참조하는 경우, 오퍼레이터는 그 변경을 감지하지 못하고 롤아웃을 트리거하지 않아요. kubelet도 파드에 대해 같은 동작을 하므로, 파드 롤아웃을 수동으로 트리거해야 해요.