Kubernetes์์ CloudNativePG๋ก PostgreSQL ํด๋ฌ์คํฐ ๊ตฌ์ถ ๋ฐ ๊ด๋ฆฌํ๊ธฐ
EDB ํ
2024๋
10์ 14์ผ
Kubernetes์์ CloudNativePG๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ๊ฐ์ํํ๊ธฐ
์ค๋๋ Kubernetes๋ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์คํ๋ถํฐ ์ต์ โ์๋ฒ๋ฆฌ์คโ API๊น์ง ์์ ํ ์ค์ผ์คํธ๋ ์ด์ ๋ ์์ฝ์์คํ ์ ๋ฐฐํฌํ ์ ์๋ ๋ฒ์ฉ ํ๋ซํผ์ ๋๋ค. Postgres ์ญ์ ์ด๋ฌํ ํ๊ฒฝ์์ ์ง์์ ์ผ๋ก ์งํํ๊ณ ์์ผ๋ฉฐ, Postgres DBA์๊ฒ๋ Kubernetes์ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๊ธฐ์ ์ ๋ํ ์ดํด๊ฐ ์ ์ ์ค์ํด์ง๊ณ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด Kubernetes ํ๊ฒฝ์์ Postgres๋ฅผ ์ค์ ๋ก ์ด๋ป๊ฒ ์ค์นํ๊ณ ์ด์ํ ์ ์์๊น์? ์ด ๊ธ์์๋ CloudNativePG๋ฅผ ์ด์ฉํด Kubernetes์ PostgreSQL ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๊ณ , ์คํ ๋ฆฌ์ง ๊ตฌ์ฑ๋ถํฐ ํด๋ฌ์คํฐ ๋ฐฐํฌ, ์๋น์ค ์ฐ๊ฒฐ ๋ฐ ์ธ๋ถ ์ก์ธ์ค๊น์ง ์ค์ ํ๋ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ด ๋๋ค.
CloudNativePG๋?
Kubernetes์์ Postgres๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๊ด๋ จ๋ ๋ชจ๋ ๋ฆฌ์์ค, ์ฅ์ ์กฐ์น, ์ฐ๊ฒฐ ํ, ๋น๋ฐ ๊ด๋ฆฌ ๋ฑ ๋ค์ํ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ดํ ์ ์๋ ์ด์์๊ฐ ํ์ํฉ๋๋ค. Postgres ์ ๊ณ์ ์ฃผ์ ์ ์ฒด๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ ์ ๊ฐ์ง ์ด์์๋ฅผ ์ ๊ณตํ๋ฉฐ, EDB๋ ์์ธ๋ ์๋๋๋ค. EDB์ CloudNativePG๋ ํ์ฌ ์ ์ผํ โ๋ค์ดํฐ๋ธโ Kubernetes ์ด์์๋ก, Go ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ ์ฌ๋ฌ ๋ค์ดํฐ๋ธ Kubernetes ์ธํฐํ์ด์ค๋ฅผ ํผ์ด ์๋น์ค๋ก ํธ์ถํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ๊ฐ์ ์ ๋๋ค.
EDB๋ 2022๋ 4์ 22์ผ CloudNativePG๋ฅผ ๊ณต์ ๋ฐํํ์ง๋ง, ๊ทธ ์ด์ ๋ถํฐ 1๋ ์ด์ ๊ฐ๋ฐ ์์ ์ด ์งํ๋์์ต๋๋ค. ์ฒซ ๋ฒ์งธ 1.0 ๋ฒ์ ์ 2021๋ 2์ 4์ผ์ ์ถ์๋์์ผ๋ฉฐ, ์ด๋ ํ์ฌ์ ์ ํ ์ด์ ๋จ๊ณ์๋ ํ๋กํ ํ์ ์ด๋ ๊ธฐํ ๋ ์ ์ ์ธ ๋ด๋ถ ์ ํ์ ํฌํจํ์ง ์์ต๋๋ค. ์ฌ์ค, 2020๋ ์ด์๋ ์ด๋ฏธ BDR ์ด์์๋ฅผ ์ ๋ณด์ธ ๋ฐ ์์ต๋๋ค. ๊ฐ๋ธ๋ฆฌ์ ๋ฐ๋ฅดํจ๋ฆฌ๋๋ ์ด๋ฌํ ๊ธด ์ฌ์ ์ ์์ ์ ๋ธ๋ก๊ทธ์์ ์์ธํ ์ค๋ช ํ๋๋ฐ, ๊ทธ ๊ณผ์ ์ ์ ๋ง ๋ค์ฌ๋ค๋ํ๋ ๋ช ๋ ์ ๊ธฐ๋ก์ด๋ผ ํ ์ ์์ต๋๋ค.
์ด ์ ๋์ ๊ฐ๋ฐ ์ญ์ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ฌ์ฉํ๊ธฐ๋ ๊ฝค ์ฌ์ธ ๊ฒ ๊ฐ์ง ์๋์? ํ๋ฒ ์ดํด๋ด ์๋ค.
Kubernetes ํ๊ฒฝ ์ค๋นํ๊ธฐ
๋ฌด์ธ๊ฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง์ ์ฌ์ฉํด ๋ณด๋ ๊ฒ์ ๋๋ค. Kubernetes์ ๋์ ์ธ๊ธฐ ๋๋ถ์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ์ ์ฌ ๋๊ตฌ๋ค์ด ์กด์ฌํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ Docker ์ปจํ ์ด๋์์ ์ ์ฒด Kubernetes ์ธ์คํด์ค๋ฅผ ์คํํ ์ ์๋ kind๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์์ผ๋ก๋ ๋น์ทํ ๋ฐฉ์์ด์ง๋ง ๊ฐ์ ๋จธ์ ๊ธฐ๋ฐ ํ๊ฒฝ์ ์ ํธํ๋ minikube๊ฐ ์์ต๋๋ค. ๋ํ, โ์ง์งโ Kubernetes(k8s)์ ๊ฒฝ๋ํ๋ ๋ฒ์ ์ธ K3s๋ ์ ํ์ง ์ค ํ๋์ ๋๋ค. K3s๋ Kubernetes์ ๊ฑฐ์ ๋์ผํ๊ฒ ๋์ํ์ง๋ง, ๋ ๊ฐ์ํ๋ ์ค์ ์ ์ ๊ณตํฉ๋๋ค.
์์ํ๊ฒ ์คํ ๋ชฉ์ ์ผ๋ก๋ ์์ ๋๊ตฌ๋ค ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํด๋ ์ถฉ๋ถํฉ๋๋ค. ๋ ๋์ ์ ์ด๊ณ ์ค์ ์ ์ธ ๊ฒฝํ์ ์ํ๋ ๋ถ๋ค์๊ฒ๋ K3s๊ฐ ์์ ํ ์๋ํ๋ ํด๋ฌ์คํฐ๋ฅผ ์์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ด ๋ณด๋ค โํ์ค์ ์ธโ Kubernetes ํ๊ฒฝ์ ์ฒดํํ ์ ์๋ ์ข์ ์ ํ์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๊ฒฝํ์ ๋ฌด์์ ํฌํจํ ๊น์?

๋ณต์กํด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์ปจํธ๋กค ํ๋ ์ธ๊ณผ ์์ปค ๋ ธ๋, ์ด ๋ ๊ฐ์ง๋ง ์ ๊ฒฝ ์ฐ๋ฉด ๋ฉ๋๋ค. ์ปจํธ๋กค ํ๋ ์ธ์ ์ผ๋ฐ์ ์ผ๋ก 3~5๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์ปค ๋ ธ๋์ ์ํํ ์์ , ์๋น์ค ๋ฐฐํฌ ์์น, ์ฟผ๋ผ ์ ์ง ๋ฐฉ๋ฒ ๋ฑ์ ์ง์ํฉ๋๋ค. ์ปจํธ๋กค ํ๋ ์ธ์ ์๋๋ค๋ ๊ฒ์ ์ ์ฒด ํด๋ฌ์คํฐ๋ฅผ ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก, ์ด ์์คํ ์ ์์ ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์์ปค ๋ ธ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ค์ ์ ํ๋ฆฌ์ผ์ด์ , ์ปดํจํ , ์คํ ๋ฆฌ์ง ๋ฑ์ ํธ์คํ ๊ณผ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด ์ค ํ๋๋ฅผ ์ค์ ํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ด ๊ธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง๋ง, ๋ธ๋ก๊ทธ, ํํ ๋ฆฌ์ผ, ๋๊ตฌ, YouTube ๋์์ ๋ฑ ์ฐธ๊ณ ์๋ฃ๊ฐ ๋ง์ต๋๋ค. Ansible์ ์ต์ํ ์ฌ์ฉ์๋ผ๋ฉด ํ์คํ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ๊ฒ์ ๋ฐ๋ณต ๋ฐฐํฌํ ์ ์๋ ํ๋ฅญํ ๋๊ตฌ์ธ Kubespray๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์์ ์ธ ๋๊ตฌ๋ก๋ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๋ น์ค ์ ํธ๋ฆฌํฐ์ธ kubectl์ด ์์ต๋๋ค. ๋ํ, ๋ง์ ๊ด๋ฆฌ์๋ค์ด Kubernetes์ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ก Helm์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
์ด์ ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ๊ณ ์คํํ๋ค๋ฉด, ๋ค์ ๋จ๊ณ๋ ๋ฌด์์ผ๊น์?
CloudNativePG ์ค์น์ YAML ๊ตฌ์ฑ
YAML์ Kubernetes์ ํ์ค ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ์ต์ํด์ง๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๊ธ์ ์์ฑํ๋ ์์ ์์ CloudNativePG์ ์ต์ ๋ฒ์ ์ 1.22์ ๋๋ค. ์ค์น ์ง์นจ์ ํด๋น ๋ฒ์ ๊ณผ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์ค๋ช ์์์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ง์นจ์ ์ ๋ขฐํ ์ ์์ต๋๋ค. CloudNativePG๋ฅผ ์ค์นํ๋ ๋ฐ ํ์ํ ๊ฒ์ ๋จ ํ ์ค์ ๋ช ๋ น์ด๋ฟ์ ๋๋ค.
์ด์์๋ฅผ ์ค์นํ๊ณ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
$> kubectl apply -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.22/releases/cnpg-1.22.1.yaml
$> kubectl get deployment -n cnpg-system
NAME READY UP-TO-DATE AVAILABLE AGE
cnpg-controller-manager 1/1 1 1 26h๋ฏฟ๊ธฐ ์ด๋ ต๊ฒ ์ง๋ง, ์ด ์์ ์์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ฐฐํฌํ ํด๋ฌ์คํฐ์ ๋ํ ๊ตฌ์ฑ์ ์์ฑํ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ด๋ ๋ณต์กํ ์์ ์ฒ๋ผ ๋ค๋ฆด ์ ์์ง๋ง, ๋ฌธ์๊ฐ ํฐ ๋์์ ์ค ๊ฒ์ ๋๋ค. ๋ฌธ์์๋ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๋งค๊ฐ๋ณ์์ ๊ตฌ์ฑ ์์, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ต์ ์ ์ ํํ ์ ์๋์ง์ ๋ํ ๊ธฐ๋ฅ ์์ ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์ฝ๊ฐ์ ์ฐฝ์๋ ฅ์ ๋ฐํํ์ต๋๋ค. ๋กฑํผ(Longhorn)์ Kubernetes์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์คํ ๋ฆฌ์ง ํด๋์ค ์ค ํ๋๋ก, ์ฆ๋ถ ๋ฐฑ์ , ์ค๋ ์ท, ๋ธ๋ก ๋ณต์ ๋ฑ ์ต์ ์คํ ๋ฆฌ์ง ๊ด๋ จ ๊ธฐ๋ฅ ๋๋ถ๋ถ์ ์ง์ํ๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ๋๋ค. ๊ทธ๋ฌ๋ CloudNativePG ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์ด๋ฌํ ์ ํ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ณผ๋ฅจ ๋ณต์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋นํ์ฑํํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ๊ฐ๋จํ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์, ํน์ ์ต์
๋ง ๋ณ๊ฒฝ๋ ๋ ๋ฒ์งธ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค. ์ด ์๋ก์ด ์คํ ๋ฆฌ์ง ํด๋์ค ์ ์๋ฅผ ์์ฑํ ํ, kubectl apply -f ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์ ์ฉํ์ต๋๋ค.
apiVersion: v1
kind: ConfigMap
metadata:
name: longhorn-storageclass-1r
namespace: longhorn-system
labels:
app.kubernetes.io/name: longhorn
app.kubernetes.io/instance: longhorn
app.kubernetes.io/version: v1.5.3
data:
storageclass.yaml: |
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: longhorn-1r
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: driver.longhorn.io
allowVolumeExpansion: true
reclaimPolicy: "Delete"
volumeBindingMode: Immediate
parameters:
numberOfReplicas: "1"
staleReplicaTimeout: "30"
fromBackup: ""
fsType: "ext4"
dataLocality: "disabled"ํ์ค Longhorn ์คํ ๋ฆฌ์ง ํด๋์ค ์ ์๋ฅผ ๊ฐ์ ธ์ ์ ํญ๋ชฉ์ผ๋ก ์์ฑ๋๋๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ ๋ค, ๋ณต์ ๋ณธ ์๋ฅผ 1๋ก ์ค์์ต๋๋ค. ์ฆ, ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ด ๋จ ํ๋๋ง ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ๊ฐ Postgres ๋ณต์ ๋ณธ์ ์์ฒด ๋ฐ์ดํฐ ํด๋์ ์ ์ฒด ๋ณต์ฌ๋ณธ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์, ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ์์ผ๋ฉฐ ์คํ๋ ค Postgres์ ์ ๋ง๋ ์ค์ ์ ๋๋ค. ๋ณต์ ๋ณธ ์๋ฅผ ํ์ํ๊ธฐ ์ํด ์ด๋ฆ์ โ1rโ์ ์ถ๊ฐํ๋๋ฐ, ๋๋ฆ๋๋ก ์ฐฝ์์ ์ธ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
Kubernetes์ PostgreSQL ํด๋ฌ์คํฐ ๋ฐฐํฌํ๊ธฐ
์ด์ Kubernetes ํ๊ฒฝ์ Postgres ํด๋ฌ์คํฐ๋ฅผ ์ถ๊ฐํ ์ฐจ๋ก์ ๋๋ค. ์ ์ ํ ๊ท ํ์ ๊ฐ์ถ ์ ์๋ฅผ ๋ง๋ จํ์ผ๋, ์ด๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ์น์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์๋ฌธ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค:
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: test-cnpg-cluster
namespace: cloudnative-pg์ด ํด๋ฌ์คํฐ์ ์ด๋ฆ์ โtest-cnpg-clusterโ๋ก ์ง์ ํ ๊ณํ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก CloudNativePG๋ ํด๋ฌ์คํฐ๋ฅผ โdefaultโ ๋ค์์คํ์ด์ค์ ๋ฐฐํฌํ์ง๋ง, ์ฐ๋ฆฌ๋ ์ข์ Kubernetes ์ฌ์ฉ์๊ฐ ๋๊ธฐ ์ํด ๋ณ๋์ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค. ์ดํ์ ๋ชจ๋ ๋ด์ฉ์ ์ค์ ํด๋ฌ์คํฐ ์ ์์ ๋ํ ์ธ๋ถ ์ฌํญ์ ์ค๋ช ํฉ๋๋ค.
spec:
instances: 3
bootstrap:
initdb:
database: bones
owner: bonesํด๋ฌ์คํฐ ์ ์์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ ํ์ผ์ โspecโ ์น์ ์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค. ์ด๋ฒ์๋ ์ธ ๊ฐ์ ๋ฉค๋ฒ๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋๋ โappโ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ํ๊ณ , ๋์ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํ ๋ค ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค.
๊ทธ๋ค์์ผ๋ก๋ ๋ช ๊ฐ์ง Postgres ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ฝ๊ฐ ์กฐ์ ํ๋ ค๊ณ ํฉ๋๋ค:
postgresql:
parameters:
random_page_cost: "1.1"
log_statement: "ddl"
log_checkpoints: "on"์ฐ๋ฆฌ Kubernetes ํด๋ฌ์คํฐ๋ ๋น ๋ฅด๊ณ ์ฑ๋ฅ ์ข์ SSD ์คํ ๋ฆฌ์ง์ ์ก์ธ์คํ ์ ์์ผ๋ฏ๋ก, ์์ ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ์ค์ด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ๋ํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ๋ ๋ชจ๋ ํธ๋์ญ์ ๊ณผ ํฌ๋ ์ ๋ชฉ์ ์ผ๋ก ํ์ฉํ ์ ์๋ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ก๊น ํ๋ ๊ฒ๋ ์ ์ฉํฉ๋๋ค.
์ด ์น์ ์๋ ๊ฑฐ์ ๋ชจ๋ ์ ํจํ Postgres ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ์ค์ ์ ํด๋ฌ์คํฐ์ ์ ํํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ํฅํ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, ์ด์์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ ๊ฐ ๋ ธ๋์ ๋ค์ ๋ก๋ํ๊ฑฐ๋ ํ์ํ๋ฉด ์ฌ์์์ ์ํํด ๋ณ๊ฒฝ์ ๋ฐ์ํฉ๋๋ค.
affinity:
nodeSelector:
longhorn: "true"๋ ธ๋ ์ ํธ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์คํ ๋ฆฌ์ง๊ฐ ์์นํด์ผ ํ ๋ ธ๋๋ฅผ ์ง์ ํ๋ Kubernetes์ ๋ค์ ๋ณต์กํ ๊ธฐ์ ์ค ํ๋์ ๋๋ค. ์ด๋ฒ์๋ ๋ณต์กํ ๋ถํฌ ์ ๋ต, ๋ฐธ๋ฐ์ค ์ ์, ๋๋ ๊ธฐํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์์กดํ๊ธฐ๋ณด๋ค๋ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ํํ์ต๋๋ค. Kubernetes์์๋ ๊ด๋ฆฌ ๋ชฉ์ ์ผ๋ก ๋ ธ๋์ ๋ค์ํ ํ๊ทธ๋ฅผ ๋ ์ด๋ธ๋ก ์ง์ ํ ์ ์๋๋ฐ, ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํ์ฉํด ๋ชจ๋ ๋ ธ๋๊ฐ Longhorn ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ณดํต ํ์ ์๋น์ค๊ฐ ์๊ตฌ๋๋ ๋ ธ๋๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์ค์ ์ โ๋ฐ์ดํฐ๋ฒ ์ด์คโ๋ฅผ ๋์์ผ๋ก ํ ๊ณํ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Longhorn์ ๋ํด ๋งํ์๋ฉด:
storage:
storageClass: longhorn-1r
size: 100Gi
walStorage:
storageClass: longhorn-1r
size: 20Gi๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ๋์ ์ด ํด๋ฌ์คํฐ๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํน๋ณํ โlonghorn-1rโ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ํ์ต๋๋ค. ๋ํ ๋ชจ๋ ์ ๋ฅํ Postgres DBA๊ฐ ๊ทธ๋ ๋ฏ, ๋ฐ์ดํฐ์ WAL(Write-Ahead Logging) ํ ๋น์ ๋ถ๋ฆฌํ์ต๋๋ค.
์ด์ ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
kubectl create namespace cloudnative-pg
kubectl apply -f test-cnpg-cluster.yamlํด๋ฌ์คํฐ๋ 1~2๋ถ ์ด๋ด์ ๊ฐ๋๋๊ณ ์คํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋จํ์ฃ ? ์ฝ 30์ค์ YAML๊ณผ ๋ ๊ฐ์ ๋ช ๋ น์ด๋ง์ผ๋ก 3๊ฐ์ ๋ ธ๋์ ๋ถ์ฐ๋ ์์ ํ ๋ด๊ฒฐํจ์ฑ(Fault Tolerance)๊ณผ ๊ณ ๊ฐ์ฉ์ฑ(High Availability)์ ๊ฐ์ถ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ณผ์ ์ 5๋ถ๋ ์ฑ ๊ฑธ๋ฆฌ์ง ์์ ์๋ฃํ ์ ์์ต๋๋ค! ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋งํผ ๊ฐ๋จํ๊ฒ ํด๋ณด์ธ์.
CloudNativePG PostgreSQL ํด๋ฌ์คํฐ์ ์ก์ธ์คํ๊ธฐ
ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ๊ณผ ์ค์ ๋ก ํด๋ฌ์คํฐ์ ์ก์ธ์คํ๋ ๊ฒ์ ์์ ํ ๋ณ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. CloudNativePG๋ ๊ฐ ํด๋ฌ์คํฐ์ ๋ํด ํด๋ฌ์คํฐ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ ๊ฐ์ง ์๋น์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
test-cnpg-cluster-rw: ํญ์ ๊ธฐ๋ณธ(primary) ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.test-cnpg-cluster-ro: ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ์ ํ๋ ๋ณต์ (replica) ๋ ธ๋๋ง ๊ฐ๋ฆฌํต๋๋ค.test-cnpg-cluster-r: ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
Kubernetes๋ ์์ฒด DNS๋ฅผ ํตํด ์ด๋ฌํ ๋ณ์นญ์ ๋ผ์ฐํ
ํ๊ธฐ ๋๋ฌธ์, ์ด ์ด๋ฆ๋ค์ ์ฌ์ฉํด ์ํ๋ ๋๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ด ํด๋ฌ์คํฐ์ ๋์ผํ ๋ค์์คํ์ด์ค์ ์์ง ์์ ๊ฒฝ์ฐ, ๋ค์์คํ์ด์ค๋ฅผ FQDN์ฒ๋ผ ์ทจ๊ธํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์ cloudnative-pg ๋ค์์คํ์ด์ค์ ๊ธฐ๋ณธ ๋
ธ๋์ ์ฐ๊ฒฐํ๋ ค๋ฉด test-cnpg-cluster-rw.cloudnative-pg๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ฐ๊ฒฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ง์ฝ Kubernetes ์ธ๋ถ์ ๋ ๊ฑฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๊ฑฐ๋ ์ง์ ์ฐ๊ฒฐํด์ผ ํ๋ ์ํฉ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? Kubernetes์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. CloudNativePG ๋ฌธ์์์๋ Postgres ์๋น์ค๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์น์ ์ด ์์ผ๋ฉฐ, Kubernetes๊ฐ ์ธ๋ถ ์ก์ธ์ค๋ฅผ ์ ์ ํ ์๋น์ค๋ก ๋ผ์ฐํ ํ๋๋ก ์ธ๊ทธ๋ ์ค(Ingress) ๋ฐฉ๋ฒ์ ์ ์ํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
์ด ์์
์ ingress-nginx, Traefik, MetalLB ๋๋ ๋ค๋ฅธ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์ธ๊ทธ๋ ์ค ๋ ์ด์ด๋ฅผ ํตํด ์ํํ ์ ์์ต๋๋ค. ํ ํ๊ฒฝ์์๋ ์ด ์ค ํ๋ ์ด์์ด ์ค์น๋์ด ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ์ฐ๋ฆฌ๋ ๋ด๋ถ ์๋น์ค์ ๊ณ ์ IP๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก MetalLB๋ฅผ ์ ํํ์ต๋๋ค. ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ kubectl ๋ช
๋ น์ด ํ๋๋ก ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค:
kubectl -n cloudnative-pg expose service test-cnpg-cluster-rw \
--name=test-cnpg-bones-lb --port=5432 --type=LoadBalancer์ด ๋ช
๋ น์ด์ ์ฅ์ ์ Kubernetes๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐ๋ก ์ง์ ํ๊ฑฐ๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ํธํ๋๋ LoadBalancer ์ ํ๋ง ์๋ค๋ฉด ๊ธฐ๋ณธ ํด๋ฌ์คํฐ ์๋น์ค๋ฅผ ์ธ๋ถ๋ก ๋
ธ์ถํ๊ณ IP๋ฅผ ํ ๋นํฉ๋๋ค. ์ด ๋ช
๋ น์ผ๋ก ์์ฑ๋ ์๋น์ค ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
NAME TYPE EXTERNAL-IP PORT(S)
test-cnpg-bones-lb LoadBalancer 10.0.5.101 5432:32631/TCP
Test-cnpg-cluster-r ClusterIP <none> 5432/TCP
test-cnpg-cluster-ro ClusterIP <none> 5432/TCP
test-cnpg-cluster-rw ClusterIP <none> 5432/TCP์ด๋ฆ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ๋๊ณ IP ์ฃผ์์ ์ฐ๊ฒฐ๋ ์๋ก์ด ์๋น์ค๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ ์ด ์๋น์ค๋ฅผ ํตํด ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ ์ ์์ง๋ง, ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋น๋ฐ๋ฒํธ๋ ๋ฌด์์ธ๊ฐ์?
CloudNativePG ๋น๋ฐ๋ฒํธ ํ์ธ ๋ฐ PostgreSQL ์ฐ๊ฒฐ
CloudNativePG๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ์ฌ Kubernetes์ ์ํฌ๋ฆฟ(Secret)์ ์ ์ฅํฉ๋๋ค. ํด๋น ๋น๋ฐ๋ฒํธ๋ ์์ ์๋ง ์ก์ธ์คํ ์ ์๋๋ก ๋ณดํธ๋๋ฉฐ, ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
ํด๋ฌ์คํฐ์ Rancher์ ๊ฐ์ ํ๋ก ํธ์๋ ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ์๋ค๋ฉด, ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฝ๊ฒ ์ํฌ๋ฆฟ์ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด kubectl ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ํ์ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
$> kubectl -n cloudnative-pg get secret
NAME TYPE DATA AGE
test-cnpg-cluster-app kubernetes.io/basic-auth 9 71m
test-cnpg-cluster-ca Opaque 2 71m
test-cnpg-cluster-replication kubernetes.io/tls 2 71m
test-cnpg-cluster-server kubernetes.io/tls 2 71m์ธ์ฆ์ ๊ด๋ จ ํญ๋ชฉ์ ์ ์ธํ๊ณ , test-cnpg-cluster-app ์ํฌ๋ฆฟ์ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ญ์์ค:
kubectl get secret test-cnpg-cluster-app \
-o=jsonpath='{.data.password}' | base64 -d์ป์ ๋น๋ฐ๋ฒํธ๋ฅผ PGPASSWORD ํ๊ฒฝ ๋ณ์๋ก ๋ด๋ณด๋ด๊ฑฐ๋, psql ๋๋ pgAdmin์ ๋น๋ฐ๋ฒํธ ํ๋กฌํํธ์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ์ด์ ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํ ์ค๋น๊ฐ ๋์์ต๋๋ค:
$> export PGPASSWORD=<snip>
$> psql -h 10.0.5.101 -U bones -d bones
psql (16.2 (Ubuntu 16.2-1.pgdg22.04+1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
bones=>์ฑ๊ณต!
CloudNativePG๋ก Kubernetes์ Postgres ๊ด๋ฆฌ ๊ฐ์ํํ๊ธฐ
๋ค๋ฃฐ ์ ์๋ ์ฃผ์ ๋ ์ฌ์ ํ ๋ง์ง๋ง, ์ด ๊ธ์์ ๋ง๋ฌด๋ฆฌํ๋ ค ํฉ๋๋ค. CloudNativePG๋ ํ์ฌ ํด๋ฌ์คํฐ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด Patroni์ ์์กดํ์ง ์๋ ์ ์ผํ Kubernetes ์ด์์์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฅ์ ์กฐ์น ๊ด๋ฆฌ, ํผ์์คํดํธ ๋ณผ๋ฅจ ํด๋ ์ ํ๋ก๋น์ ๋, ์์คํ ์ค๋ ์ท ์ฒ๋ฆฌ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ด์์ ์์ค์์๋ง ํ์ฉํ ์ ์๋ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ง์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋ธ๋ฆฌ์๊ณผ ๊ทธ์ ํ์ ์ง๋ 5๋ ๊ฐ ๋ฉ์ถ์ง ์๊ณ ํ์ ์ ์ด์ด์์ผ๋ฉฐ, EDB๊ฐ Postgres์ Kubernetes๋ฅผ ๊ฒฐํฉํ๋ ๋ฐ ์ ๋ ํ ์ ์๋๋ก ํฐ ๊ธฐ์ฌ๋ฅผ ํ๊ณ ์์ต๋๋ค.
์ด ๊ธ์ ํตํด Kubernetes์ CloudNativePG์ ๋ํ ์ฌ์ ์ง์์ด ๊ฑฐ์ ์๋ ์ํ์์ ์ ์ฒด ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๊ณ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ๊น์ง ๋ฐฐ์ธ ์ ์์์ต๋๋ค. ์ด์ ๋ค์ ๋จ๊ณ๋ cnpg kubectl ํ๋ฌ๊ทธ์ธ์ ์ค์นํด Postgres ํด๋ฌ์คํฐ ๊ด๋ฆฌ ์์ ์ ํ์ธต ๋ ๊ฐ์ํํ๋ ๊ฒ์ ๋๋ค.
DBA๋ก์ ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋๋์ง ์์์ผ๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๋ ์์ฝ์์คํ ์ ์ง์์ ์ผ๋ก ๋ณํํ๊ณ ์์ต๋๋ค. ๋ณต์กํ๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, Kubernetes๋ ์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ํํ๋ ๋ง์ ์์ ์ ์๋นํ ๋จ์ํํฉ๋๋ค. ๋ ์ด์ ๋ณต์กํ HA ์คํ์ ๊ตฌ์ฑํ๊ฑฐ๋ ์ฟผ๋ผ, ํ์ฑ ๊ท์น, ํฌํผ ์คํฌ๋ฆฝํธ, ๋ผ์ฐํ ๋ฑ์ ๋ชจ๋ ๋ ธ๋์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉํ๊ธฐ ์ํด ์ ์ธ ํ์๊ฐ ์์ต๋๋ค. ์ด์ ๋ ๊ฐ๋ณ ๋ ธ๋์ ์จ๋ฆํ์ง ์๊ณ ๋, ํด๋ฌ์คํฐ๋ฅผ ํด๋ฌ์คํฐ๋ก์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๋ฌผ๋ก Kubernetes๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ํนํ CloudNativePG์ ๊ด๋ จ๋ ๊ธฐ๋ณธ ์ธํ๋ผ๋ฅผ ์ถฉ๋ถํ ์ดํดํ๋ ๊ฒ์ ์ฌ์ ํ ์ค์ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๊ณต์ ๋ฌธ์๋ฅผ ํ์ฉํ๊ฑฐ๋ ์ธํฐ๋ท์์ ์์ญ ๊ฐ์ Kubernetes ๋ธ๋ก๊ทธ, ํํ ๋ฆฌ์ผ, YouTube ๋์์์ ์ฐธ๊ณ ํ ์ ์์ต๋๋ค. ํ์ํ ์ ๋ณด๋ฅผ ์ฐพ๊ณ ์ ๋ ธ๋ ฅํ๋ค๋ฉด ์ถฉ๋ถํ ์๋ฃ๋ฅผ ์ป์ ์ ์์ ๊ฒ์ ๋๋ค.
ํ์ฌ๋ก์ Postgres์ ๋ฏธ๋๋ ๋น ๋ฅด๊ฒ ๋ค๊ฐ์ค๊ณ ์์ผ๋ฉฐ, EDB๋ ์ด๋ฅผ ์คํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๊ณ ์์ต๋๋ค. CloudNativePG์ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฐ ์ญ์ฌ๋ฅผ ์์ธํ ๋ค๋ฃฌ ํต์ฐฐ๋ ฅ ์๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ํตํด ๊ทธ ์ฌ์ ์ ์ดํด๋ณด์ธ์. ์ด๋ ๊ฒ ํ๋ถํ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ๋งํผ, ์ค์ ์ฌ์ฉ๋ฒ๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์ธํ ์์๋ณด์ธ์!
CloudNativePG FAQ
CloudNativePG๋ ๋ฌด์์ธ๊ฐ์?
CloudNativePG๋ Kubernetes์์ Postgres ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๊ธฐ ์ํ ์ด์์์ ๋๋ค. Go ์ธ์ด๋ก ์์ฑ๋์์ผ๋ฉฐ Kubernetes ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ํด๋ฌ์คํฐ ๋ฐฐํฌ์ ์ด์์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Kubernetes์์ CloudNativePG๋ ์ด๋ป๊ฒ ์ค์นํ๋์?
๋ณธ๋ฌธ์ CloudNativePG 1.22 ์์ ์์๋ kubectl apply ๋ช
๋ น์ด๋ก ์ด์์๋ฅผ ์ค์นํฉ๋๋ค. ์ค์น ํ kubectl get deployment -n cnpg-system ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด cnpg-controller-manager์ ๋ฐฐํฌ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
CloudNativePG์์ PostgreSQL ํด๋ฌ์คํฐ๋ ์ด๋ป๊ฒ ์์ฑํ๋์?
Cluster ๋ฆฌ์์ค๋ฅผ ์ ์ํ๋ YAML ํ์ผ์ ์ธ์คํด์ค ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์์ ์, PostgreSQL ๋งค๊ฐ๋ณ์, ์คํ ๋ฆฌ์ง ๋ฑ์ ์ค์ ์ ์์ฑํ ๋ค kubectl apply ๋ช
๋ น์ด๋ก ์ ์ฉํ ์ ์์ต๋๋ค. ๋ณธ๋ฌธ์ ์์ ์์๋ 3๊ฐ์ ์ธ์คํด์ค๋ก ๊ตฌ์ฑ๋ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค.
CloudNativePG์ rw, ro, r ์๋น์ค๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์?
๋ณธ๋ฌธ์ ์์ ์์ -rw ์๋น์ค๋ ํญ์ ๊ธฐ๋ณธ(primary) ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ , -ro ์๋น์ค๋ ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ๋ณต์ (replica) ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. -r ์๋น์ค๋ ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
CloudNativePG๊ฐ ์๋ ์์ฑํ PostgreSQL ๋น๋ฐ๋ฒํธ๋ ์ด๋ป๊ฒ ํ์ธํ๋์?
๋น๋ฐ๋ฒํธ๋ฅผ ์ง์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ CloudNativePG๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํด Kubernetes Secret์ ์ ์ฅํฉ๋๋ค. kubectl๋ก ํด๋น Secret์ ์กฐํํ ๋ค jsonpath์ base64 -d๋ฅผ ์ฌ์ฉํด ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ณธ๋ฌธ: CloudNativePG Tutorial: Manage Multiple Cloud-Native Databases
EDB ์์ ๊ธฐ์ ๋ฌธ์: 02-501-5113
์ด๋ฉ์ผ: salesinquiry@enterprisedb.com