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

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
浙公网安备 33010602011771号