zoukankan      html  css  js  c++  java
  • (转)Kubernetes部署WordPress+MySQL

    转:http://www.showerlee.com/archives/2336

    这部分我们结合之前的k8s知识点给大家展示如何使用kubernetes部署wordpress+MySQL, 并利用NFS去保存我们容器的源代码以及DB数据.

    安装环境

    System: CentOS 7.4

    Kubernetes: Kubernetes1.9

    Docker: 17.03.2-ce

    kube-master 10.110.16.10

    kube-node-1 10.110.16.11

    一. NFS配置:

    1. NFS依赖包安装

    在Master与Node分别安装NFS组件

    # yum install nfs-utils -y

    Tip: 这里需保证nfs-utils安装到所有master和node中, 否则容器挂载NFS时会报错.

    2. 为Master下mysql data和wordpress源码配置NFS共享目录

    # systemctl enable nfs-server && systemctl start nfs-server

    # mkdir -p /kube/mysql-db

    # mkdir -p /kube/wordpress

    # chown nfsnobody:nfsnobody /kube/mysql-db

    # chown nfsnobody:nfsnobody /kube/wordpress

    # chmod 755 /kube/mysql-db

    # chmod 755 /kube/wordpress

    # echo -e "/kube/mysql-db    kube-*(rw,sync,no_subtree_check,no_root_squash)" > /etc/exports

    # echo -e "/kube/wordpress    kube-*(rw,sync,no_subtree_check,no_root_squash)" >> /etc/exports

    Tip: 这里kube-*限制只有kube相关的server才能连接Master下NFS共享目录, no_root_squash参数保证wordpress-mysql pod在初始化mysql配置的时候向在其下挂载的/var/lib/mysql目录有写入权限

    3.应用配置

    # exportfs -a

    二. Persistent volume配置

    1.为mysql data与wordpress源码存储创建Persistent volume
    # kubectl create -f mysql-pv.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql-pv
      labels:
        app: mysql
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        path: /kube/mysql-db
        server: kube-master

    # kubectl create -f wordpress-pv.yaml

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: wp-pv
      labels:
        app: wordpress
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      nfs:
        path: /kube/wordpress
        server: kube-master

    2.创建存放mysql data的PVC

    # kubectl create -f mysql-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: mysql-pv-claim
      labels:
        app: mysql
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi

    3.创建存放wordpress源码的PVC
    # kubectl create -f wordpress-pvc.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: wp-pv-claim
      labels:
        app: wordpress
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 2Gi

    查看绑定

    # kubectl get pvc

    NAME             STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mysql-pv-claim   Bound     mysql-pv   5Gi        RWO                           3m
    wp-pv-claim      Bound     wp-pv      5Gi        RWO                           6s

    三. Secret配置

    1.创建mysql root password

    # kubectl create secret generic mysql-pass --from-literal='password=countonme'

    四. Deployment配置

    1.部署mysql deployment with PVC
    # kubectl create -f mysql-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: mysql
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: wordpress
            tier: mysql
        spec:
          containers:
          - image: mysql:5.6
            name: mysql
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pv-claim

    2.部署wordpress deployment with PVC

    # kubectl create -f wordpress-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: wordpress
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: frontend
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: wordpress
            tier: frontend
        spec:
          containers:
          - image: wordpress:4.8-apache
            name: wordpress
            env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 80
              name: wordpress
            volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
          volumes:
          - name: wordpress-persistent-storage
            persistentVolumeClaim:
              claimName: wp-pv-claim

    3.Service配置

    Tip: 这里我们开启了node IP的80端口的外部访问权限, 可以方便我们直接利用主机去访问虚拟机任意Node地址从而登录我们的Wordpress网站.

    # kubectl create -f wp-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      ports:
        - port: 3306
      selector:
        app: wordpress
        tier: mysql
      clusterIP: None
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress
      labels:
        app: wordpress
    spec:
      ports:
        - port: 80
          nodePort: 80
      selector:
        app: wordpress
        tier: frontend
      type: NodePort
    

    Tip: 这里service定义的name: wordpress-mysql保证我们wordpress-deployment.yaml定义的如下环境变量可以作为有效的域名成功去访问我们的mysql容器, 保证网站服务器与数据库服务器的通讯.

    env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql

    五. 验证结果

    1.访问wordpress主页

    这里我们可以直接在浏览器访问任意node的IP地址从而进入wordpress主页

    wordpress01

    添加相关信息并初始化安装WordPress

    wordpress02

    完成安装

    wordpress03

    后台

    wordpress04

    主页

    wordpress05

    2.查看NFS主机对在容器里的mysql data与wordpress root dir的目录挂载.

    wordpress07

    wordpress06

    有兴趣的小伙伴可以直接访问如下代码仓库去下载本文相关代码:

    https://git.showerlee.com/showerlee/kube-deploy/tree/master/wordpress-mysql

    Finished...

    后记:

    如果我们使用helm包管理去部署wordpress, 将大大简化我们的工作量.

    这里我的代码仓库提供了wordpress chart部署脚本, 以下是详细的部署步骤:

    Prerequisite:

    Kubernetes cluster setup

    http://www.showerlee.com/archives/2200

    Helm setup

    http://www.showerlee.com/archives/2455

    Helm deployment:

    # git clone git@git.showerlee.com:showerlee/kube-deploy.git

    # cd kube-deploy

    # kubectl create secret generic mysql-pass --from-literal='password=countonme'

    # helm install --name wordpress-mysql ./wordpress-helm-chart --set service.type=NodePort

    NAME:   wordpress-mysql
    LAST DEPLOYED: Sat Apr 14 03:09:46 2018
    NAMESPACE: default
    STATUS: DEPLOYED
    
    RESOURCES:
    ==> v1/PersistentVolume
    NAME      CAPACITY  ACCESS MODES  RECLAIM POLICY  STATUS  CLAIM                   STORAGECLASS  REASON  AGE
    mysql-pv  5Gi       RWO           Recycle         Bound   default/mysql-pv-claim  1s
    wp-pv     5Gi       RWO           Recycle         Bound   default/wp-pv-claim     1s
    
    ==> v1/PersistentVolumeClaim
    NAME            STATUS  VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
    mysql-pv-claim  Bound   mysql-pv  5Gi       RWO           1s
    wp-pv-claim     Bound   wp-pv     5Gi       RWO           1s
    
    ==> v1/Service
    NAME             TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)    AGE
    wordpress-mysql  ClusterIP  None           <none>       3306/TCP   1s
    wordpress        NodePort   10.110.14.233  <none>       80:80/TCP  1s
    
    ==> v1/Deployment
    NAME             AGE
    wordpress-mysql  1s
    wordpress        1s
    
    
    NOTES:
    1. Get the application URL by running these commands:
      export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wordpress-mysql-wordpress-helm-chart)
      export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
      echo http://$NODE_IP:$NODE_PORT
  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/9726902.html
Copyright © 2011-2022 走看看