IT 铁人赛 k8s 入门30天 -- day23 k8s task Deploying WordPress and MySQL with Persistent Volumes

前言

参考文件 https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

今天将会透过 kustomize 来布署 WordPress 以及 MySQL

由於这边是使用 local 的 minikube

所以对於 PersistentVolumeCliams 将会使用 hostPath 这种 StorageClass

布署目标

1 建立 PersistentVolumClaims 与 PersistentVolume

2 建立 kustomization.yaml 里面设定下面几个资源:

  • SecretGenerator
  • MySQL resource configs
  • WordPress resource configs

3 利用 kustomization.yaml 布署整个环境

4 清除布署

建立 PersistentVolumClaims 与 PersistentVolume

MySQL 跟 WordPress 都需要 PersistentVolume 来储存资料

而这两个的 PersistentVolumeClaim 都会在各自的 Deployment 档案来宣告

关於 PersistentVolume 这边是透过 StorageClass 来处理

如同之前章节 day12 Persisting Data in K8s with Volumes 所描述

StorageClass 就是由 k8s Administrator 预先定义好的 Storage 配置方式, 当 Deployment 发出 PersistentVolumeClaim, k8s cluster 就会自动配置 PersistentVolume 给 PersistentVolumeClaim 元件让 Deployment 使用

而在 local cluster 预设是使用 hostPath 的 StorageClass

使用 hostPath 这种 StorageClass, k8s cluster 会把资料存放在 Pod 所在结点的 /tmp 资料夹, 而当 Pod 死掉在其他结点启动或是结点重启都会让资料消失

因此 hostPath 只适合用来测试环境

建立 kustomization.yaml

建立 kustomization.yaml

首先设定 secretGenerator 来建立 Secret

这个 Secret 会用在 MySQL 跟 WordPress 的 Deployment 内 如下:

secretGenerator:
- name: mysql-pass
  literals:
  - password=mypassword

建立 mysql-deployment.yaml 如下:

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_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

设定一个内部 Service 给 mysql-wordpress

设定 PersistentVolumeClaim 给名称为 mysql-pv-claim 并且设定容量为 20Gi

建立一个 Depylotment

名称设定为 mysql-wordpress

设定 Deployment 使用 mysql-pv-claim 并且挂载在 /var/lib/mysql

设定 Deployment 使用 image: mysql:5.6

设定 Deployment 从 Secret mysql-pass 带入 password 值到环境变数 MYSQL_ROOT_PASSWORD

建立 wordpress-deployment.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:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim

设定一个外部 Service 给 wordpress

设定 PersistentVolumeClaim 给名称为 wp-pv-claim 并且设定容量为 20Gi

建立一个 Depylotment

名称设定为 wordpress

设定 Deployment 使用 wp-pv-claim 并且挂载在 /var/www/html

设定 Deployment 使用 image: wordpress:4.8-apache

设定 Deployment 从 Secret mysql-pass 带入 password 值到环境变数 WORDPRESS_DB_PASSWORD

设定 Deployment Container 环境变数 WORDPRESS_DB_HOST = wordpress-mysql

新增上面的两个 resources 到 kustomization.yaml

新增 mysql-deployment.yaml 与 wordpress-deployment.yaml 到 kustomization.yaml 如下

secretGenerator:
- name: mysql-pass
  literals:
  - password=mypassword
resources:
  - mysql-deployment.yaml
  - wordpress-deployment.yaml

利用 kustomization.yaml 布署整个环境

在与 kustomization.yaml 同一个资料夹下

利用以下指令做布署:

kubectl apply -k ./

透过以下指令验证 Secret 布署

kubectl get secrets

透过以下指令验证 PersistentVolumeCliam 布署

kubectl get pvc

透过以下指令验证 Pod 布署

kubectl get pod

透过以下指令验证 wordpress 对外的 Service 布署

kubectl get services wordpress

因为是 minikube 所以需要透过以下指令把 wordpress Service attach 到一个对外 IP

minikube service wordpress --url

透过这个对外 IP 我们就可以使用浏览器连线到 WordPress 了

清除布署

透过 kustomization.yaml 可以使用以下指令清除所有布署

kubectl delete -k ./


<<:  [从0到1] C#小乳牛 练成基础程序逻辑 Day 22 - 泛型集合 List<T>

>>:  t test vs ANOVA

VoK 系统功能权责划分 ( I ) - day13

权责划分 续VoK整合登入 当使用者登入系统後,无论是因为使用者权责亦或是为了系统安全,通常会建立适...

Day 30 - Finite State Machine x XState 推荐学习资源

说到学习资源,最容易学习的方式就是从母语开始 中文文章 Jerry Hong 的部落格 Jerry ...

Laravel帮你做好的会员登入系统

前言 Laravel有帮你做好会员登入系统的模组,如果有需要的话,可以快速生成。 但详细的运作细节我...

013-状态

到今天最大的困难,好像变成了想主题要写什麽。 来介绍一下做出一个元件後,基本上可以衍伸的思考可能会有...

Day 26 「一个巨星的诞生」Entity、Repository 与单元测试

通常一个活动,最後登场的都是主角吧?理应如此,笔者记得有一年的金马奖颁奖典礼,主办单位不知道哪根筋打...