注:如果需要比较简单的docker-compose搭建方式,请看这个教程:
前提:你已经拥有一个 Kubernetes 的集群。 如果你还没有集群,可以参考:
2.k3s 搭建集群
步骤一览:
- 创建 PersistentVolumeClaims 和 PersistentVolumes
- 创建 “
kustomization.yaml
” 以使用- Secret 生成器
- MySQL 资源配置
- WordPress 资源配置
- “
kubectl apply -k ./
” 来应用整个 kustomization 目录 - 清理
准备工作:
MySQL 和 WordPress 都需要一个 PersistentVolume 来存储数据。 它们的 PersistentVolumeClaims 将在部署步骤中创建。
许多集群环境都安装了默认的 StorageClass。如果在 PersistentVolumeClaim 中未指定 StorageClass, 则使用集群的默认 StorageClass。
创建 PersistentVolumeClaim 时,将根据 StorageClass 配置动态制备一个 PersistentVolume。
在数据库的部分指定 StorageClass,将数据存储在指定地点。
1. kustomization
使用 kustomization.yaml 创建 Secret 生成器,并管理资源resources:
secretGenerator: - name: mysql-pass literals: - password=YOUR_PASSWORD resources: - mysql-deployment.yaml - wordpress-deployment.yaml
2.MySQL
以下yaml文件描述的是一个单实例的 MySQL Deployment。
MySQL 容器将 PersistentVolume 挂载在 /var/lib/mysql
(容器内部的挂载路径) ,
MYSQL_ROOT_PASSWORD
环境变量根据 Secret 设置数据库密码。
pv 和 pvc 指定 StorageClass,将数据存储在指定地点,对应 hostPath 的路径 “/mnt/data” (持久卷的实际存储位置):
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: PersistentVolume metadata: name: mysql-pv-volume labels: type: local spec: storageClassName: manual # 指定 StorageClass capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data" # 指定主机上的路径 "/mnt/data" 作为数据卷的路径 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim labels: app: wordpress spec: storageClassName: manual # 指定 StorageClass accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- 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:8.0 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password - name: MYSQL_DATABASE value: wordpress - 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
3.WordPress
以下yaml文件描述的是一个单实例 WordPress Deployment。
WordPress 容器将 PersistentVolume 挂载到 /var/www/html
,用于保存网站数据文件。
WORDPRESS_DB_HOST
环境变量设置上面定义的 MySQL Service 的名称,WordPress 将通过 Service 访问数据库。
WORDPRESS_DB_PASSWORD
环境变量根据使用 kustomize 生成的 Secret 设置数据库密码。
apiVersion: v1 kind: Service metadata: name: wordpress labels: app: wordpress spec: ports: - name: http # 定义名为 http 的端口 port: 80 # Service 监听的端口号为 80 targetPort: 80 # Service 转发流量到 Pod 的端口号为 80 - name: https # 定义名为 https 的端口 port: 443 # Service 监听的端口号为 443 targetPort: 443 # Service 转发流量到 Pod 的端口号为 443 selector: app: wordpress tier: frontend --- kind: Ingress # 创建 Ingress 资源 apiVersion: networking.k8s.io/v1 metadata: name: &name wordpress # 引用锚点指定的名称 namespace: default annotations: traefik.ingress.kubernetes.io/router.entrypoints: web,websecure # Traefik 路由入口配置 spec: rules: - host: blog.netvps.top # 定义访问 Ingress 的域名 http: paths: - path: / # 匹配路径为/ pathType: Prefix # 路径类型为前缀匹配 backend: service: name: *name # 引用锚点指定的 Service 名称 port: name: http # 引用锚点指定的端口名称 tls: - secretName: default # 使用名为 default 的 TLS 证书密钥对,用于 HTTPS 访问 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wp-pv-claim labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- 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
4.部署
目录结构:
kustomization.yaml
包含用于部署 WordPress 网站以及 MySQL 数据库的所有资源。你可以通过以下方式应用它:
kubectl apply -k ./
成功部署:
访问域名,就可以看到WordPress界面:
5.卸载
运行以下命令可以删除对应的 Secret、Deployment、Service 和 PersistentVolumeClaims:
kubectl delete -k ./
参考: