跳到主要内容

搭建你的 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 进行升级或者调度操作。