웹사이트 검색

GKE의 Cloud SQL 프록시 - 전체 가이드


안녕하세요, 독자 여러분! 이 문서에서는 실용적인 데모와 함께 GKE의 Cloud SQL 프록시 설정에 대해 설명합니다.

자, 시작하겠습니다! 😊

Cloud SQL 프록시의 장점

애플리케이션이 포장된 현대화 방식으로 이동함에 따라 애플리케이션 구성 요소는 이제 Google, Azure, Amazon 등과 같은 퍼블릭 클라우드 환경에서 리소스를 호스팅하도록 이동하고 있습니다.

데이터베이스, 캐시 스토리지와 같은 중요한 구성 요소는 이제 현대화를 향한 길을 닦았습니다.

현재 대부분의 애플리케이션은 탄소 발자국을 최적화하고 줄이기 위해 컨테이너화되고 있습니다.

이 시나리오를 보면 컨테이너로 호스팅되는 애플리케이션과 클라우드 데이터베이스 인스턴스 간에 연결을 형성하는 방법 또는 경로가 있어야 합니다.

마찬가지로 Cloud SQL 프록시가 등장합니다.

Cloud SQL 프록시를 사용하면 컨테이너화된 애플리케이션과 클라우드 데이터베이스 인스턴스 간의 연결을 시작할 수 있습니다.

인스턴스의 비공개 IP 주소를 사용하여 연결할 수도 있지만 아래의 장점은 애플리케이션을 클라우드 데이터베이스 인스턴스에 연결하는 방법으로 Cloud SQL 프록시를 사용하는 경향이 있습니다.

  • 보안 연결 설정 - Cloud SQL 프록시는 데이터베이스 인스턴스에서 들어오고 나가는 트래픽을 암호화하여 보안 연결을 지원합니다.
  • IAM 기반 데이터베이스 인증 - 서비스 계정/워크로드 ID를 사용하여 인증을 활성화하고 IAM을 통해 액세스를 복제합니다.

실용적인 구현 – GKE에서 Cloud SQL 프록시를 컨테이너/포드로 설정

아래는 클라우드 SQL 프록시 포드를 구축하기 위한 전제 조건 목록입니다.

  • kubectl 도구가 설치된 완전한 Google Kubernetes Engine 클러스터
  • 비공개 IP를 통해 연결을 사용하려는 경우 Cloud SQL 프록시와 데이터베이스 인스턴스가 동일한 VPC 네트워크를 공유하는지 확인해야 합니다.
  • Cloud SQL 인스턴스(MYSQL, PostgreSQL, SQL Server)
  • PostgreSQL 인스턴스의 계정. GKE 클러스터 내에서 실행되는 애플리케이션은 이러한 계정 사용자 인증 정보를 사용하여 데이터베이스에 연결합니다.

1단계: 데이터베이스 구성으로 비밀 만들기

클러스터에서 실행되는 애플리케이션의 경우 클라우드 SQL 프록시를 사이드카로 구성합니다. 이 시나리오에서 애플리케이션은 프록시 자체를 통해 데이터베이스 인스턴스와 통신합니다.

따라서 사용자 지정 데이터베이스에 연결하려면 응용 프로그램 컨테이너에 데이터베이스 구성 값을 채워야 합니다.

그렇게 하려면 아래와 같이 애플리케이션 컨테이너가 공유하는 동일한 네임스페이스에 시크릿을 생성해야 합니다.

kubectl create secret generic <YOUR-DB-SECRET> \
  --from-literal=username=<YOUR-DATABASE-USER> \
  --from-literal=password=<YOUR-DATABASE-PASSWORD> \
  --from-literal=database=<YOUR-DATABASE-NAME>

2단계: Cloud SQL 인스턴스 구성 값 가져오기

애플리케이션을 데이터베이스 인스턴스에 연결하려면 Cloud SQL 프록시를 VM 또는 컨테이너(사이드카)로 설정해야 합니다. 이를 위해 Cloud SQL 인스턴스에 대한 아래 정보가 필요합니다.

  • 인스턴스 연결 이름
  • GKE 클러스터가 있는 프로젝트에서 Cloud SQL Admin API 사용 설정
  • Cloud SQL 인스턴스 리소스를 보유한 Google 프로젝트에 필요한 권한이 있는 서비스 계정의 JSON 키(자격 증명) 파일

3단계: GKE에 포함하기 위해 Cloud SQL 프록시에 사용되는 서비스 계정 생성

GKE 클러스터 내에서 Cloud SQL 프록시 인스턴스를 실행하려면 서비스 계정을 만들고 필요한 권한을 부여해야 합니다.

보다 안전한 경험과 전환을 위해 별도의 애플리케이션에 별도의 서비스 계정을 사용하는 것이 좋습니다.

서비스 계정 요구 사항-

  1. Cloud SQL 인스턴스를 실행하는 동일한 프로젝트에서 만들어야 합니다.
  2. 적어도 Cloud SQL 클라이언트 IAM 역할이 부여되어야 합니다.
  3. 연결을 위해 비공개 IP를 사용하는 경우 Cloud SQL 인스턴스와 GKE는 동일한 VPC 네트워크를 공유해야 합니다.

서비스 계정을 만든 후에는 서비스 계정의 키를 보안 비밀의 볼륨으로 Cloud SQL 프록시 컨테이너에 마운트해야 합니다.

아래 예시를 통해 이해해 봅시다!

gcloud 명령어를 사용하여 사용자 인증 정보 키 파일을 만듭니다.

gcloud iam service-accounts keys create ~/key.json \

--iam-account=YOUR-SA-NAME@project-id.iam.gserviceaccount.com

자격 증명 파일에서 k8 비밀 만들기 -

kubectl create secret generic YOUR-SA-SECRET \

--from-file=service_account.json=~/key.json

위의 비밀을 프록시 컨테이너의 볼륨으로 사용 -

volumes:

- name: <YOUR-SA-SECRET-VOLUME>

  secret:

    secretName: <YOUR-SA-SECRET>

4단계: Cloud SQL 프록시를 사이드카/팟으로 실행

4단계에 도달하면 다음과 같은 이점 때문에 애플리케이션 포드 내에 사이드카 프록시 컨테이너를 생성해야 합니다.

  • IAM 데이터베이스 권한으로 인해 사이드카를 사용하면 전체 클러스터에 대한 인스턴스의 노출이 줄어듭니다.
  • SQL 아웃바운드 트래픽을 암호화하여 로컬 노출을 줄이고 방지합니다.

코드 -


apiVersion: apps/v1
kind: Deployment
metadata:
  name: <YOUR-DEPLOYMENT-NAME>
spec:
  selector:
    matchLabels:
      app: <YOUR-APPLICATION-NAME>
  template:
    metadata:
      labels:
        app: <YOUR-APPLICATION-NAME>
    spec:
      containers:
      - name: <YOUR-APPLICATION-NAME>
        # ... other container configuration
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: <YOUR-DB-SECRET>
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: <YOUR-DB-SECRET>
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: <YOUR-DB-SECRET>
              key: database
      - name: cloud-sql-proxy
        
        image: gcr.io/cloudsql-docker/gce-proxy:1.28.0 # make sure the use the latest version
        command:
          - "/cloud_sql_proxy"
          - "-ip_address_types=PRIVATE"

          # Replace DB_PORT with the port the proxy should listen on
          # Defaults: MySQL: 3306, Postgres: 5432, SQLServer: 1433
          - "-instances=<INSTANCE_CONNECTION_NAME>=tcp:<DB_PORT>"

          
          - "-credential_file=/secrets/service_account.json"
        securityContext:
          
          runAsNonRoot: true
        volumeMounts:
        - name: <YOUR-SA-SECRET-VOLUME>
          mountPath: /secrets/
          readOnly: true
        resources:
          requests:
            
            memory: "2Gi"
          
            cpu:    "1"
      volumes:
      - name: <YOUR-SA-SECRET-VOLUME>
        secret:
          secretName: <YOUR-SA-SECRET>

결론

이것으로 우리는 이 주제의 끝에 접근했습니다. 궁금한 점이 있으면 아래에 의견을 남겨주세요.

클라우드 데이터베이스 및 Kubernetes 기본 정보와 관련된 더 많은 게시물을 보려면 계속 지켜봐 주시기 바랍니다.

그때까지 즐거운 배움!! 😊

참조

  1. Cloud SQL 프록시 정보
  2. GKE의 Cloud SQL 프록시