Skip to main content
NetApp container solutions
본 한국어 번역은 사용자 편의를 위해 제공되는 기계 번역입니다. 영어 버전과 한국어 버전이 서로 어긋나는 경우에는 언제나 영어 버전이 우선합니다.

NetApp 영구 스토리지를 사용하여 컨테이너 애플리케이션 배포

기여자 banum-netapp

vSphere Kubernetes Service 클러스터에서 NetApp ONTAP 영구 스토리지를 사용하여 컨테이너화된 애플리케이션을 배포합니다. 다음 예제는 NAS(ontap-nas) 또는 SAN iSCSI(ontap-san) 스토리지를 사용하여 PostgreSQL 데이터베이스를 배포하는 방법을 보여줍니다.

다음 YAML 구성은 매니페스트에 POSTGRES_USER/POSTGRES_PASSWORD를 직접 설정합니다. 프로덕션 환경에서는 데이터베이스 자격 증명과 같은 민감한 정보를 관리하기 위해 Kubernetes Secrets를 사용하는 것이 좋습니다.

NAS 스토리지를 사용하여 PostgreSQL 배포(ontap-nas 드라이버)

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
SAN 스토리지를 사용하여 PostgreSQL 배포(ontap-san iSCSI 드라이버)

다음 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>
NAS 볼륨의 내부 볼륨 이름
그림 1. 예시 보기
SAN LUN의 내부 볼륨 이름

출력에서 내부 볼륨 이름을 복사하고 다음 명령을 실행하여 ONTAP CLI에서 스토리지 세부 정보를 가져오십시오.

NAS 볼륨의 경우:

volume show -vserver <vserver> -volume <internal-volume-name>
NAS 볼륨에 대한 ONTAP CLI 출력

SAN LUN의 경우, ONTAP CLI에서 다음 명령을 실행하여 LUN 세부 정보를 가져오십시오.

lun show -vserver <vserver> -volume <internal-volume-name>
ONTAP CLI의 SAN LUN 출력

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
활성 연결에 대한 ONTAP CLI 출력
그림 2. 예시 보기

Pod가 실행 상태가 되면 데이터베이스에 연결하여 데이터 작업이 제대로 수행되는지 확인합니다.

단계
  1. PostgreSQL 서비스 포트를 로컬 시스템으로 포워딩합니다.

    kubectl port-forward svc/postgres-service 5432:5432 -n <namespace>
  2. 다른 터미널에서 psql을 사용하여 데이터베이스에 연결합니다.

    psql "postgresql://<username>:<password>@127.0.0.1:5432/postgres"
  3. 데이터베이스와 테이블을 생성한 다음, 테이블에 데이터를 입력합니다.

    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 데이터베이스를 배포하는 방법을 보여 줍니다.

Trident를 사용하여 ONTAP 영구 스토리지로 워크로드 배포