MySQL Operator for Kubernetesを使用してOKEにWordPressおよびMySQLをデプロイする方法 (2023/12/23)
MySQL Operator for Kubernetesを使用してOKEにWordPressおよびMySQLをデプロイする方法 (2023/12/23)
投稿者:Frederic Descamps | MySQL Community Manager
私たちは、MySQL Content Advent Calendar 2023の結論に近づいています。今回は、この秋に公開された非常に人気のある記事を紹介します。この記事では、MySQLを実行するためのKubernetesの利用という、非常にトレンドの多いテーマについて説明します。
WordPressおよびMySQLをKubernetesクラスタにデプロイする方法を見てみましょう。使用しているKubernetsクラスタは、OCI (Oracle Cloud Infrastructure)のOKE (Oracle Kubernetes Engine)です:
OKE クラスタ
まず、コンソールを使用してOCIにKubernetesクラスタを作成します:
クイック作成モードを選択します。
クラスタに名前を付けて、いくつかの選択を行う必要があります。
作成されると、「OKEクラスタ」リストに表示されます。
また、ワーカー・ノードとワーカーのプールも確認できます。
kubectl
ラトップ上でkubectlを直接使用して、K8sクラスタを管理するのが好きです。
Linuxデスクトップでは、kubernetes-clientパッケージ(rpm)をインストールする必要があります。
次に、K8sクラスタの詳細で、「アクセス・クラスタ」をクリックして、使用するすべてのコマンドを取得できます。
端末でコピーする必要があり、自分の環境でkubectlのbash完了も有効にしたい:
$ source <(kubectl completion bash)
$ echo "source <(kubectl completion bash)" >> $HOME/.bashrc
簡単にテストできます:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.0.10.155 Ready node 21s v1.27.2
10.0.10.193 Ready node 21s v1.27.2
10.0.10.216 Ready node 21s v1.27.2
MySQLオペレータ・デプロイメント
MySQLをデプロイするには、InnoDBクラスタ(MySQL Routerを含む)のデプロイメントを管理するKubernetesのmysql-operatorを使用します。
アーキテクチャの概要は次のとおりです。
まず、マニフェスト・ファイルを使用してオペレータをインストールします。
$ kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml
customresourcedefinition.apiextensions.k8s.io/innodbclusters.mysql.oracle.com created
customresourcedefinition.apiextensions.k8s.io/mysqlbackups.mysql.oracle.com created
customresourcedefinition.apiextensions.k8s.io/clusterkopfpeerings.zalando.org created
customresourcedefinition.apiextensions.k8s.io/kopfpeerings.zalando.org created
$ kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml
clusterrole.rbac.authorization.k8s.io/mysql-operator created
clusterrole.rbac.authorization.k8s.io/mysql-sidecar created
clusterrolebinding.rbac.authorization.k8s.io/mysql-operator-rolebinding created
clusterkopfpeering.zalando.org/mysql-operator created
namespace/mysql-operator created
serviceaccount/mysql-operator-sa created
deployment.apps/mysql-operator created
Kubernetesのmysql-operatorが正常にデプロイされ、それがreayであることを確認できます。
$ kubectl get deployment mysql-operator --namespace mysql-operator
NAME READY UP-TO-DATE AVAILABLE AGE
mysql-operator 1/1 1 1 35s
MySQL InnoDBクラスタ
アーキテクチャでは、次の2つのネームスペースを作成します。
- web-database: MySQLに関連するすべて
- web-frontend: Webサーバー用
それらを作成する方法は次のとおりです。
$ kubectl create ns web-database
$ kubectl create ns web-frontend
rootのMySQLユーザーのパスワードを作成する必要があります。資格証明を格納するには、K8sシークレット・リソースを使用します:
$ kubectl -n web-database create secret generic mypwds \
--from-literal=rootUser=root \
--from-literal=rootHost=% \
--from-literal=rootPassword="Passw0rd!"
資格証明が正しく作成されたことを確認できます:
$ kubectl -n web-database get secret mypwds
NAME TYPE DATA AGE
mypwds Opaque 3 112s
楽しいので、パスワードをデコードしてみてください(または忘れた場合)。
$ kubectl -n web-database get secret mypwds -o yaml | \
> grep rootPassword | cut -d: -f 2 | xargs | base64 -d
Passw0rd!
最初のMySQL InnoDBクラスタをデプロイするには、YAMLファイル(mycluster.YAML)を作成する必要があります:
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mycluster
spec:
secretName: mypwds
tlsUseSelfSigned: true
instances: 3
router:
instances: 1
また、Webデータベース・ネームスペースにデプロイします。
$ kubectl -n web-database apply -f mycluster.yaml
innodbcluster.mysql.oracle.com/mycluster created
ポッドのステータスを確認できます:
$ kubectl -n web-database get pods
NAME READY STATUS RESTARTS AGE
mycluster-0 2/2 Running 0 80s
mycluster-1 0/2 PodInitializing 0 80s
mycluster-2 0/2 Init:2/3 0 80s
しばらくすると、オペレータによってデプロイされた複数のリソースを確認できます。
MySQL Shellを使用して、MySQLインスタンスに接続するための新しいポッドをデプロイします。ルータ(ポート6446)を介して接続します。
$ kubectl run --rm -it myshell \
--image=container-registry.oracle.com/mysql/community-operator -n web-database -- \
mysqlsh root@mycluster.web-database.svc.cluster.local:6446
If you don't see a command prompt, try pressing enter.
********
また、MySQL Shellでは、wordpressデータベースと専用ユーザーを作成します。
SQL> create database wordpress;
SQL> create user wordpress identified by 'W0rdPress';
SQL> grant all privileges on wordpress.* to wordpress;
WordPress
WordPressをデプロイします。再度、新しいYAMLファイル(wordpress.YAML)を作成します。
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:latest
name: wordpress
env:
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_HOST
value: mycluster.web-database.svc.cluster.local:6446
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_CONFIG_EXTRA # enable SSL connection for MySQL
value: |
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
「mysqliのクライアントSSLの使用を強制することが非常に重要です。そうでない場合、WordPressは、推奨される認証プラグインcaching_sha2_passwordを使用してMySQLユーザーと連携しません。」
デプロイメントは簡単です。
$ kubectl -n web-frontend apply -f wordpress.yaml
また、WordPress Webサーバーを非常に簡単に拡張することもできます。
$ kubectl scale deployment wordpress --replicas=3 -n web-frontend
deployment.apps/wordpress scaled
すべてがデプロイされ、すぐに使用できます。
外部パブリックIPを使用する場合、WordPressインストールの最後のステップに参加します:
私はウェブサイトを訪問するときに私が到達している3つのWebサーバーのどれを確認するためにスニップPHPコードをインストールしました:
3つのWebサーバー間でリクエストをロード・バランシングしていることがわかります。
デプロイした内容は次のとおりです。
まとめ
この投稿では、Kubernetesの公式mysql-operatorを使用して、Oracle Kubernetes Engine (OKE)にWordPressとMySQLを正常にデプロイするための包括的なステップについて説明します。このプロセスにより、データベース管理の複雑なタスクが簡略化され、高可用性の設定に関連する多くの複雑なステップが自動化されます。
MySQL Operator for Kubernetesを使用したOKEでのMySQLデプロイメントに満足しています。
コメント
コメントを投稿