GKEにログインし、NGINXのDeamonSetをLoadBalancerで公開してみる（個人的備忘録）

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

最近私はKubernetesやDockerにとても興味があり、そこで得た知見・ナレッジをこのようにQiitaに投稿しているのですが、それらの技術で遊ぶための環境を社内に用意しています。無料でスペックの必要な環境を組めるので個人的にかなり重宝しているのですが、会社のネットワークとかに障害が発生したらそれらの環境に接続出来ず、遊ぶことが出来ません。それは困った。

そこで「パブリッククラウドでも触れる環境を用意したいよね！」ということで、タイトルにもあるようにGCPに白羽の矢が立ち、触ってみました。
その操作感をメモっておきます。

# 用語
GCP
---

Google Cloud Platformの略。AWSとかAzureとかと同じPublic Cloudの一種。
AWSは限られたサービスを1年間無料で使えるが、GCPは$300分は無料で使えるという感じで各サービスを触ることが出来る。
KubernetesサービスとしてGCPはGKEを提供しているがこれも$300分は無料で使える。
AWSはEKSがあるが、これは無料利用の範囲外なのでお金がかかってしまう。

https://cloud.google.com/?hl=ja


GKE
---
Google Kubernetes Engineの略。
Kubernetesクラスタをボタンポチポチするだけで準備してくれる神。

https://cloud.google.com/kubernetes-engine?hl=ja

https://youtu.be/_JKsv2BtAnY

# GCPログインからGKEでクラスタを構築する

ログイン画面にアクセスします。

https://cloud.google.com/free?utm_source=google&utm_medium=cpc&utm_campaign=japac-JP-all-ja-dr-BKWS-all-core-trial-EXA-dr-1605216&utm_content=text-ad-none-none-DEV_c-CRE_602341359562-ADGP_Hybrid%20%7C%20BKWS%20-%20EXA%20%7C%20Txt%20~%20GCP%20~%20General_core%20brand-KWID_43700071566406798-kwd-87853815&userloc_1009282-network_g&utm_term=KW_gcp&gclid=EAIaIQobChMIkLSHycPw_gIVEnNgCh2ykAONEAAYASAAEgISlPD_BwE&gclsrc=aw.ds&hl=ja

画面右のログインを押下します。
<img width="960" alt="gcp01" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/3602f2e1-08a6-4d47-97f5-8175660f40ad">

googleのいつものログイン画面。自分が持っているアカウントでログインします。
<img width="959" alt="gcp02" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/c00ac2ba-2f9b-430d-81b7-141e2f347cc7">

画面右のコンソールを押下します。
<img width="959" alt="gcp03" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/0d4ba812-0180-4050-b142-d21fec23dd28">

画面左の【三本線】を押下してKubernetes Engine内のクラスタを押下します。
<img width="954" alt="gcp04" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/974e00a8-9658-4fc7-b50c-e4c3ecc8863a">

青文字の作成を押下します。
<img width="958" alt="gcp05" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/759ebb8e-7481-46a0-abbd-3e28bd679df0">

名前をmy-k8s-clusterに変更しました。
後はデフォルトで問題無しです。作成を押下します。
<img width="957" alt="gcp06" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/ad2483d5-a5ad-480d-a7b7-f8126b344385">

クラスタ作成中となりますので、5分ほど待ちます。
<img width="955" alt="gcp07" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/4f2f7226-4b52-422f-a92c-8b8d8ca4a05b">
<img width="957" alt="gcp08" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/9c5007ab-03bd-4395-9632-1c18ae310e85">

作成が完了するとクラスタ名の左に緑のチェックマークが表示されます。
青文字の接続を押下します。
<img width="956" alt="gcp09" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/f3e0462b-be0e-4afc-b065-7a3bc075579b">

以下の様なポップアップが表示されます。
CLOUD SHELLで実行を押下します。
<img width="551" alt="gcp10" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/5c9e90ea-3477-497e-ad1f-cee662fbb067">

画面下にターミナルが表示され、コマンドが自動で入力されているのでEnterで実行します。
<img width="957" alt="gcp11" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/4ee3d4de-17cb-4d58-a4a2-c035b4d7d811">

承認でOKです。
<img width="959" alt="gcp12" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/9e72bf0a-8957-4ecb-b5f0-c4e846fd9468">
<img width="958" alt="gcp13" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/faaa6124-bc49-4eea-8715-c7c00a9acf09">

右から二番目の新しいウィンドウで開くを押下します。
<img width="958" alt="gcp14" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/e1619cf4-b8b6-49c2-9d18-d645c87686b9">

エディタを開くを押下します。
<img width="955" alt="gcp15" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/97d6a82c-b084-4c4c-90b1-1483a7472641">

すると以下の様にVSCodeライクな開発環境が整います。
<img width="952" alt="gcp16" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/04c066d4-5a70-49d7-b221-3be633c588e8">

以下の様にファイル編集もviコマンド等を使わずに済むため容易となります。
<img width="953" alt="gcp17" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/da5e55a7-cf65-45f8-8ce9-c8059a7821fe">

# DSをLBで公開し、ブラウザで接続する
GKEのk8sクラスタは2台構成の様です。
```
ohtsuka_honban@cloudshell:~/yaml (western-antonym-386513)$ kubectl get node -o wide
NAME                                            STATUS   ROLES    AGE   VERSION            INTERNAL-IP   EXTERNAL-IP     OS-IMAGE                             KERNEL-VERSION   CONTAINER-RUNTIME
gk3-my-k8s-cluster-default-pool-65cbb045-3ww4   Ready    <none>   11m   v1.25.7-gke.1000   10.128.0.3    34.135.19.169   Container-Optimized OS from Google   5.15.65+         containerd://1.6.18
gk3-my-k8s-cluster-default-pool-ff5ff3b9-67pp   Ready    <none>   11m   v1.25.7-gke.1000   10.128.0.4    35.238.40.41    Container-Optimized OS from Google   5.15.65+         containerd://1.6.18
```

DSのyamlは以下となります。
```nginx-ds.yaml 
apiVersion: apps/v1 
kind: DaemonSet 
metadata: 
  name: nginx-ds 
spec: 
  selector: 
    matchLabels: 
      name: nginx 
  template: 
    metadata: 
      labels: 
        name: nginx 
    spec: 
      containers: 
      - name: nginx-container 
        image: nginx:latest
```

LBのyamlは以下となります。
```nginx-lb.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-lb 
spec:
  type: LoadBalancer
  selector:
    name: nginx
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 80
```

これらをデプロイしていきます。
lbのEXTERNAL-IPがpendingとなっていますが、時間が経過すればアタッチされるので待ちます。
```
ohtsuka_honban@cloudshell:~/yaml (western-antonym-386513)$ kubectl apply -f nginx-ds.yaml 
Warning: Autopilot set default resource requests for DaemonSet default/nginx-ds, as resource requests were not specified. See http://g.co/gke/autopilot-defaults
daemonset.apps/nginx-ds created
ohtsuka_honban@cloudshell:~/yaml (western-antonym-386513)$ kubectl apply -f nginx-lb.yaml 
service/nginx-lb created



ohtsuka_honban@cloudshell:~/yaml (western-antonym-386513)$ kubectl get all -o wide
NAME                 READY   STATUS    RESTARTS   AGE   IP              NODE                                            NOMINATED NODE   READINESS GATES
pod/nginx-ds-nl6c5   1/1     Running   0          31s   10.109.128.72   gk3-my-k8s-cluster-default-pool-ff5ff3b9-67pp   <none>           <none>
pod/nginx-ds-zggph   1/1     Running   0          31s   10.109.128.18   gk3-my-k8s-cluster-default-pool-65cbb045-3ww4   <none>           <none>



NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE   SELECTOR
service/kubernetes   ClusterIP      10.110.0.1     <none>        443/TCP           26m   <none>
service/nginx-lb     LoadBalancer   10.110.1.206   <pending>     60000:32653/TCP   4s    name=nginx


NAME                      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS        IMAGES         SELECTOR
daemonset.apps/nginx-ds   2         2         2       2            2           <none>          32s   nginx-container   nginx:latest   name=nginx
```

数分待つとEXTERNAL-IPがアタッチされます。
今回は今回は35.188.98.215というIPが付与されています。
```
ohtsuka_honban@cloudshell:~/yaml (western-antonym-386513)$ kubectl get svc -o wide
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)           AGE   SELECTOR
kubernetes   ClusterIP      10.110.0.1     <none>          443/TCP           28m   <none>
nginx-lb     LoadBalancer   10.110.1.206   35.188.98.215   60000:32653/TCP   80s   name=nginx
```

http://35.188.98.215:60000/をWebブラウザで検索します。
nginxのDeamonSetに接続出来ることが分かりますね。
これでGKE上のDSをLBで公開することに成功しました。

<img width="952" alt="gcp18" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/b352eb55-7ad1-4c73-9174-db9cea9278f2">

遊び終わったらクラスタを削除しましょう。
<img width="952" alt="gcp19" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/d5f64de4-861a-4bcc-9065-7aa4ec81819c">