MySQL Operator for Kubernetesを使用してOKEにWordPressおよびMySQLをデプロイする方法 (2023/12/23)

MySQL Operator for Kubernetesを使用してOKEにWordPressおよびMySQLをデプロイする方法 (2023/12/23)

https://blogs.oracle.com/mysql/post/how-to-deploy-wordpress-and-mysql-on-oke-using-mysql-operator-for-kubernetes-advent

投稿者: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デプロイメントに満足しています。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)