示例:使用持久卷部署 WordPress 和 MySQL
本教程将向您展示如何使用 Minikube 部署 WordPress 网站和 MySQL 数据库。这两个应用程序都使用持久卷和持久卷声明来存储数据。
持久卷 (PV) 是集群中的一块存储空间,由管理员手动配置,或使用存储类在 Kubernetes 中动态配置。持久卷声明 (PVC) 是用户对存储空间的请求,可以由 PV 满足。持久卷和持久卷声明独立于 Pod 生命周期,并在 Pod 重启、重新调度甚至删除时保留数据。
警告
此部署不适合生产环境,因为它使用的是单实例 WordPress 和 MySQL Pod。请考虑使用 WordPress Helm Chart 在生产环境中部署 WordPress。注意
本教程中提供的文件使用 GA 部署 API,并且特定于 kubernetes 版本 1.9 及更高版本。如果您希望将本教程与更早版本的 Kubernetes 一起使用,请相应地更新 API 版本,或参考本教程的早期版本。目标
- 创建持久卷声明和持久卷
- 创建一个包含以下内容的
kustomization.yaml
:- 一个 Secret 生成器
- 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
添加一个 Secret 生成器
Secret 是一个存储敏感数据(如密码或密钥)的对象。从 1.14 开始,kubectl
支持使用 kustomization 文件管理 Kubernetes 对象。您可以通过 kustomization.yaml
中的生成器创建 Secret。
从以下命令中在 kustomization.yaml
中添加一个 Secret 生成器。您需要将 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
环境变量从 Secret 设置数据库密码。
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
环境变量从 Secret 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 ./
现在您可以验证所有对象是否存在。
通过运行以下命令验证 Secret 是否存在
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,或者删除您的实例。
清理
运行以下命令删除您的 Secret、部署、服务和持久卷声明
kubectl delete -k ./
下一步
- 了解有关 自省和调试 的更多信息
- 了解有关 作业 的更多信息
- 了解有关 端口转发 的更多信息
- 了解如何 获取容器的 Shell