【GCP】Qwiklabs の「Kubernetesソリューション」を勉強しています~Kubernetes Engine を使用して、リージョン永続ディスクにアプリをデプロイする~

リージョン永続ディスク 情報
リージョン永続ディスク

Qwiklabs の「Kubernetesソリューション」を進めていきたいと思います。

Kubernetes Engine を使用して、リージョン永続ディスクにアプリをデプロイする

概要

Kubernetes Engine のリージョン永続ディスクを使用して WordPress をデプロイすることで、高可用性アプリケーションを構成する方法を学びます。

コマンド

Kubernetes Engine のリージョン クラスタを作成する

Regional clusters  |  Kubernetes Engine Documentation  |  Google Cloud
CLUSTER_VERSION=$(gcloud container get-server-config --region us-west1 --format='value(validMasterVersions[0])')
echo $CLUSTER_VERSION
export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
gcloud container clusters create repd \
  --cluster-version=${CLUSTER_VERSION} \
  --machine-type=n1-standard-4 \
  --region=us-west1 \
  --num-nodes=1 \
  --node-locations=us-west1-a,us-west1-b,us-west1-c

リージョン ディスクを使用してアプリをデプロイする

Helm をインストールして初期化し、グラフ パッケージをインストールする
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
kubectl create serviceaccount tiller --namespace kube-system
kubectl create clusterrolebinding tiller-cluster-rule \
  --clusterrole=cluster-admin \
  --serviceaccount=kube-system:tiller
helm init --service-account=tiller
until (helm version --tiller-connection-timeout=1 > /dev/null 2>&1); do echo "Waiting for tiller install..."; sleep 2; done && echo "Helm install complete"
StorageClass を作成する
kubectl apply -f - <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: repd-west1-a-b-c
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: regional-pd
  zones: us-west1-a, us-west1-b, us-west1-c
EOF
kubectl get storageclass

永続ボリュームの要求を作成する

kubectl apply -f - <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: data-wp-repd-mariadb-0
  namespace: default
  labels:
    app: mariadb
    component: master
    release: wp-repd
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 8Gi
  storageClassName: standard
EOF
kubectl apply -f - <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: wp-repd-wordpress
  namespace: default
  labels:
    app: wp-repd-wordpress
    chart: wordpress-5.7.1
    heritage: Tiller
    release: wp-repd
spec:
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 200Gi
  storageClassName: repd-west1-a-b-c
EOF
kubectl get persistentvolumeclaims

WordPress をデプロイする

helm install --name wp-repd \
  --set smtpHost= --set smtpPort= --set smtpUser= \
  --set smtpPassword= --set smtpUsername= --set smtpProtocol= \
  --set persistence.storageClass=repd-west1-a-b-c \
  --set persistence.existingClaim=wp-repd-wordpress \
  --set persistence.accessMode=ReadOnlyMany \
  stable/wordpress
kubectl get pods
while [[ -z $SERVICE_IP ]]; do SERVICE_IP=$(kubectl get svc wp-repd-wordpress -o jsonpath='{.status.loadBalancer.ingress[].ip}'); echo "Waiting for service external IP..."; sleep 2; done; echo http://$SERVICE_IP/admin
while [[ -z $PV ]]; do PV=$(kubectl get pvc wp-repd-wordpress -o jsonpath='{.spec.volumeName}'); echo "Waiting for PV..."; sleep 2; done
kubectl describe pv $PV
echo http://$SERVICE_IP/admin
cat - <<EOF
Username: user
Password: $(kubectl get secret --namespace default wp-repd-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)
EOF

ゾーン障害をシミュレーションする

NODE=$(kubectl get pods -l app.kubernetes.io/instance=wp-repd -o jsonpath='{.items..spec.nodeName}')
ZONE=$(kubectl get node $NODE -o jsonpath="{.metadata.labels['failure-domain\.beta\.kubernetes\.io/zone']}")
IG=$(gcloud compute instance-groups list --filter="name~gke-repd-default-pool zone:(${ZONE})" --format='value(name)')
echo "Pod is currently on node ${NODE}"
echo "Instance group to delete: ${IG} for zone: ${ZONE}"
kubectl get pods -l app.kubernetes.io/instance=wp-repd -o wide
gcloud compute instance-groups managed delete ${IG} --zone ${ZONE}
kubectl get pods -l app.kubernetes.io/instance=wp-repd -o wide
echo http://$SERVICE_IP/admin

まとめ

Kubernetes Engine のリージョン永続ディスクを使用して WordPress をデプロイすることで、高可用性アプリケーションを構成する方法を学びました。
ゾーン障害が発生してから切り替わるまでに数分間のダウンタイムが発生するようです。

コメント

タイトルとURLをコピーしました