一、背景
在基于kubeasz部署kubernetes高可用集群-CSDN博客文章部署的kubernetes集群上部署LNMP
1.1、Kubernetes环境
1.2、Harbor环境
【docker基础】使用Harbor搭建私有仓库-docker-compose使用示例--第二周作业_harbor docker-compose-CSDN博客
Harbor环境升级:
- 上面文章中提到的harbor,在harbor.yml中域名的位置可以配置成IP地址,这样两台Harbor使用IP实现互相复制、互相备份;
- 前端haproxy+keepalived反向代理两台Harbor机器,实现harbor高可用
- 在阿里云上申请域名解析到keepalived的VIP上,并申请免费ssl证书;
- 将ssl证书文件放到harbor所在的机器上,在harbor.yml文件中配置ssl证书;
1.3、安装配置buildkitd
参考文章:https://www.cnblogs.com/punchlinux/p/16575328.html
buildkitd(服务端),目前支持runc和containerd作为镜像构建环境,默认是runc,可以更换containerd。
buildctl(客户端),负责解析Dockerfile文件、并向服务端buildkitd发出构建请求。
GitHub地址:https://github.com/moby/buildkit/releases
二、构建nginx、php-fpm镜像
2.1、构建nginx镜像
2.1.1、准备nginx镜像需要的文件
2.1.2、编写nginx镜像的Dockerfile
FROM harbor.jnlikai.cc/library/centos:8.4 #基础镜像可以提前下载并上传到自己的harbor上
MAINTAINER "JNLIKAI"
RUN rm -fr /etc/yum.repos.d/* #添加需要的repo文件
ADD Centos-8.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN yum install -y vim wget tree make lrzsz zlib zlib-devel gcc-c++ automake pcre pcre-devel libtool openssl openssl-devel iproute net-tools iotop #安装nginx需要的包
ADD nginx-1.26.0.tar.gz /usr/local/src/ #将nginx源码包添加到镜像的指定目录
RUN cd /usr/local/src/nginx-1.26.0 && ./configure --prefix=/apps/nginx --with-http_sub_module && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx && rm -fr /usr/local/src/nginx-1.26.0.tar.gz #源码安装nginx
RUN useradd nginx -u 2024 #创建nginx用户
ADD nginx.conf /apps/nginx/conf/nginx.conf #将修改好的配置文件打到镜像
RUN mkdir -p /data/nginx/html #创建数据目录
EXPOSE 80 443 #暴露端口
CMD ["/apps/nginx/sbin/nginx","-c","/apps/nginx/conf/nginx.conf","-g","daemon off;"] #运行nginx进程
2.1.3、使用nerdctl+buildkitd打镜像
检查buildkitd服务是否正常运行:
使用nerdctl构建nginx镜像,并上传harbor
2.2、构建php镜像
2.2.1、准备php需要的文件
2.2.2、编写php的Dockerfile
FROM harbor.jnlikai.cc/library/centos:8.4
MAINTAINER "JNLIKAI"
RUN useradd nginx -u 2024 #创建运行php的用户nginx
RUN rm -fr /etc/yum.repos.d/*
ADD Centos-8.repo /etc/yum.repos.d/Centos-8.repo
ADD epel.repo /etc/yum.repos.d/epel.repo
ADD RPM-GPG-KEY-EPEL-8 /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
RUN yum -y install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-8.rpm
RUN yum -y install php83-php-fpm php83-php-mysql #yum安装php相关包
ADD www.conf /etc/opt/remi/php83/php-fpm.d/www.conf #将修改后的配置文件打到镜像里
ADD run_php.sh /usr/local/bin/run_php.sh #运行php的脚本
RUN chmod +x /usr/local/bin/run_php.sh
EXPOSE 9000
CMD ["/usr/local/bin/run_php.sh"] #运行脚本
www.conf是php的配置文件,修改的内容:
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.owner = nginx
listen.group = nginx
run_php.sh脚本内容
2.2.3、构建php镜像,并上传harbor
三、使用deployment部署wordpress
3.1、编写deployment的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: wordpress-deployment
name: wordpress-deployment
namespace: myserver
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress-nginx
image: harbor.jnlikai.cc/library/nginx:v1.26.0 #使用自己构建的nginx镜像
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
- containerPort: 443
protocol: TCP
name: https
volumeMounts:
- name: wordpress #挂载数据目录
mountPath: /data/www/html
readOnly: false
- name: nginx-configmap #使用configmap挂载配置文件
mountPath: /apps/nginx/conf/nginx.conf
subPath: nginx.conf
- name: wordpress-php
image: harbor.jnlikai.cc/library/php-fpm:8.3.7 #使用自己构建的php镜像
imagePullPolicy: Always
ports:
- name: http
protocol: TCP
containerPort: 9000
volumeMounts:
- name: wordpress #挂载数据目录
mountPath: /data/www/html
readOnly: false
volumes:
- name: wordpress #定义数据卷的后台存储(也可以使用pvc)
nfs:
server: 10.49.33.147
path: /data/wordpress
- name: nginx-configmap #引用configmap里的定义的配置文件
configMap:
name: nginx
items:
- key: nginx.conf
path: nginx.conf
---
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress-service
namespace: myserver
spec:
type: NodePort #定义nodeport类型的service
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30080
- name: https
port: 443
protocol: TCP
targetPort: 443
nodePort: 31443
selector:
app: wordpress
数据卷写的数nfs提供,需要在nfs-server上创建目录/data/wordpress,并将该目录的属主数组改成2024(nginx的UID)
3.2、编写配置文件的configmap
在部署调试或业务变更时,需要经常修改nginx的配置文件,所以经nginx的配置文件写到configmap里,这样通过修改configmap就可以达到修改配置文件的目的,不用重新打镜像;
[root@k8s-master1 wordpress]# cat nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx
namespace: myserver
labels:
app: nginx
data:
nginx.conf: |
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /data/www/html;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ \.php$ {
root /data/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
3.3、创建configmap,部署wordpress-deployment
四、访问WordPress页面,完成安装
4.1、使用节点的30080端口即可访问wordpress站点,默认是安装页面
4.2、创建数据库
数据库使用基于StatefulSet控制器在Kubernetes上部署MySQL一主多从-CSDN博客文章部署的数据库集群
4.2.1、首先登陆mysql-0容器,创建wordpress数据库
4.2.2、创建用户,并授权
4.2.3、在安装页面上填写数据库信息
Database Host的位置填写mysql-0的FQDN
4.2.4、完成安装
五、其他补充
5.1、WordPress的数据目录
wordpress的数据目录在wordpress/wp-content/uploads,这个目录下按时间保存站点的附件文件,可以该目录设置持久化存储(PV/PVC),备份附件可以备份该目录
5.2、服务暴露
可以使用ingress、openelb等将服务暴露出去
5.3、对站点进行压测
测试稳定性、或者结合HPA测试自动伸缩