搭建你的 K3s 环境 -- 部署 WordPress
目录
前面我们介绍了使用 K3sup 快速构建一个 K3s 的集群环境,这篇文章会使用 wordpress 作为一个案例,在我们构建好的 K3s 集群中部署 wordpress 并配置相应的负载均衡服务。
本文的假设是你已经对 Kubernetes 基础知识有一定的理解,知道 Pod,Service,ConfigMap,Secret,Volume 等基本概念,对 YAML 配置文件的语法有一定理解,合理运用互联网,相信我们每个人对于这些基本内容的理解能够快速上手。
WordPress 简介 #
Wordpress 作为全球广泛最流行的开源内容管理系统(CMS),支持了数百万的个人博客、企业网站甚至是大型新闻门户,并且本身提供极为灵活的插件体系,可以通过选择不同的主题和插件来个性化你的网站。Wordpress 一直都是快速构建网站的最佳选项之一。 我们假设已经有了一个运行中的 K3s 集群,并且可以通过 kubectl 访问。如果你还未设置 K3s 环境,可以参考我们以前的文章进行安装和配置。 通过K3s和WordPress的结合,我们不仅能体验到Kubernetes强大的容器编排能力,还能实践如何将现实中的应用部署到 K3s 环境。
部署 WordPress 到 K3s 集群 #
本文部署 WordPress 的方式仅用于演示作用,请勿拿来用作生产环境脚本。演示中很多配置出于简化的目的都是采用较原始的方式进行。
首先在你的机器上创建一个新的目录,这个目录会用于存储接下来的配置文件,我们姑且叫这个目录为 k3s-wordpress
,我推荐使用 git 的方式来管理这个目录,这样当碰到什么问题的时候,随时可以回溯到上一个版本。
部署 MySQL 数据库 #
在 k3s-wordpress
目录下创建 mysql
目录,并分别创建配置文件,创建之后的目录结构如下:
k3s-wordpress/
└── mysql/
├── configmap.yaml
├── secret.yaml
├── statefulset.yaml
├── pv-claim.yaml
└── service.yaml
- 配置文件
使用 Kubernetes 的 ConfigMap 来管理 MySQL 的配置文件,
configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
data:
my.cnf: |
[mysqld]
max_connections = 200
- 用户名密码
使用 Kubernetes 的 Secret 来存储 MySQL 的用户名和密码。
secret.yaml
:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
username: d29yZHByZXNz
password: cGFzc3dvcmQ=
- 存储卷
使用Persistent Volume来存储数据库数据,以确保Pod重新启动时数据不会丢失,
pv-claim.yaml
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data/mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- Pod配置
为了确保数据的持久性,可以使用StatefulSet来部署MySQL的Pod,
statefulset.yaml
:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-pv
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-pv
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- 创建 MySQL 服务暴露给集群中其他应用
创建一个 Service 来暴露 MySQL 数据库服务,允许其他 Pod 进行连接,
service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
- 运行部署命令
kubectl apply -f ./mysql/
部署 WordPress #
在 k3s-wordpress
目录下创建 wordpress
目录,并分别创建配置文件,创建之后的目录结构如下:
k3s-wordpress/
└── wordpress/
├── deployment.yaml
└── service.yaml
- 定义 WordPress 的 Deployment 资源,
deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 2
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 80
- 定义 Service 资源,以在集群内部暴露 WordPress 前端,
service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
spec:
type: NodePort
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
nodePort: 30080
- 运行部署命令
kubectl apply -f ./wordpress/
验证部署 #
- 检查Pod状态
使用
kubectl get pods
确保所有Pod都处于 Running 状态。 - 访问WordPress页面
访问
http://<master-node-ip>:30080/
并进行验证。 - 检查数据库连接 进入 WordPress 容器内,使用 MySQL 客户端工具检查与 MySQL 的连接是否成功。
- 查看日志
通过
kubectl logs
命令查看 WordPress 和 MySQL 的日志,以便于排查任何潜在问题。
总结 #
使用集群部署的好处显而易见,上面我们将 wordpress 的 replicas 初始值设置为 2,也就是说同时有两个wordpress节点会接收用户的请求,当预计的访问量会增大时,我们可以使用 Kubernetes 的 Horizontally Pod Autoscaler (HPA) 来配置自动扩展,能快速的利用 Kubernetes 集群在多节点,多 pod 的环境处理需求,同时我们在更新维护操作的时候,也能同时对这些 pod 进行升级或者调度操作。