示例:使用持久卷部署 WordPress 和 MySQL
本教程向您展示如何使用 Minikube 部署 WordPress 网站和 MySQL 数据库。这两个应用程序都使用持久卷和持久卷声明来存储数据。
持久卷 (PV) 是集群中的一块存储空间,由管理员手动配置,或者使用存储类动态配置。持久卷声明 (PVC) 是用户对存储空间的请求,可以通过 PV 来满足。持久卷和持久卷声明与 Pod 生命周期无关,并保留数据以应对重启、重新调度甚至删除 Pod。
警告
此部署不适用于生产环境,因为它使用单实例 WordPress 和 MySQL Pod。请考虑使用 WordPress Helm Chart 在生产环境中部署 WordPress。注意
本教程中提供的文件使用 GA 部署 API,特定于 kubernetes 版本 1.9 及更高版本。如果您想将本教程用于更早版本的 Kubernetes,请相应更新 API 版本,或参考本教程的早期版本。目标
- 创建持久卷声明和持久卷
- 创建一个包含以下内容的
kustomization.yaml
文件:- 秘密生成器
- MySQL 资源配置
- WordPress 资源配置
- 通过
kubectl apply -k ./
应用 kustomization 目录。 - 清理
开始之前
您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes 游乐场之一:
要检查版本,请输入kubectl version
。本页面上显示的示例适用于 kubectl
1.27 及更高版本。
下载以下配置文件:
创建持久卷声明和持久卷
MySQL 和 Wordpress 都需要持久卷来存储数据。它们的持久卷声明将在部署步骤中创建。
许多集群环境都安装了默认存储类。当持久卷声明中未指定存储类时,将使用集群的默认存储类。
创建持久卷声明后,将根据存储类配置动态配置持久卷。
警告
在本地集群中,默认存储类使用hostPath
配置器。hostPath
卷仅适用于开发和测试。使用 hostPath
卷时,您的数据位于 Pod 调度到的节点上的 /tmp
中,并且不会在节点之间移动。如果 Pod 死亡并被调度到集群中的另一个节点,或者节点重新启动,则数据将丢失。注意
如果您要启动一个需要使用hostPath
配置器的集群,则必须在 controller-manager
组件中设置 --enable-hostpath-provisioner
标志。注意
如果您在 Google Kubernetes Engine 上运行 Kubernetes 集群,请遵循 本指南。创建一个 kustomization.yaml 文件
添加一个秘密生成器
秘密是一个对象,它存储敏感数据片段,例如密码或密钥。自 1.14 以来,kubectl
支持使用 kustomization 文件管理 Kubernetes 对象。您可以通过 kustomization.yaml
中的生成器创建秘密。
使用以下命令在 kustomization.yaml
中添加一个秘密生成器。您需要将 YOUR_PASSWORD
替换为您要使用的密码。
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
EOF
为 MySQL 和 WordPress 添加资源配置
以下清单描述了一个单实例 MySQL 部署。MySQL 容器将持久卷挂载到 /var/lib/mysql。MYSQL_ROOT_PASSWORD
环境变量从秘密中设置数据库密码。
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: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
以下清单描述了一个单实例 WordPress 部署。WordPress 容器将持久卷挂载到 /var/www/html
,用于网站数据文件。WORDPRESS_DB_HOST
环境变量设置上面定义的 MySQL 服务的名称,WordPress 将通过服务访问数据库。WORDPRESS_DB_PASSWORD
环境变量从 kustomize 生成的秘密中设置数据库密码。
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: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
下载 MySQL 部署配置文件。
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
下载 WordPress 配置文件。
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
将它们添加到
kustomization.yaml
文件中。cat <<EOF >>./kustomization.yaml resources: - mysql-deployment.yaml - wordpress-deployment.yaml EOF
应用和验证
kustomization.yaml
包含部署 WordPress 网站和 MySQL 数据库所需的所有资源。您可以通过以下方式应用该目录:
kubectl apply -k ./
现在您可以验证所有对象是否存在。
通过运行以下命令验证秘密是否存在:
kubectl get secrets
响应应类似于以下内容:
NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s
验证是否动态配置了持久卷。
kubectl get pvc
注意
配置和绑定 PV 可能需要几分钟时间。响应应类似于以下内容:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
通过运行以下命令验证 Pod 是否正在运行:
kubectl get pods
注意
Pod 状态变为RUNNING
可能需要几分钟时间。响应应类似于以下内容:
NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
通过运行以下命令验证服务是否正在运行:
kubectl get services wordpress
响应应类似于以下内容:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m
注意
Minikube 只能通过NodePort
公开服务。EXTERNAL-IP 始终处于挂起状态。运行以下命令获取 WordPress 服务的 IP 地址:
minikube service wordpress --url
响应应类似于以下内容:
http://1.2.3.4:32406
复制 IP 地址,并在浏览器中加载该页面以查看您的网站。
您应该看到类似于以下屏幕截图的 WordPress 设置页面。
警告
不要将您的 WordPress 安装保留在此页面上。如果其他用户找到它,他们可以在您的实例上设置一个网站并使用它来提供恶意内容。
通过创建用户名和密码来安装 WordPress,或者删除您的实例。
清理
运行以下命令删除您的秘密、部署、服务和持久卷声明:
kubectl delete -k ./
下一步
- 详细了解 内省和调试
- 详细了解 作业
- 详细了解 端口转发
- 了解如何 获取容器的 Shell