Kubernetes基于LNMP搭建wordpress

一:介绍

结构图

Kubernetes基于LNMP搭建wordpress
lnmp架构图

服务器结构:

192.168.1.10 k8s-master
192.168.1.11 k8s-node01
192.168.1.12 k8s-node02
192.168.1.13 nfs

二:安装

Docker镜像下载

php 需要制作dockerfile,其他镜像可以使用pull直接拉取:

链接:https://pan.baidu.com/s/1IUxEAoNq6uEEKmudxsNDag
提取码:dmwa

k8s-master制作php-fpm镜像

安装解包后:

Kubernetes基于LNMP搭建wordpress

docker build -t php:latest .

将景象打包传送到两台节点(k8s-node01 k8s-node02 ):

docker save -o php.tar php:lastest

scp nginx.tar root@其他节点IP:目录

在另外两台node上操作:

docker load -i php.tar

加载镜像:

docker save -o php.tar php:latest

注:这里在生产环境中如果有多个node,建议创建私有镜像仓库并配置似有仓库密钥在master端方式

安装nfs

# 安装依赖包
yum install -y nfs-common nfs-utils rpcbind
# 创建共享目录
mkdir -p /opt/nfs/wp-data && mkdir -p /opt/nfs/mysql-data
# nfs配置文件
cat <<EOF>/etc/exports
/opt/nfs/mysql-data *(rw,no_root_squash,no_all_squash,sync)
/opt/nfs/wp-data *(rw,no_root_squash,no_all_squash,sync)
EOF
#启动服务:
systemctl start rpcbind
systemctl start nfs

检测:

showmount -e [192.168.1.13(其他服务器测试需要在此处填写nfs服务器IP)]

Kubernetes基于LNMP搭建wordpress

mysql-data用于存储mysql相关数据,wp-data用于存储wordpress相关数据

k8s三台集群节点,安装下nfs客户端即可

yum install -y nfs-utils
systemctl start nfs

创建PV

在master节点创建一个yaml目录

mkdir lnmp && cd lnmp

创建三个pv,一会通过标签选择器apps: blog-* 和 存储类名storageClassName: blog-* 进行选择,这里注意nginx和php共享目录都为wp-data目录

vi pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: blog-mysql-pv
  labels:
    apps: blog-mysql
  storageClassName: blog-mysql
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: "/opt/nfs/mysql-data"
    server: 192.168.1.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: blog-php-pv
  labels:
    apps: blog-php
  storageClassName: blog-php
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /opt/nfs/wp-data
    server: 192.168.1.13
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: blog-nginx-pv
  labels:
    apps: blog-nginx
  storageClassName: blog-nginx
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /opt/nfs/wp-data
    server: 192.168.1.13

kubectl apply -f pv.yaml

Kubernetes基于LNMP搭建wordpress

安装mysql

创建mysql密码的认证 (secret)
例如:创建一个secret名字叫做mysql-password 内容为password=123456
kubectl create secret generic mysql-pass --from-literal=password=123456

创建mysql的svc,暴露端口3306,deployment部署方式,镜像使用mysql5.7注入环境变量MYSQL_ROOT_PASSWORD实现通过root身份+secret登入,通过blog-mysql-pvc绑定blog-mysql-pv实现/var/lib/mysql目录和nfs的mysql-data目录共享

vi mysql-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: blog-mysql-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: blog-mysql
  selector:
    matchLabels:
      apps: blog-mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
            # value: password
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: blog-mysql-pvc

进入pod创建一个wordpress数据库:

我的pod是mysql-748c849595

kubectl exec -it mysql-748c849595-rbxjd -- bash

mysql -uroot -p123456

登入后:

create database wordpress;

show databases;

Kubernetes基于LNMP搭建wordpress

补充:如果希望其他用户登陆数据库,例如某些版本禁止root身份登入,可以额外创建一个用户,并使用创建的用户登录:

create user wp;
grant all on wordpress.* to 'wp'@'%' identified by '123456';
flush privileges;
SELECT user,host FROM mysql.user; 
Kubernetes基于LNMP搭建wordpress

安装php

vi php-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-php
  labels:
    app: wordpress
spec:
  ports:
    - port: 9000
  selector:
    app: wordpress-php
    tier: frontend
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: blog-php-pvc
  labels:
    app: wordpress
spec:
  storageClassName: blog-php
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      apps: blog-php
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-php
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-php
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-php
        tier: frontend
    spec:
      containers:
      - name: php
        image: php:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9000
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: blog-php-pvc

kubectl apply -f php-deployment.yaml

安装nginx

vi nginx.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-wp-config
data:
  default.conf: |-
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.html index.php;

        location ~ \.php$ {
            root /usr/share/nginx/html;
            fastcgi_pass blog-php:9000;
            fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_connect_timeout 60s;
            fastcgi_read_timeout 300s;
            fastcgi_send_timeout 300s;
        }
    }
---
apiVersion: v1
kind: Service
metadata:
  name: blog-nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
  selector:
    app: blog-nginx
    tier: frontend
  type: NodePort
  sessionAffinity: ClientIP
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pv-claim
spec:
  storageClassName: nfs-nginx
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blog-nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blog-nginx
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: blog-nginx
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: nginx
        volumeMounts:
        - name: nginx-persistent-storage
          mountPath: /usr/share/nginx/html
        - name: config
          mountPath: /etc/nginx/conf.d/default.conf
          subPath: default.conf
      volumes:
      - name: nginx-persistent-storage
        persistentVolumeClaim:
          claimName: nginx-pv-claim
      - name: config
        configMap:
          name: nginx-wp-config

kubectl apply -f nginx-deployment.yaml

检测:

检查运行,此时mysql php nginx都应该在running状态,如果mysql处于error状态或者是crashLoopback,删除掉pod让deployment重新跑起来

Kubernetes基于LNMP搭建wordpress

部署后检测pv和pvc都是Bound状态:

Kubernetes基于LNMP搭建wordpress

nfs添加wordpress

wget https://cn.wordpress.org/wordpress-4.1-zh_CN.tar.gz
tar xf wordpress-4.1-zh_CN.tar.gz
cp -a wordpress/* /opt/nfs/wp-data/
chown -R nobody /opt/nfs/wp-data
# 如果遇到权限问题可以尝试修改目录权限 chmod -R 777 /opt/nfs/ # 这条命令加上可以开通所有nobody的读写权限,生产环境慎用
Kubernetes基于LNMP搭建wordpress

安装wordpress

查看端口:

Kubernetes基于LNMP搭建wordpress

http://192.168.1.11:32563/

Kubernetes基于LNMP搭建wordpress
Kubernetes基于LNMP搭建wordpress

注:如果使用其他用户登录数据库填写:

Kubernetes基于LNMP搭建wordpress
Kubernetes基于LNMP搭建wordpress

创建站点、管理员,邮箱,进行安装

Kubernetes基于LNMP搭建wordpress

wp管理员登录:

Kubernetes基于LNMP搭建wordpress

发布者:LJH,转发请注明出处:https://www.ljh.cool/5033.html

(0)
上一篇 2021年7月10日 下午9:42
下一篇 2021年7月21日 上午12:04

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注