k8s部署wordpress+mysql+nginx负载

1、基础环境

(1)系统版本

[root@master231]:~/dxl/lb-wp-mysql# cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

(2)持久化目录(nfs)

[root@master231]:~/dxl/lb-wp-mysql# showmount -e
Export list for master231:
/data 10.0.0.231/24
[root@master231]:~/dxl/lb-wp-mysql# ll /data/ -A
total 8
drwxr-xr-x 8 lxd      root     4096 Mar 11 16:30 mysql/
drwxr-xr-x 5 www-data www-data 4096 Feb  4  2025 wp/

(3)k8s版本

[root@master231]:~/dxl/lb-wp-mysql# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.17", GitCommit:"953be8927218ec8067e1af2641e540238ffd7576", GitTreeState:"clean", BuildDate:"2023-02-22T13:33:14Z", GoVersion:"go1.19.6", Compiler:"gc", Platform:"linux/amd64"}

[root@master231]:~/dxl/lb-wp-mysql# kubelet --version
Kubernetes v1.23.17

[root@master231]:~/dxl/lb-wp-mysql# kubectl get nodes
NAME        STATUS   ROLES                  AGE     VERSION
master231   Ready    control-plane,master   4d21h   v1.23.17
worker232   Ready    <none>                 4d21h   v1.23.17
worker233   Ready    <none>                 4d21h   v1.23.17

2、目录结构

[root@master231]:~/dxl/lb-wp-mysql# ll -A
total 16
-rw-r--r-- 1 root root 2685 Mar 11 15:52 mysql-wordpress-service.yaml	#k8s编排文件
-rw-r--r-- 1 root root  645 Mar 11 16:22 lb.conf								#负载均衡配置文件
-rw-r--r-- 1 root root  132 Mar 11 15:38 lb-docker-compose.yaml					#构建管理文件
-rw-r--r-- 1 root root  210 Mar 11 14:45 nginx-lb-dockerfile					#镜像构建文件

3、lb.conf

upstream wp_pool {
  server wordpress-svc:80;
}

server {
  listen 80;
  server_name wordpress.dxl.com;

  location / {
    proxy_pass http://wp_pool;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
  }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

作用:数据转发给后端wordpress容器

注意:在k8s编排文件中定义了wordpress的service,命名为wordpress-svc,要保持一致

4、nginx-lb-dockerfile

FROM 10.0.0.250/nginx/nginx:1.28.2-alpine

LABEL auther=dxl \
      description=wordpress-lb

RUN rm -rf /etc/nginx/conf.d/default.conf
COPY lb.conf /etc/nginx/conf.d/lb.conf

CMD ["nginx","-g","daemon off;"]

作用:构建镜像,使用镜像为alpine版本的镜像,体积小

5、lb-docker-compose.yaml

services:
  wordpress-lb:
    build:
      context: .
      dockerfile: nginx-lb-dockerfile
    image: 10.0.0.250/nginx/nginx-lb:v1

作用:构建命令代码化,然后执行docker-compose -f lb-docker-compose.yaml build构建镜像10.0.0.250/nginx/nginx-lb:v1并执行docker push 10.0.0.250/nginx/nginx-lb:v1推送到仓库

注意:本文件可不写,直接运行docker build -t 10.0.0.250/nginx/nginx-lb:v1 -f nginx-lb-dockerfile .(#点为当前目录,不可不写)替换docker-compose命令

6、mysql-wordpress-service.yaml

apiVersion: apps/v1

kind: Deployment

metadata:
  name: deploy-db

spec:
  replicas: 1
  selector:
    matchExpressions:
    - key: app
      values:
      - mysql
      operator: In
    - key: version
      values:
      - v1
      operator: In
  template:
    metadata:
      labels:
        app: mysql
        version: v1
    spec:
      containers:
      - name: mysql
        image: 10.0.0.250/wp_mysql/mysql:v1
        env:
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        - name: MYSQL_DATABASE
          value: "wordpress"
        - name: MYSQL_USER
          value: "dxl"
        - name: MYSQL_PASSWORD
          value: "dxl123!@#"
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql
      volumes:
      - name: mysql
        nfs:
          path: /data/mysql
          server: 10.0.0.231

---

apiVersion: v1

kind: Service

metadata:
  name: db-svc

spec:
  type: ClusterIP
  selector:
    app: mysql
  ports:
  - port: 3306

---

apiVersion: apps/v1

kind: Deployment

metadata:
  name: deploy-wordpress

spec:
  replicas: 3
  selector:
    matchExpressions:
    - key: app
      values:
      - wordpress
      operator: In
    - key: version
      values:
      - v1
      operator: In
  template:
    metadata:
      labels:
        app: wordpress
        version: v1
    spec:
      containers:
      - name: wordpress
        image: 10.0.0.250/wp_mysql/wordpress:v1
        env:
        - name: WORDPRESS_DB_HOST
          value: "db-svc:3306"
        - name: WORDPRESS_DB_USER
          value: "dxl"
        - name: WORDPRESS_DB_PASSWORD
          value: "dxl123!@#"
        - name: WORDPRESS_DB_NAME
          value: "wordpress"
        volumeMounts:
        - name: wordpress
          mountPath: /var/www/html
      volumes:
      - name: wordpress
        nfs:
          server: 10.0.0.231
          path: /data/wp
---

apiVersion: v1

kind: Service

metadata:
  name: wordpress-svc

spec:
  type: ClusterIP
  selector:
    app: wordpress
  ports:
  - port: 80

---

apiVersion: apps/v1

kind: Deployment

metadata:
  name: deploy-lb

spec:
  replicas: 1
  selector:
    matchExpressions:
    - key: app
      values:
      - lb
      operator: In
    - key: version
      values:
      - v1
      operator: In
  template:
    metadata:
      labels:
        app: lb
        version: v1
    spec:
      containers:
      - name: wp-lb
        image: 10.0.0.250/nginx/nginx-lb:v1

---

apiVersion: v1

kind: Service

metadata:
  name: lb-svc

spec:
  type: NodePort
  selector:
    app: lb
  ports:
  - port: 80
    nodePort: 30080 

代码内容
1、deploy-db部分:创建1副本mysql,标签app: mysql用于绑定service:db-svc,数据保存目录/var/lib/mysql持久化到nfs目录/data/mysql

2、db-svc部分:创建ClusterIP类service,内部暴露端口3306,绑定deploy-db

3、deploy-wordpress部分:创建3副本wordpress,实现负载均衡,标签app: wordpress用于绑定service:wordpress-svc,数据保存目录/var/www/html持久化到nfs目录/data/wp,通过service:db-svc连接到数据库,其余变量保存与deploy-db一致

4、wordpress-svc部分:创建ClusterIP类service,内部暴露端口3306,绑定deploy-wordpress

5、deploy-lb部分:创建1副本lb,使用刚刚生成的镜像,用于负载均衡,标签app: lb用于绑定service:lb-svc进行外部访问,内部通过wordpress-svc(配置在了lb.conf文件中)连接后端wordpress

6、lb-svc部分:创建NodePort类service,内部暴露80、外部暴露3306,绑定deploy-lb

7、运行

kubectl apply -f mysql-wordpress-service.yaml

8、检查

[root@master231]:~# kubectl get all -o wide
NAME                                    READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-db-6b4969f857-6pjjd          1/1     Running   0          12m   10.100.1.99    worker232   <none>           <none>
pod/deploy-lb-7dd4cbd9fb-fpzdj          1/1     Running   0          12m   10.100.1.100   worker232   <none>           <none>
pod/deploy-wordpress-7cc48776c5-c4bhm   1/1     Running   0          12m   10.100.1.102   worker232   <none>           <none>
pod/deploy-wordpress-7cc48776c5-klmvr   1/1     Running   0          12m   10.100.2.65    worker233   <none>           <none>
pod/deploy-wordpress-7cc48776c5-x5z2p   1/1     Running   0          12m   10.100.1.101   worker232   <none>           <none>

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/db-svc          ClusterIP   10.200.40.69     <none>        3306/TCP       12m    app=mysql
service/kubernetes      ClusterIP   10.200.0.1       <none>        443/TCP        2d2h   <none>
service/lb-svc          NodePort    10.200.25.247    <none>        80:30080/TCP   12m    app=lb
service/wordpress-svc   ClusterIP   10.200.208.173   <none>        80/TCP         12m    app=wordpress

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                             SELECTOR
deployment.apps/deploy-db          1/1     1            1           12m   mysql        10.0.0.250/wp_mysql/mysql:v1       app in (mysql),version in (v1)
deployment.apps/deploy-lb          1/1     1            1           12m   nginx-lb     10.0.0.250/nginx/nginx-lb:v1       app in (lb),version in (v1)
deployment.apps/deploy-wordpress   3/3     3            3           12m   wordpress    10.0.0.250/wp_mysql/wordpress:v1   app in (wordpress),version in (v1)

NAME                                          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                             SELECTOR
replicaset.apps/deploy-db-6b4969f857          1         1         1       12m   mysql        10.0.0.250/wp_mysql/mysql:v1       app in (mysql),pod-template-hash=6b4969f857,version in (v1)
replicaset.apps/deploy-lb-7dd4cbd9fb          1         1         1       12m   nginx-lb     10.0.0.250/nginx/nginx-lb:v1       app in (lb),pod-template-hash=7dd4cbd9fb,version in (v1)
replicaset.apps/deploy-wordpress-7cc48776c5   3         3         3       12m   wordpress    10.0.0.250/wp_mysql/wordpress:v1   app in (wordpress),pod-template-hash=7cc48776c5,version in (v1)

9、浏览器访问

wordpress.dxl.com:30080
image

10、补充:脚本运行

不要lb-docker-compose.yaml文件,直接脚本运行

(1)apply.sh

#!/bin/bash
docker build -t 10.0.0.250/nginx/nginx-lb:v1 -f nginx-lb-dockerfile . && \
docker push 10.0.0.250/nginx/nginx-lb:v1 && \
kubectl apply -f mysql-wordpress-service.yaml

(2)sh apply.sh

posted @ 2026-03-11 21:10  dxl_xiaoyi  阅读(2)  评论(0)    收藏  举报