在k8s中通过各种不通的方式部署wordpress

       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    

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值