GKE의 Go 앱에서 Cloud Sql Proxy를 통해 CloudSQL 2세대에 연결

5602 단어 5gcpGKE

개요



GKE Docker의 Go 앱에서 Cloud Sql Proxy를 통해 CloudSQL 2 세대에 연결해 보았으므로 비망록으로 남겨 둡니다.

절차



DB 생성



google cloud console에서 cloudSQL db 만들기
第2世代 선택하기

DB명은 db-dev 로 한다
フェールオーバレプリカの作成 에 체크하고 작성하기


인스턴스가 생성되었는지 확인


사용자의 비밀번호 설정


GKE에서 DB 연결 확인 및 사용자 권한 생성



연결 확인, 사용자 권한 생성을 위한 인스턴스 생성
gcloud compute instances create sql-client --scopes=sql-admin --machine-type=f1-micro \
--network=lovelytokyo --subnet=lovelytokyo \
--zone=asia-northeast1-b  

연결하다
gcloud compute ssh debian@sql-client

cloud_sql_proxy 설치
curl https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -o cloud_sql_proxy
chmod +x cloud_sql_proxy
sudo mkdir /cloudsql; sudo chmod 777 /cloudsql

mysql client 설치
sudo apt-get install mysql-client

cloud_sql_proxy 시작
sudo ./cloud_sql_proxy -dir=/cloudsql -instances='lovelytokyo:asia-northeast1:db-dev=tcp:3306'

연결하다
mysql --user root --host localhost --protocol TCP --password

db 만들기
CREATE DATABASE hawai DEFAULT CHARACTER SET utf8;

DB hawai에 사용자 cloudmaster가 프록시를 통해 액세스 할 때 권한 설정
GRANT SELECT,INSERT,UPDATE,DELETE ON hawai.* TO 'cloudmaster'@'cloudsqlproxy~%';
FLUSH PRIVILEGES;

GKE Docker의 GO 앱에서 연결



1. 서비스 계정 키 만들기



google cloud console에서 서비스 계정 키 만들기




만든 Cloud SQL Service account json 파일을 다운로드하여 저장
/path/to/secrets/cloudsql/lovelytokyo-xxxx-xxx.json

2. 인스턴스에서 CloudSQL에 액세스하기 위한 보안 생성



이때 json 파일의 경로는 1.로 저장한 경로로 한다.
kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=/path/to/secrets/cloudsql/lovelytokyo-xxxx-xxx.json

3. 데이터베이스에 액세스 할 때 사용하는 사용자 및 암호 작성



go 앱에서 사용
kubectl create secret generic cloudsql-master-user --from-literal=username=cloudmaster
kubectl create secret generic cloudsql-master-password --from-literal=password=masterpasswd

GO 앱의 deployment.yaml


apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name:app-sample
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        application: app-sample
        tier: app
    spec:
      imagePullSecrets:
      - name : gcp-registry-key
      containers:
      - image: gcr.io/lovelytokyo/app-sample
        name: app-sample
        ports:
        - containerPort: 8080
          protocol: TCP
        imagePullPolicy: Always
        env:
          - name: MASTER_USER
            valueFrom:
              secretKeyRef:
                name: cloudsql-master-user (3.で作成したものを参照する)
                key: username
          - name: MASTER_PASSWORD
            valueFrom:
              secretKeyRef:
                name: cloudsql-master-password  (3.で作成したものを参照する)
                key: password
      - image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=lovelytokyo:asia-northeast1:db-dev=tcp:3306",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir:

앱의 연결 샘플



환경 변수로 설정한 사용자 이름과 암호를 사용하여 연결
user := os.Getenv("MASTER_USER")
  passwd := os.Getenv("MASTER_PASSWORD")
  db := "hawai"

  connStr := fmt.Sprintf("%s:%s@tcp(localhost:3306)/%s%s", user, passwd, db, option)

좋은 웹페이지 즐겨찾기