パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

GKEにデプロイしHTTPロードバランシングする

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:     ************

ここにアクセスしてアプリケーションの起動と名前解決を確認する