Qwiklabs の「Kubernetesソリューション」を進めていきたいと思います。
Kubernetes Engine を使用して、リージョン永続ディスクにアプリをデプロイする
概要
Kubernetes Engine のリージョン永続ディスクを使用して WordPress をデプロイすることで、高可用性アプリケーションを構成する方法を学びます。
コマンド
Kubernetes Engine のリージョン クラスタを作成する
Regional clusters | Google Kubernetes Engine (GKE) | Google Cloud
Learn about regional GKE clusters.
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 をデプロイすることで、高可用性アプリケーションを構成する方法を学びました。
ゾーン障害が発生してから切り替わるまでに数分間のダウンタイムが発生するようです。
コメント