Hejdaの見る夢

一人前のエンジニアを目指して頑張ったこととかをつらつら書くブログ

GCP: Ingress によるバックエンド サービスの構成 を修正してみた

要旨

実行方法

準備

  • gcloud コマンドによる認証を行います
gcloud auth login
  • GKE を起動するプロジェクトを設定します
    • ${YOUR_PROJECT} はご自分のプロジェクトを入れて下さい
gcloud config set project ${YOUR_PROJECT}
  • GKE の Zone を予め設定
    • asia-northeast1-a を指定してますが、他の Zone でも問題無いです
gcloud config set compute/zone asia-northeast1-a

Kubernetes Engine クラスタの作成

  • Cluster の名前を先に決めておきます
export cl_name='ingress-test'
echo ${cl_name}
  • GKE を構築します
    • テストのため、 Node は2台で起動する
gcloud beta container clusters create ${cl_name} --num-nodes=2
gcloud beta container clusters get-credentials ${cl_name}
  • Node の確認
kubectl get node -o wide

Deployment を作成する

  • マニュフェスト作成します
vim my-bsc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-bsc-deployment
spec:
  selector:
    matchLabels:
      purpose: bsc-config-demo
  replicas: 2
  template:
    metadata:
      labels:
        purpose: bsc-config-demo
    spec:
      containers:
      - name: hello-app-container
        image: gcr.io/google-samples/hello-app:1.0
  • 実行します
kubectl apply -f my-bsc-deployment.yaml
  • 確認します
kubectl get deployment
### 例

$ kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
my-bsc-deployment   2/2     2            2           55s

BackendConfig を作る

  • マニュフェスト作成します
vim my-bsc-backendconfig.yaml
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: my-bsc-backendconfig
spec:
  timeoutSec: 40
  connectionDraining:
    drainingTimeoutSec: 60
  • 実行します
kubectl apply -f my-bsc-backendconfig.yaml
  • 確認します
kubectl get backendconfig
### 例

$ kubectl get backendconfig
NAME                   AGE
my-bsc-backendconfig   31s

Service の作成

  • マニュフェスト作成します
apiVersion: v1
kind: Service
metadata:
  name: my-bsc-service
  labels:
    purpose: bsc-config-demo
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
spec:
  type: NodePort
  selector:
    purpose: bsc-config-demo
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  • 実行します
kubectl apply -f my-bsc-service.yaml
  • 確認します
kubectl get service
### 例


$ kubectl get service
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.39.240.1   <none>        443/TCP        107m
my-bsc-service   NodePort    10.39.251.4   <none>        80:32093/TCP   8s

Ingress の作成

  • マニュフェスト作成します
vim my-bsc-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-bsc-ingress
spec:
  backend:
    serviceName: my-bsc-service
    servicePort: 80
  • 実行します
kubectl apply -f my-bsc-ingress.yaml
  • 確認します
kubectl get ingress
### 例

$ kubectl get ingress
NAME             HOSTS   ADDRESS   PORTS   AGE
my-bsc-ingress   *                 80      4s

ブラウザで確認します

と確認が出来れば、成功です

f:id:nari_kyu:20191005094630p:plain

  • 実際にブラウザで確認します

f:id:nari_kyu:20191005094651p:plain

考察したこと

リソースの 削除

  • 以下のコマンドを実施します
kubectl delete ingress my-bsc-ingress
kubectl delete service my-bsc-service
kubectl delete backendconfig my-bsc-backendconfig
kubectl delete deployment my-bsc-deployment

Kubernetes Engine クラスタの削除

  • 以下のコマンドを実施します
gcloud beta container clusters delete ${cl_name}

まとめ

  • たまたま検証していた時に見つけて、気になったので直せてよかったです
  • 本家も修正PRを送りたいけど、 GCP のドキュメントって OSS では無いので出来ませんでした
    • 他のクラウドOSS にしているところもあるのですごく残念だな〜と思いました