Google Container Engineに移行した その4

Gke

前回まででNginxとphp-fpmをビルドしてGoogleのリポジトリにアップしました。今回はGoogle Container Engine(GKE)のクラスタを作成します。

前回の記事

Google Container Engineに移行した その3 | A-tak-dot-com

その前にDBとNFSサーバを作る

今回、DB(MariaDB)とWordPressのファイルを置くNFSサーバーはコンテナではなく普通のVMとして立ち上げる想定にしています。作成方法は過去記事を参考にしてください。

お名前.com VPSからGoogle Compute Engineにサーバー移行した その2 | A-tak-dot-com

これを先につくっておかないとコンテナがNFSをマウントできなくてコンテナ起動に失敗するので先に用意しておく必要があります。

クラスタを作成する

クラスタを作成します。

[bash]
gcloud container –project "my-project999" clusters create "cluster-web3" –zone "asia-east1-a" –machine-type "g1-small" –scope "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring" –num-nodes "1" –network "default" –enable-cloud-logging –enable-cloud-monitoring –disk-size 20 –cluster-ipv4-cidr "10.212.0.0/14"
[/bash]

NginxとPHP-FPMぐらいしか起動しないのでdisk-sizeでディスクのサイズを20GBにしています。もっと少なくても動くかも。デフォルトだと100GBも確保するので勿体ないです。

–projectは自分のプロジェクトに書き換えてください。クラスタの名前は「cluster-web3」にしています。あとマシンは「g1-small」を指定しています。推奨は「n1-standard-1」らしいのですが、とりあえず動いてはいますね。

–cluster-ipv4-cidrはクラスタが作成するノードのIP範囲を指定するものです。あとでMariaDBの接続許可をするIP範囲を指定するときにここで指定した範囲を許可します。

とはいえ最初は何を指定していいかわからないと思いますので、このオプション外してクラスタを立ち上げて、GCPのWebコンソールでネットワークのファイアウォールルールで「gke-cluster-web3-xxxxxx-all」(cluster-web3はクラスタの名前)を探してIPの範囲を確認してください。

クラスタの作成は結構時間かかりますので、じっと待ちましょう。

[bash]
gcloud config set container/cluster cluster-web3
gcloud container clusters get-credentials cluster-web3
[/bash]

このあとKubernetesを「kubectl」コマンドで操作するのですが、どのクラスタを操作するかをここで指定します。get-credentialsはなにするやつだろ?「クラスタ情報をフェッチする」と説明があるが意味不明😆

各種コンテナ操作をするためにkubectlをインストールしておく必要があります。

[bash]
gcloud components install kubectl
[/bash]

開始方法

レプリケーションコントローラーを作る

Kubernetesはポッドという単位でコンテナを管理します。ポッドの中には複数のコンテナをセットできます。前回作ったNginxとphp-fpmのイメージを使ってそれぞれコンテナを作成し一つのポッドに入れることにします。

また、ポッドですがレプリケーションコントローラーにセットすることで、ポッドのコピーを複数作ることが出来ます。オートスケールを設定すると負荷に合わせて自動的にポッドが増減します。

単独でポッドを作ることもできますが、今回はnginxとphp-fpmのコンテナを含むポッドをレプリケーションコントローラーにセットしてみます。

以下のyamlファイルを作ります。JSONでも指定できますが、yamlの方が見やすいです。ファイル名はweb.ymlとでもしましょう。


[yaml]
kind: "ReplicationController"
apiVersion: "v1"
metadata:
name: "web-rc-05"
labels:
name: "web-rc-05"
spec:
replicas: 1
selector:
name: "web-pods"
version: "5"
template:
metadata:
labels:
name: "web-pods"
version: "5"
spec:
volumes:
– name: www
nfs:
server: "db.c.my-project999.internal"
path: "/var/contents"
readOnly: false
containers:

name: "nginx"
image: "asia.gcr.io/my-project999/nginx:v17"
resources:
limits:
cpu: 100m
requests:
cpu: 100m
ports:

containerPort: 80
volumeMounts:
– name: www
mountPath: "/var/contents"

name: "php-fpm"
image: "asia.gcr.io/my-project999/php-fpm:v1"
resources:
limits:
cpu: 300m
requests:
cpu: 100m
ports:

containerPort: 9000
volumeMounts:
– name: www
mountPath: "/var/contents"
[/yaml]

kindにはReplicationControllerを指定しています。Kubernetesの設定ファイルはkindで「何を作るか?」を指定するようになっています。

apiVersionはv1で。KubernetesのAPIのバージョンのようです。

metadata配下のnameはレプリケーションコントローラーの名前です。

labelsはイマイチよくわかっていないのですが、セレクターという仕組みがあってここで指定した名前を使って一括設定したり出来るみたいです。

spec配下はレプリケーションコントローラーの設定です。replicasはとりあえず一つで。あとでオートスケール設定するのでここの指定はあまり意味が無いかも。

selectorでapp: “web-rc03″を指定していますが、あとでサービスを作成するときにこの名前を指定します。ここらへんイマイチ私もよくわかってない。

template配下は作成するポッドのテンプレートです。volumesのところでnfsのマウントを設定しています。serverのところはnfsサーバーが動いているサーバ名を指定します。

containers配下はポッドに含めるコンテナの設定です。imageに先にリポジトリにアップしたイメージのタグを指定しています。

mountPathでコンテナが動いているノードのローカルディレクトリをコンテナにマウントしています。先のNFSの設定で/var/contentsはNFSサーバーにマウントされているので、結果nfsサーバーの内容をコンテナが読み書きできるようになります。

NFSサーバーの接続許可

NFSサーバの方にも接続許可が必要です。nfsサーバーにログインして

[bash]
vi /etc/exports
/var/contents gke-cluster-web*.c.my-project999.internal(rw)
[/bash]

のような感じでクラスタのノード名で許可します。

設定変更後は
[bash]
systemctl restart rpcbind
systemctl restart nfs-server
systemctl restart nfs-lock
systemctl restart nfs-idmap
[/bash]
でサービス再起動して設定反映します。

WordPressのコンテンツ配置

nfsの/var/contents/a-tak.com/html配下にwordpressのコンテンツを配置します。詳細略です。

MariaDBに接続許可追加

mysqlコマンドでMariaDBに接続してクラスタのノードから接続許可します。IPはクラスタ作成時に指定したIP範囲にします。ここが最初わからなくてだいぶ苦労した。

[bash]
grant all privileges on wordpress.* to wordpress@"10.212.0.0/255.252.0.0" identified by ‘password’;
flush privileges;
[/bash]

やっとコンテナを作成する

ローカルマシンからkubectlコマンドでレプリケーションコントローラーを作成します。

さっき作成したweb.ymlを使います。Dropboxのdockerの下にKubernetesフォルダ作ってyamlファイルを置くことにします。

[bash]
#作業ディレクトリ
dockerwork=/Users/a-tak/Dropbox/docker
#プロジェクトID
projectid=my-project999
#replicateControlerを作成する
kubectl create -f ${dockerwork}/kubernetes/web.yml
[/bash]

これでコンテナが起動します。

[bash]
kubectl get pod
[/bash]

このコマンドでポッドの作成状況がわかります。Runningになれば起動完了です。

サービスを作って外部に公開する

Nginxをインターネットから見えるようにします。またyamlファイルを作ります。nginx-service.yml とでもしましょう。


[yaml]
kind: "Service"
apiVersion: "v1"
metadata:
name: "nginx-svc"
spec:
type: "LoadBalancer"
loadBalancerIP: xxx.xxx.xxx.xxx
ports:

port: 80
selector:
name: "web-pods"
[/yaml]

初回はloadBalancerIPの行は消しておきましょう。

以下コマンドでサービスを作成します。

[bash]
kubectl create -f ${dockerwork}/kubernetes/nginx-service.yml
[/bash]

GKEだとロードバランサーと連携させて簡単に各種ネットワーク設定も自動で行われます。GCPのWebコンソールでネットワークの外部IPをみると自動でIPが追加されロードバランサーと紐付けられます。

外部IPが紐付けられるのには1分ほど時間がかかります。以下のコマンドでEXTERNAL IPが表示されるのを確認してください。

[bash]
kubectl get service
[/bash]

外部にさらすIPを固定化したい場合は、GCPのWebコンソールの外部IPアドレスで「エフェメラル」から「静的」に変えて、さきほどのloadBalancerIPの行を追加して、外部IPを指定します。

これでNginx + PHP-FPMのWordPressサーバーが起動します。次回はオートスケールについて書いてみようかと思います。

広告の下にお勧め記事あります!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください