前回手元の Mac からコンテナクラスタ → Deployment → LB 作成する手順をまとめました。
無料枠で運用! GKE + Kubernetes で Hubot 〜CLIから実行編〜 - 長生村本郷Engineers'Blog
以下に移行しました。 kenzo0107.github.io
但し、8080 ポートがフルオープンとなってしまい、誰でもアクセスが可能であるという、 セキュリティ的に非常によろしくない状態でした。
その為、今回は以下実施します。
独自ネットワーク(ファイアウォール)作成
独自ネットワーク上にクラスタ作成
設定ファイルでコンテナ起動・更新
前回の独自ネットワーク設定していないクラスタは削除して問題ないです。お任せします m(_ _)m
前回同様の Git Repository 用意 1 2 $ git clone https://github.com/kenzo0107/hubot-slack-on-docker $ cd hubot-slack-on-docker
Network 作成
hubot-network
というネットワークを作成します。
1 macOS%$ gcloud compute networks create hubot-network
ファイアウォール作成
作成したネットワークに特定 IP からのみ 8080 ポートアクセス許可
1 macOS%$ gcloud compute firewall-rules create hubot-rule --network hubot-network --allow tcp:8080 --source-ranges xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy.yyy
Container Clusters 作成
1 2 3 4 5 6 macOS%$ gcloud container clusters create hubot-cluster-free \ --machine-type f1-micro \ --disk-size=30 \ --num-nodes=3 \ --network=hubot-network \ --cluster-ipv4-cidr=10.0.0.0/14
cluster-ipv4-cidr オプション必須! 指定しクラスタ内の Pod の IP アドレスの範囲指定しています。 ※サブネットマスク(10.0.0.0/14 の “/14” 部分)指定は 9〜19 で指定する必要があります。
例) –cluster-ipv4-cidr=10.0.0.0/8 指定した場合のエラー
1 ERROR: (gcloud.container.clusters.create) ResponseError: code=400, message=cluster.cluster_ipv4_cidr CIDR block size must be no bigger than /9 and no smaller than /19, found /8.
ノード数を 1 に変更 1 macOS%$ gcloud container clusters resize hubot-cluster-free --size=1
Deployment 作成 1 macOS%$ kubectl create -f gke-deployment.yml
Deployment, Replicaset, Pod 一覧表示
1 macOS%$ kubectl get deployments,replicasets,pods --selector app=hubot
フォーマットを yaml 形式で出力 1 macOS%$ kubectl get deployment deployment-hubot -o yaml
サービス公開する為、LoadBalancer 付加 1 macOS%$ kubectl create -f gke-lb.yml
サービス一覧表示 1 2 3 4 macOS%$ kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.3.240.1 <none> 443/TCP 20m loadbalancer 10.3.241.129 zz.zzz.zzz.zzz 8080:31628/TCP 4m
※EXTERNAL-IP : zz.zzz.zzz.zzz
はグローバル IP
いざ、テスト ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 macOS%$ curl \ -X POST \ -H "Content-Type: application/json" \ -d \ '{ "webhookEvent":"jira:issue_updated", "comment":{ "author":{ "name":"himuko" }, "body":"[~kenzo.tanaka] 東京03 秋山 ケンコバ 劇団ひとり" }, "issue": { "key":"key", "fields":{ "summary":"summary" } } }' \ http://zz.zzz.zzz.zzz:8080/hubot/jira-comment-dm
できた! [f:id:kenzo0107:20170516220548p:plain]
更新(ローリングアップデート) ReplicationController を利用することで無停止で更新します。
実際に以下の様にして更新しているのが確認できます。
既存の Running 中のコンテナの個数分、更新したイメージからビルドしたコンテナを起動
更新版コンテナが Running 状態になったら既存コンテナを削除
1 2 3 4 5 6 7 8 9 10 11 12 // ローカルで更新した Docker Container を コミット macOS%$ docker commit 12f77feb09b4 gcr.io/hubot-167007/hubot:latest // Google Container Registory にプッシュ macOS%$ gcloud docker -- push gcr.io/hubot-167007/hubot:latest // Pod 表示 macOS%$ kubectl get pods NAME READY STATUS RESTARTS AGE deployment-hubot-cfe7528ee0b5059b14a30b942597e5ef-z8nws 1/1 Running 1 1d // push したImageを元にローリングアップデート macOS%$ kubectl rolling-update deployment-hubot-cfe7528ee0b5059b14a30b942597e5ef-z8nws --image=gcr.io/hubot-167007/hubot:latest
後片付け
1 macOS%$ kubectl delete -f gke-deployment.yml
1 macOS%$ kubectl delete -f gke-lb.yml
総評 ネットワークのファイアウォール設定してコンテナ起動したが動かなかった所、かなり詰まりました (; _) Stackoverflow にたまたま同様のイシューをあげている方がおり参考にさせて頂きました。 助かった汗
これから Nginx + Rails 等、よくありそうなケースで GKE + Kubernetes を試して運用してみたいと思います。 まとまったらまた追記します!
参考 Unable to launch a GKE (Google Container Engine) cluster with a custom network