NetApp 영구 스토리지를 사용하여 컨테이너 애플리케이션 배포
vSphere Kubernetes Service 클러스터에서 NetApp ONTAP 영구 스토리지를 사용하여 컨테이너화된 애플리케이션을 배포합니다. 다음 예제는 NAS(ontap-nas) 또는 SAN iSCSI(ontap-san) 스토리지를 사용하여 PostgreSQL 데이터베이스를 배포하는 방법을 보여줍니다.
다음 YAML 구성은 매니페스트에 POSTGRES_USER/POSTGRES_PASSWORD를 직접 설정합니다. 프로덕션 환경에서는 데이터베이스 자격 증명과 같은 민감한 정보를 관리하기 위해 Kubernetes Secrets를 사용하는 것이 좋습니다.
ontap-nas 드라이버를 사용하여 프로비저닝된 NFS 영구 볼륨을 기반으로 PostgreSQL 컨테이너 애플리케이션을 배포할 수 있습니다. 다음 예제는 PostgreSQL용 PersistentVolumeClaim(PVC) 및 Deployment를 생성하는 방법을 보여줍니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
storageClassName: sc-nas # Specify the StorageClass for dynamic provisioning
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
securityContext:
fsGroup: 999 # Ensures proper permissions for the mounted volume (PostgreSQL default user is 999)
containers:
- name: postgres
image: postgres:15
securityContext:
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 999 # PostgreSQL default user ID
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
env:
- name: POSTGRES_DB
value: "postgres"
- name: POSTGRES_USER
value: "<username>"
- name: POSTGRES_PASSWORD
value: "<password>"
- name: PGDATA
value: "/var/lib/postgresql/data/pgdata"
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-storage
subPath: postgres-data # Ensures data is stored in a subdirectory to avoid permission issues
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
volumes:
- name: postgres-storage
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
selector:
app: postgres
다음 YAML을 사용하여 ontap-san 드라이버로 프로비저닝된 iSCSI 영구 볼륨을 기반으로 하는 PostgreSQL 컨테이너 애플리케이션을 배포합니다. 이 `Recreate`배포 전략은 새 Pod가 시작되기 전에 기존 Pod가 완전히 종료되도록 보장하며, 이는 ReadWriteOnce iSCSI 볼륨에 필수적이며 Pod 재시작 시 데이터 손상을 방지합니다. 이 구성은 Pod 삭제 및 재생성 시에도 데이터 지속성을 지원하며, Trident 볼륨 스냅샷 및 백업과 복원 작업과 호환됩니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-block-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: sc-iscsi # Must map to an ontap-san driver
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-block-app
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
# 1. POD LEVEL SECURITY CONTEXT
securityContext:
runAsNonRoot: true
runAsUser: 999 # Official Postgres image default user ID
runAsGroup: 999 # Official Postgres image default group ID
fsGroup: 999
seccompProfile:
type: RuntimeDefault
containers:
- name: postgres
image: postgres:15
# 2. CONTAINER LEVEL SECURITY CONTEXT
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
env:
- name: POSTGRES_DB
value: "postgres"
- name: POSTGRES_USER
value: "<username>"
- name: POSTGRES_PASSWORD
value: "<password>"
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-block-storage
subPath: postgres-data
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
volumes:
- name: postgres-block-storage
persistentVolumeClaim:
claimName: postgres-block-pvc
---
apiVersion: v1
kind: Service
metadata:
name: postgres-service
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
selector:
app: postgres
데이터베이스 배포 검증
애플리케이션을 배포한 후, 파드가 실행 중인 상태이고 데이터베이스가 정상적으로 작동하는지 확인하십시오. 다음 명령어를 사용하여 파드, PVC 및 서비스의 상태를 확인하십시오. 파드가 실행 중이고 PVC가 적절한 볼륨에 바인딩되었는지 확인하십시오.
kubectl get all -n <namespace>
kubectl get pvc -n <namespace>
사용하는 프로토콜에 따라 백엔드 스토리지는 볼륨, qtree 또는 LUN입니다. ONTAP 시스템에 프로비저닝된 스토리지는 PersistentVolume(PV)을 설명하여 내부 볼륨 이름을 가져온 다음 ONTAP CLI 명령에서 해당 이름을 사용하여 스토리지 세부 정보를 확인함으로써 검증할 수 있습니다. 다음 명령을 사용하여 PV를 설명하고 내부 볼륨 이름을 가져옵니다.
kubectl describe pv/<pv-name>
출력에서 내부 볼륨 이름을 복사하고 다음 명령을 실행하여 ONTAP CLI에서 스토리지 세부 정보를 가져오십시오.
NAS 볼륨의 경우:
volume show -vserver <vserver> -volume <internal-volume-name>
SAN LUN의 경우, ONTAP CLI에서 다음 명령을 실행하여 LUN 세부 정보를 가져오십시오.
lun show -vserver <vserver> -volume <internal-volume-name>
NAS 또는 NAS Economy 스토리지 클래스에서 nconnect 마운트 옵션을 사용한 경우, 워커 노드에서 스토리지 서버로의 활성 TCP 연결 수를 확인할 수 있습니다.
먼저 Trident 백엔드 구성을 나열하여 백엔드 이름을 찾은 다음, 해당 이름을 설명하여 vserver 이름과 데이터 LIF를 가져옵니다.
kubectl get tbc -n trident
kubectl describe tbc <backend-name> -n trident
그런 다음 ONTAP 클러스터에 로그인하고 위 출력의 데이터 LIF를 대체하여 다음 명령을 실행하십시오.
network connections active show -local-address <data-lif> -local-port 2049
Pod가 실행 상태가 되면 데이터베이스에 연결하여 데이터 작업이 제대로 수행되는지 확인합니다.
-
PostgreSQL 서비스 포트를 로컬 시스템으로 포워딩합니다.
kubectl port-forward svc/postgres-service 5432:5432 -n <namespace> -
다른 터미널에서 psql을 사용하여 데이터베이스에 연결합니다.
psql "postgresql://<username>:<password>@127.0.0.1:5432/postgres" -
데이터베이스와 테이블을 생성한 다음, 테이블에 데이터를 입력합니다.
CREATE DATABASE employee;새 데이터베이스로 전환합니다(psql 메타 명령):
\c employee테이블을 생성하고, 행을 삽입하고, 결과를 조회합니다.
CREATE TABLE employees ( id SERIAL PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, department VARCHAR(50), hire_date DATE DEFAULT CURRENT_DATE, salary NUMERIC(10, 2) ); INSERT INTO employees (first_name, last_name, email, department, salary) VALUES ('John', 'Doe', 'john.doe@example.com', 'Engineering', 85000.00); SELECT * FROM employees;
비디오 데모
다음 비디오는 vSphere Kubernetes 클러스터에 Trident를 설치하고 Trident를 사용하여 영구 스토리지로 PostgreSQL 데이터베이스를 배포하는 방법을 보여 줍니다.