[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
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化したい場合は下記参照