GKEにデプロイしHTTPロードバランシングする
- Container RegistryにアプリケーションDockerイメージをプッシュする
- deployment.yamlを記載する
- デプロイする
- service.yamlを記載する
- ingress.yamlを記載する
- 外部IPにアクセスする
Container RegistryにアプリケーションDockerイメージをプッシュする
https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=jacloud.google.com
自前でアプリケーションをビルドしたDockerfileを作成する
ビルドしContainer Registryにプッシュする
GCP_PROJECT_ID="sample-dev" GCP_IMAGE=asia.gcr.io/$GCP_PROJECT_ID/sample:0.0.1 # build docker build -f dockerfiles/Dockerfile -t $GCP_IMAGE . # push gcloud docker -- push $GCP_IMAGE
これで準備完了
kubectlを使いGKEにデプロイする
deployment.yamlを記載する
以下、レプリカ数2で作ったdeployment.yaml
詳細は省くがポイントはDBの環境変数に登録したcredentialsを使用していること
apiVersion: apps/v1beta1 kind: Deployment metadata: name: deployment-dev spec: replicas: 2 template: metadata: labels: app: sample spec: containers: - name: sample image: asia.gcr.io/sample-dev/sample:0.0.1 ports: - containerPort: 4000 args: ["foreground"] env: - name: DB_HOST value: "127.0.0.1" - name: DB_PORT value: "3306" - name: DB_USER valueFrom: secretKeyRef: name: cloudsql-db-credentials key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: cloudsql-db-credentials key: password - name: cloudsql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.09 command: ["/cloud_sql_proxy", "--dir=/cloudsql", "-instances=sample-dev:asia-northeast1:db-dev=tcp:3306", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: cloudsql-instance-credentials mountPath: /secrets/cloudsql readOnly: true - name: ssl-certs mountPath: /etc/ssl/certs - name: cloudsql mountPath: /cloudsql volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials - name: ssl-certs hostPath: path: /etc/ssl/certs - name: cloudsql emptyDir:
デプロイする
kubectl create -f deployment.yaml
実際にrsとpodが作成されているか確かめる
kubectl get deployment,rs,pod
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/deployment-dev 2 2 2 2 20m NAME DESIRED CURRENT READY AGE rs/deployment-dev-763713461 2 2 2 20m NAME READY STATUS RESTARTS AGE po/deployment-dev-763713461-69r7v 2/2 Running 0 20m po/deployment-dev-763713461-7jrmx 2/2 Running 0 20m
こんな感じでPodがRunningで出力されてればおk
service.yamlを記載する
ポイントはセレクタにdeployment.yamlで記載したappラベルを記載すること
ポート4000を80にポートフォワードする
apiVersion: v1 kind: Service metadata: name: service-dev spec: type: NodePort selector: app: sample ports: - protocol: TCP port: 80 targetPort: 4000
Service作成
kubectl create -f service.yaml
ingress.yamlを記載する
Ingress での HTTP 負荷分散の設定 | Kubernetes Engine のチュートリアル | Google Cloud
作成したservice-devに対してIngressを作成する
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-dev
spec:
backend:
serviceName: service-dev
servicePort: 80
Ingress作成
kubectl create -f ingress.yaml
しばらくするとヘルスチェックが完了し動作する
実際に確認する
kubectl describe ing
Name: ingress-dev Namespace: default Address: ************ Default backend: service-dev:80 (************,************) Rules: Host Path Backends ---- ---- -------- * * service-dev:80 (************,************) Annotations: backends: {"k8s-be-30189--16e23e70a11044da":"HEALTHY"} forwarding-rule: k8s-fw-default-ingress-dev--16e23e70a11044da target-proxy: k8s-tp-default-ingress-dev--16e23e70a11044da url-map: k8s-um-default-ingress-dev--16e23e70a11044da Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 8m 8m 1 loadbalancer-controller Normal ADD default/ingress-dev 7m 7m 1 loadbalancer-controller Normal CREATE ip: ************ 7m 2m 5 loadbalancer-controller Normal Service default backend set to service-dev:30189
backendsがHEALTHYになっていたらおk
これは / に GETリクエストを投げて200を確認している
外部IPにアクセスする
Address: ************
ここにアクセスしてアプリケーションの起動と名前解決を確認する