wordpress是使用PHP语言开发的博客平台,也是一款主流的网站内容管理管理系统(cms).wordpress官方给出的docker部署部署方式中,在运行wordpress容器是需要传入数据库地址、用户名密码等信息,如果通过kubernetes的方式去编排也需要将数据的信息传入容器中。
# dockerhub中wordpress使用外部数据运行示例
$ docker run --name some-wordpress -e WORDPRESS_DB_HOST=10.1.2.3:3306 \
-e WORDPRESS_DB_USER=... -e WORDPRESS_DB_PASSWORD=... -d wordpress
一、wordpress和mysql运行在一个pod中
将wordpress和mysql部署在一个pod中时,因为这两个服务共享同一个网络名称空间,即他们使用同一个IP地址,所以部署起来也比较容易,只需要将相关的参数传入容器中即可。但是需要注意的是需要将mysql的数据存储目录挂载在外面。
# 为wordperss创建一个单独的名称空间
apiVersion: v1
kind: Namespace
metadata:
name: wordpress
---
# 创建pod
apiVersion: v1
kind: Pod
metadata:
name: wordpress
namespace: wordpress
spec:
containers:
- name: wordpress
image: wordpress
ports:
- containerPort: 80
name: wdport
env:
- name: WORDPRESS_DB_HOST
value: localhost:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
- name: mysql
image: mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: dayi123
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: db
mountPath: /var/lib/mysql
volumes:
- name: db
hostPath:
path: /var/lib/mysql
二、将mysql和wordpress分开部署,并通过pod控制器去管理
由于mysql是一个有状态的应用,如果将wordpress和mysql放在同一个Pod中通过ReplicaSet、Deployment等控制器去运行多个副本时,各个pod副本中数据是不一致的,如果需要运行多个pod副本,需要将mysql和wordpress通过不同的pod控制器去管理。如果需要运行mysql集群可以通过StatefulSet控制器来实现,wordpress可以通过deployment控制器实现运行多个副本。此处,我们将mysql通过deployment控制器实现运行单个节点。
首先,我们需要创建MySQL的deployment控制器运行单个mysql。
其次,pod中的mysqlIP地址也不是固定,说不定在某次重启后悔发生变化。所以,需要为mysql创建一个Headless类型service,wordpress可以通过service名称去访问mysql数据库。
最后,是为wordpress创建deployment控制器,根据自己需求运行多个wordpress副本,再为WordPress创建一个NodePortl类型的service,可通过外面访问测试。
# 创建一个单独的名称空间
---
apiVersion: v1
kind: Namespace
metadata:
name: wordpress
# 创建mysql的deployment控制器
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: wordpress
name: word-mysql
labels:
app: wordpress-mysql
spec:
replicas: 1
selector:
matchLabels:
name: wordpress-mysql
template:
metadata:
labels:
name: wordpress-mysql
spec:
containers:
- name: wordpress-mysql
image: mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: rootPassW0rd
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: db
mountPath: /var/lib/mysql
volumes:
- name: db
hostPath:
path: /var/lib/mysql
# 为mysql创建一个service
---
# mysql service
apiVersion: v1
kind: Service
metadata:
name: wpmysql
namespace: wordpress
spec:
clusterIP: None
selector:
name: wordpress-mysql
ports:
- name: mysqlport
protocol: TCP
port: 3306
targetPort: 3306
# 创建Wordpress的deployment控制器
---
# wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
name: word-deploy
namespace: wordpress
labels:
name: wordpress-web
spec:
replicas: 1
selector:
matchLabels:
name: wordpress-web
template:
metadata:
labels:
name: wordpress-web
spec:
containers:
- name: wordpress-web
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdwebport
env:
- name: WORDPRESS_DB_HOST
value: wpmysql:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
# 为wordpress创建service
---
# wordpress-web service
apiVersion: v1
kind: Service
metadata:
namespace: wordpress
name: wd-web-svc
spec:
selector:
name: wordpress-web
ports:
- name: wd-web-port
port: 80
protocol: TCP
type: NodePort
三、WordPress连接kubernetes集群外的mysql
一般情况下,由于数据库的数据量比较大,另一方面要考虑安全性、性能等问题,有些场景下不会讲数据库部署在kubernetess集群中。在这种情况下我们可以通过endpoints将数据库引入kubernetess集群中,再为endpoints创建一个service资源,各pod可以通过service去连接数据库。
# 在数据库中为WordPress创建数据库并授权
mysql> grant all privileges wordpress.* to 'wordpress'@'%' identified by 'wordpress';
mysql> grant all privileges on *.* to 'wordpress'@'%' with grant option;
wordpress连接外部数据库时,其他资源的创建同前面一样,只是不需要为mysql数据库创建deployment控制器,连接mysql数据库的service也会有所改动。具体实例如下
# 创建一个独立的名称空间
---
apiVersion: v1
kind: Namespace
metadata:
name: wordpress
---
# 一定要县创建service再去创建endpoints
apiVersion: v1
kind: Service
metadata:
name: mysqlendpoints
namespace: wordpress
spec:
selector:
apps: endpoints-mysql
#clusterIP: None
ports:
- name: mysqlport
port: 3306
---
# 创建endpoints资源
kind: Endpoints
apiVersion: v1
metadata:
name: mysqlendpoints
namespace: wordpress
labels:
apps: endpoints-mysql
subsets:
- addresses:
- ip: 192.168.16.132
ports:
- name: mysqlport
port: 3306
protocol: TCP
---
# wordpress
apiVersion: apps/v1
kind: Deployment
metadata:
name: word-deploy
namespace: wordpress
labels:
name: wordpress-web
spec:
replicas: 1
selector:
matchLabels:
name: wordpress-web
template:
metadata:
labels:
name: wordpress-web
spec:
containers:
- name: wordpress-web
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdwebport
env:
- name: WORDPRESS_DB_HOST
value: mysqlendpoints:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
---
# wordpress-web service
apiVersion: v1
kind: Service
metadata:
namespace: wordpress
name: wd-web-svc
spec:
selector:
name: wordpress-web
ports:
- name: wd-web-port
port: 80
protocol: TCP
type: NodePort
四、优化wordpress,提升稳定性
Wordpress搭建好后,应对小的访问量一两个pod足以,如果访问量增大了,可能需要增加pod的数量,mysql可以通过搭建相关的集群去实现。在此主要针对woprdpress做一些优化和以提升稳定性。
1、对wordpress做一些健康监测
可以对wordpress增加一些存活性探测(livenessProbe)和就绪性探测(readinessProbe)以监测该pod是否中WordPress是否启动并正常运行。这两个探测的添加位置为:deployment.spec.template.spec.container。要放在容器配置的最后。
livenessProbe:
tcpSocket:
port: 80
# 第一次探测之前要等待多久
initialDelaySeconds: 3
# 每隔多久执行一次探测
periodSeconds: 3
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 10
2、通过HPA实现在资源的动态伸缩
在使用HPA控制前一定要安装metrics-server。Hpa控制器的资源配置如下:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: word-deploy
namespace: wordpress
spec:
maxReplicas: 5
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: word-deploy
targetCPUUtilizationPercentage: 10
3、为pod设置一些资源的限制
Pod中的实例在没有资源限制的情况下,可能会最大量的去消耗所在节点的资源,从而影响其他服务的正常运行。对此,我们可以对pod进行资源的限制。资源限制的配置也是添加在deployment.spec.template.spec.container下,添加在容器的配置后面。
resources:
limits:
cpu: 500m
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
4、在deployment中设置pod的滚动更新策略
设置设置滚动更新策略的主要目的是确保在更新的过程中容器不会被中断。该策略的添加位置为:deployment.spec下。
revisionHistoryLimit: 5 #保留更新历史记录数量
minReadySeconds: 5 # 等待设定时间后可开始升级
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 升级过程中可以多出的pod数量
# 升级过程中最多有多少个POD处于⽆法提供服务的状态
maxUnavailable: 1