使用Kubernetes部署WordPress应用程序

总之

为了更深入地了解Kubernetes,我参与了以下Kubernetes官方教程:
https://kubernetes.io/ja/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

由于仅仅实施可能显得单调乏味,所以我们在推进过程中对理解模糊的部分进行了深入挖掘。

环境

Windows 11
农民工作台:1.8.1

准备

准备以下3个文件。

    1. mysql部署.yaml

 

    1. wordpress部署.yaml

 

    自定义.yaml

1. MySQL部署文件.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels: #「labels」という項目は色々な場所に出てくるので注意が必要。ここではKey=app,value=wordpressというラベルをServiceに付与している。
    app: wordpress
spec:
  ports:
    - port: 3306 #Serviceの3306ポートへのアクセスをPodの3306ポートに紐づける。
  selector:  #ServiceをどのPodと紐づけるかを指定するのがselector。ここではapp: wordpress/tier: mysqlラベルが付与されたPodを紐づけている。
    app: wordpress
    tier: mysql
  clusterIP: None #"None"を指定することで、"Headless"とよばれるServiceになる。Headless Serviceではクラスタ内DNSからPodのIPを取得し、Podに負荷分散する(DNSラウンドロビン)。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress 
spec:
  accessModes:
    - ReadWriteOnce #単一ノードからRead/Writeが可能。
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels: #Deploymentに付与するラベル。
    app: wordpress
spec:
  selector:
    matchLabels: #どのPodをDeploymentの対象とするかを指定する。今回はapp: wordpressとtier: mysqlの2つのラベルを持つPodをDeploymentの対象にしている。
      app: wordpress 
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels: #Podに付与するラベル。spec.selector.matchLabelsと一致している必要がある。
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef: 
              name: mysql-pass 
              key: password #mysql-passというsecretリソースの、passwordというkeyに対応するvalueを取得する
        - name: MYSQL_DATABASE
          value: wordpress #ここではsecretリソースから取得せず、そのままPWをべた書きしている。
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql #マウント先
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

为什么有 PVC 的清单,但没有光伏电池?

由于在PVC清单中未指定StorageClass, 将使用默认的StorageClass。

$ kubectl get sc -A
NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  81d

本地路径(local-path)是一个StorageClass。它从集群创建开始就存在。
PROVISIONER 是 rancher.io/local-path,此 Provisioner 会自动进行 PV 的规划,因此可以不需要明确创建 PV。

另外,在部署清单中没有指定副本集的数量。在这种情况下,我稍后会确认副本集数量和Pod数量。

2. 博客部署.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer #LoadBalancerでは外部疎通性のある仮想IPが払い出されますが、利用できる環境がクラウド環境などに限られるので今回はIPが払い出されません。
---
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:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:6.2.1-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: WORDPRESS_DB_USER
          value: wordpress
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

3. 自定义.yaml文件

Kustomize是一个用于管理Kubernetes清单的工具。
似乎是通过名为kustomization.yaml的文件进行管理。其他名称不可用。

secretGenerator:
- name: mysql-pass
  literals:
  - password=<お好きなパスワードを指定>
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml

创建资源 (CJ01)

在包含三个预先准备好的文件的目录中执行

$ kubectl apply -k ./
secret/mysql-pass-m9tcmtc8h7 created
service/wordpress created
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created
deployment.apps/wordpress created
deployment.apps/wordpress-mysql created

我们将确认资源是否已创建。

秘密

$ kubectl get secret
NAME                    TYPE     DATA   AGE
mysql-pass-m9tcmtc8h7   Opaque   1      2m15s

聚氯乙烯

$ kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE					
wp-pv-claim      Bound    pvc-4334b6cd-9ace-4938-bbdb-064be1e95f6e   20Gi       RWO            local-path     5m33s					
mysql-pv-claim   Bound    pvc-f9f14a60-603c-4d67-8f38-17abd603fc0c   20Gi       RWO            local-path     5m33s					

光伏发电

如前所述,PV已自动创建。
需要说明的是,通过PVC创建的PV的名称以“pvc-”开头。

$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
pvc-4334b6cd-9ace-4938-bbdb-064be1e95f6e   20Gi       RWO            Delete           Bound    default/wp-pv-claim      local-path              5m45s
pvc-f9f14a60-603c-4d67-8f38-17abd603fc0c   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   local-path              5m45s

复制集

每个复制集的数量都是一个。

$ kubectl get rs
NAME                         DESIRED   CURRENT   READY   AGE
wordpress-77f4df4cbc         1         1         1       7m42s
wordpress-mysql-6745f5dc49   1         1         1       7m42s

豆荚

每个Pod数量也都变为了一个。

$ kubectl get pod
NAMESPACE     NAME                                     READY   STATUS      RESTARTS        AGE
default       wordpress-77f4df4cbc-zkh8p               1/1     Running     0               8m1s
default       wordpress-mysql-6745f5dc49-m778z         1/1     Running     0               8m1s

我們將最後再確認是否能夠訪問。

$ kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes        ClusterIP      10.43.0.1       <none>        443/TCP        74d
wordpress         LoadBalancer   10.43.129.204   <pending>     80:30652/TCP   10m
wordpress-mysql   ClusterIP      None            <none>        3306/TCP       10m

WordPress服务的端口为80:30652。
80是负载均衡器的端口,30652是节点的端口。
由于本次负载均衡器没有分配外部IP(待定),因此需要直接访问节点。
节点的IP是172.27.28.244,所以URL为http://172.27.28.244:30652。

画像1.png

请转到以下选项

 

广告
将在 10 秒后关闭
bannerAds