【k8s】WordPress(PHP+nginx+mysql)迁移到k8s【待完善】
一、迁移思路:
二、前期准备
1、下载wordpress源码
2、准备wp-config. php文件,需要修改里面的数据连接信息(使用变量,后期进行替换)、以及Authentication的key
三、wordpress迁移至k8s
1、Dockerfile
FROM centos:7
RUN rpm -Uvh https://miriror.webtatic.com/yum/el7/epel-release.rpm && \\curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirirors.aliyun.com/repo/CentOS-7.repo && \\rpm -Uvh https://miriror.webtatic.com/yum/el7/webtatic-release.rpm && \\yum install nginx php71w-fpm php71w-xs1 php71w php71w-ldap php71w-cli php71w-common php71w-devel php71w-gd php71w-pdo php71w-mysql php71w-mbstring php71w-bcmath php71w-mcrypt -y && \\yum clean all && rm -rf /var/cache/yum/* && \\rm -rf /usr/share/nginx/html
#拷贝代码
COPY . /usr/share/nginx/html#修改权限
RUN useradd -M www && \\sed -i '/^user/c user www;' /etc/nginx/nginx.conf && \\sed -i '/^user/c user = www;' /etc/php-fpm.d/www.conf && \\sed -i '/^group/c group = www;' /etc/php-fpm.d/www.conf && \\chown -R www.www /usr/share/nginx/html /var/lib/nginx
#暴露容器端口
EXPOSE 80COPY entrypoint.sh /
ENTRYPOINT ["bash","/entrypoint.sh"]
2、启动脚本 entrypoint.sh
#运行Wordpress时,可以通过环境变量替换连接数据库相关信息。
WordPress_File=/usr/share/nginx/html/wp-config.phpsed -i s/{DB_NAME}/${DB_NAME:-wordpress}/g ${Wordpress_File}
sed -i s/{DB_USER}/${DB_USER:-wordpress}/g ${Wordpress_File}
sed -i s/{DB_PASSWORD}/{DB_PASSWORD:-wordpress}/g ${Wordpress_File}
sed -i s/{DB_HOST}/${DB_HOST:-localhost}/g ${Wordpress_File}#启动php /nginx
php-fpm && \\
nginx -g "daemon off"
3、构建镜像 、打tag、推送镜像
docker build -t wordpress:v6.0 .
docker tag 9779eee harbor.oldxu.net/base/wordpress:v6.0
docker push harbor.oldxu.net/base/wordpress:v6.0
4、DB服务
4.1 01-mysql-headless.yaml
apiVersion: v1
kind: Service
metadata:name: mysql-svc
spec:clusterIP: Noneselector:app: mysqlports:- port: 3306targetPort: 3306
4.2 02-mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql-svc"replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: dbimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalue: oldxu3957- name: MYSQL_DATABASEvalue: wordpressports:- containerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql/volumeClaimTemplates:- metadata:name: dataspec:accessModes: ["ReadWriteOnce"]storageClassName: "nfs"resources:requests:storage: 6Gi
nginx配置文件 blog.oldxu.net.conf 和转为configmap
server{listen 80;server_name _;root /usr/share/nginx/html;client_max_body_size 100m;location / {index index.php}location ~ \\.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;include fastcgi_params;}
}
#将配置转为 configmap
kubectl create configmap nginxconfs --from-file=blog.oldxu.net.conf
4.3 03-wordpress-secret.yaml (创建连接数据库secret)
apiVersion: v1
kind: Secret
metadata:name: wordpress-secret
stringData:DB_NAME: wordpressDB_USER: rootDB_PASSWORD: oldxu3957DB_HOST: mysql-0.mysql-svc.default.svc.cluster.local
4.4 04-wordpress-pvc.yaml (准备PVC共享图片)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: wordpress-data
spec:storageClassName: "nfs"accessModes:- ReadWriteManyresources:requests:storage: 6Gi
5、wordpress服务
05-wordpress-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress-dp
spec:replicas: 3selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: harbor.oldxu.net/base/wordpress:v6.0ports:- containerPort: 80envFrom:- secretRef:name: wordpress-secretvolumeMounts:- name: configmountPath: /etc/nginx/conf.d/- name: imagesmountPath: /usr/share/nginx/html/wp-content/uploads volumes:- name: configconfigMap:name: nginxconfs- name: imagespersistenVolumeClaim:claimName: wordpress-data
06-wordpress-svc.yaml
apiVersion: v1
kind: Service
metadata: name: wordpress-svc
spec:selector:app: wordpressports:- port: 80targetPort: 80
07-wordpress-ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: wordpress-ingress
spec:ingressClassName: "nginx"rules:- host: wordpress.oldxu.nethttp:paths:- path: /pathType: Prefixbackend:service:name: wordpress-svcport:number: 80
旧版本ingress:
#apiVersion: networking.k8s.io/v1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: wordpress-ingress
spec:ingressClassName: "nginx"rules:- host: wordpress.oldxu.nethttp:paths:- path: /pathType: Prefixbackend:serviceName: myappservicePort: 80#service:# name: wordpress-svc# port:# number: 80