[GKE] Amazon Linux上のコンテナをGKE(kubenetes)に移行する方法(サブドメイン・プリエンティブインスタンス・Nginx Controller)

Kubernetesサービスを比較した結果、GKEが最も安価に運用できるという結論に至ったため、現在稼働中のAmazon Linux上のコンテナをすべてGKEに移行した手順をメモ

ちなみに費用削減のためにコンテナ上のLoadbalancerは1個だけにして、サブドメインのFQDNごとに適切なコンテナにトラフィックを振り分けるNginx contollerをDeployする

またGKE上のインスタンスはプリエンティブインスタンスを使用してさらに費用削減する。

GKEコンテナで使用する永続ボリュームはリージョン永続ボリュームを使用して耐リージョン障害に備える。

 

目次

Amazon Linuxの作業

GKEにコンテナをDeployするにはGCP Container Registryにイメージをアップロードする必要がある。

Amazon LinuxからGCP Container Registryにイメージをアップロードするには、以下の方法でイメージをアップロードする

Amazon LinuxのDockerコンテナをイメージ化

以下のコマンドで移行したいコンテナをイメージ化する (Amazon Linux上)

docker commit コンテナ名またはコンテナID イメージ名:タグ名

 

 

GCPのgcloudコマンドをAmazon Linuxにインストール

curl https://sdk.cloud.google.com | bash

対話式でインストールが進むが、基本的にEnterで進めてよい

 

$ exec -l $SHELL
$ which gcloud
~/google-cloud-sdk/bin/gcloud

パスを反映

 

gcloud init

自分のアカウントにログイン

 

You must log in to continue. Would you like to log in (Y/n)? y

Go to the following link in your browser:

 ¦ https://accounts.google.com/o/oauth2/XXXXXXXXXXXXXXXXXXXXXX


Enter verification code: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

URLが出力されるので、ブラウザで開いて、GCPで使っているメールアドレスでログイン。画面に表示された認証キーをプロンプトにコピペする。

 

Do you want to configure Google Compute Engine
(https://cloud.google.com/compute) settings (Y/n)?

Yを選択するとRegion選択に移る。

 

Amazon LinuxのDockerイメージをGCP Container Registryにプッシュ

ログインとProject設定

gcloud auth login
gcloud config set project [PROJECT_ID]

 

gcloud configを確認

$ gcloud config list
[core]
account = your_account@gmail.com
disable_usage_reporting = False
project = project id

Your active configuration is: [project id]
~

GCPにアクセスするため、GCPのcredentialを設定

gcloud auth configure-docker

イメージをレポジトリのタグ名を付ける、これを行わないとPushできない。

docker tag [ローカルのdocker image]:[TAG] [HOSTNAME]/[PROJECT-ID]/[IMAGE]:[TAG]

Docker ImageをPush

docker push gcr.io/[PROJECT-ID]/[IMAGE]

GKEでの作業

GKEでコンテナクラスタを作成

永続リージョンストレージを使用して、リージョンの障害耐性を持たせたいので、クラスタもリージョンタイプを指定。

ただ永続リージョンストレージは2つのリージョンしか対応していない?ので、クラスタも2つのリージョンに指定しておく。

 

24時間で再起動がかかるが、費用が通常の1/3になるプリエンティブインスタンスを持つノードプールに新しく作り、Defaultノードプールを削除

GCP Container RegistryのイメージをDeploy

先ほどGCP Container Registryにアップロードしたイメージを使用してコンテナをDeploy

GCP Shellを起動させてEditorを起動

Explorer上で新しく「example.yaml」を作成する

apiVersion: v1
kind: Service
metadata:
 name: example-dokuwiki-service
 annotations:
 beta.cloud.google.com/backend-config: '{"ports": {"80":"[運用したいドメイン名]"}}'
spec:
 ports:
 - name: http
 port: 80
 protocol: TCP
 targetPort: http
 - name: https
 port: 443
 protocol: TCP
 targetPort: https
 selector:
 app: example
 sessionAffinity: None
 type: ClusterIP
status:
 loadBalancer: {}
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: example-dokuwiki
spec:
 replicas: 1
 template:
 metadata:
 labels:
 app: example
 spec:
 containers:
 - name : example-dokuwiki
 image: gcr.io/[プロジェクト名]/[イメージ名]
 volumeMounts:
 - mountPath: /bitnami/dokuwiki
 name: example-dokuwiki-data
 subPath: example-dokuwiki-data-sub
 ports:
 - containerPort: 80
 name: http
 protocol: TCP
 - containerPort: 443
 name: https
 protocol: TCP 
 volumes:
 - name: example-dokuwiki-data
 persistentVolumeClaim:
 claimName: example-dokuwiki
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: example-dokuwiki
spec:
 accessModes:
 - ReadWriteOnce
 resources:
 requests:
 storage: 8Gi

example-dokuwiki-serviceとexample-dokuwikiというDeploymentとexample-dokuwikiというPersistentVolumeClaimの3つが上記yamlで作成される。今回はbitnami-dokuwikiなのでPVのマウント先は/bitnami/dokuwikiとしている。

外部ストレージサイズは8Gとしているが変更可能。PVCのストレージクラスはGKEですでに作成されているStandardクラス(リージョン永続ボリューム)上に作成される

InternetからのアクセスはNginxで受けさせたいため、dokuwikiのコンテナのserviceはloadbalancer IPではなくCluster IPとしている。

loadbalancer IPにするとお金がかかるため。

 

applyコマンドでコンテナをDeploy

kubectl apply -f example.yaml

 

 

サブドメイン運用のためのIngress-NginxをDeploy

Amazon Linuxでの運用ではNginxを配備してサブドメインごとのアクセスを各コンテナに振り分けていたので、GKEでも同じ構成にする

参考:https://cloud.google.com/community/tutorials/nginx-ingress-gke

image

Helmをインストール

GKEのGUIでGCP Shellを起動させて以下のコマンドを発行

curl -o get_helm.sh https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get
chmod +x get_helm.sh
./get_helm.sh

Tillerをインストール

GCP Shellで以下のコマンドを発行

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller

Tillerの動作確認

kubectl get deployments -n kube-system

tiller_deploy Podが稼働していればOK

 

NGINX Ingress ControllerをDeploy

helm install --name nginx-ingress stable/nginx-ingress --set rbac.create=true --set controller.publishService.enabled=true

Nginx ControllerにGlobal IPが払い出されていることを確認

kubectl get service nginx-ingress-controller

 

Nginx転送ルールyaml

サブドメインで先ほどのdokuwikiにアクセスできるようにNginxを設定する

GCP Shellを起動させてEditorを起動

Explorer上で新しく「ingress-nginx.yaml」を作成する

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: ingress-resource
 annotations:
 kubernetes.io/ingress.class: nginx
 nginx.ingress.kubernetes.io/ssl-redirect: "false" 
spec:
 rules:
 - host: sub.example.info
 http:
 paths:
 - path: /
 backend:
 serviceName: example-dokuwiki-service
 servicePort: 80

上記Yamlでsub.example.infoでアクセスしてきたら、example-dokuwiki-serviceに転送することができるようになる。

 

ingress-nginx.yamlをApply

kubectl apply -f ingress-nginx.yaml

トラフィックをSSL化したい場合は下記参照

[GKE] ingress-nginx配下のwebサーバ用のSSL証明書をcert-managerで付与する方法

コメントを残す

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