前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes搭建LNMP环境并部署wordpress

Kubernetes搭建LNMP环境并部署wordpress

作者头像
kubernetes中文社区
发布2019-06-24 16:12:52
2.1K0
发布2019-06-24 16:12:52
举报

一、镜像准备

1、在镜像仓库上,构建镜像,创建文件夹,将相应的文件放入,Dockerfile和安装包放在百度网盘了,这里就不多介绍了。

链接:https://pan.baidu.com/s/1IUxEAoNq6uEEKmudxsNDag

提取码:hdw8

代码语言:javascript
复制
mkdir -p lnmp/{php,nginx}

#有这些文件

代码语言:javascript
复制
[root@registry-106 php]# ls /root/lnmp/nginx/
Dockerfile  nginx-1.12.1.tar.gz  nginx.conf
[root@registry-106 php]# ls /root/lnmp/php/
Dockerfile  php-5.6.31.tar.gz  php.ini

2、登录仓库,然后构建镜像

nginx镜像构建

代码语言:javascript
复制
docker login 10.0.0.106:5000
cd nginx
docker build -t 10.0.0.106:5000/lnmp/nginx .
docker push 10.0.0.106:5000/lnmp/nginx

php镜像构建

代码语言:javascript
复制
cd php
docker bulid -t 10.0.0.106:5000/lnmp/php .
docker push 10.0.0.106:5000/lnmp/php

mysql镜像构建:

代码语言:javascript
复制
docker pull mysql:5.6
docker tag mysql:5.6 10.0.0.106:5000/lnmp/mysql
docker push 10.0.0.106:5000/lnmp/mysql

3、查看仓库里的镜像

代码语言:javascript
复制
[root@registry-106 php]# curl -u wangxiaoyu:123456 10.0.0.106:5000/v2/_catalog
{"repositories":["hello-world","lnmp/mysql","lnmp/nginx","lnmp/php"]}

4、这里有个问题是后面直接在yaml文件直接去拉取镜像失败了,可能是因为认证的问题,所以我先在node上登录私有镜像仓库,然后把镜像都拉到node上,然后在yaml文件中容器选项指定imagePullPolicy: IfNotPresent优先拉取本地镜像,下次再研究一下认证。

代码语言:javascript
复制
docker login 10.0.0.106:5000
docker pull 10.0.0.106:5000/lnmp/nginx
docker pull 10.0.0.106:5000/lnmp/php
docker pull 10.0.0.106:5000/lnmp/mysql

二、LNMP环境搭建

1、在nfs上再创建一个文件夹用来挂载

代码语言:javascript
复制
mkdir /opt/nfs/wp-data
[root@nfs01 data]# cat /etc/exports 
/opt/nfs/data 10.0.0.0/24(rw,no_root_squash)
/opt/nfs/wp-data 10.0.0.0/24(rw,no_root_squash)

2、在master上,创建pv

代码语言:javascript
复制
mkdir lnmp
cd lnmp
vim pv.yaml
代码语言:javascript
复制
[root@k8s-master-101 lnmp]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  labels:
    apps: mysql-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-cluster"
    path: "gv1"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv01
  labels:
    apps: wp-pv01
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /opt/nfs/wp-data
    server: 10.0.0.31
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv02
  labels:
    apps: wp-pv02
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /opt/nfs/wp-data
    server: 10.0.0.31

说明:

创建一个glusterfs类型的pv,名称mysql-pv,标签为 apps: mysql-pv,挂载数据卷为glusterfs服务器的pv1

然后创建两个nfs类型的pv,名称为wp-pv01,wp-pv02,标签为apps: wp-pv01和apps: wp-pv02,挂载数据卷都为nfs服务器上的/opt/nfs/wp-data

3、创建pv然后查看

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# kubectl create -f pv.yaml
persistentvolume/mysql-pv created
persistentvolume/wp-pv01 created
persistentvolume/wp-pv02 created
[root@k8s-master-101 lnmp]# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
gluster-pv   5Gi        RWX            Retain           Bound       default/pvc002                           81m
mysql-pv     20Gi       RWX            Retain           Available                                            6s
nfs-pv       5Gi        RWX            Recycle          Bound       default/pvc001                           102m
wp-pv01      5Gi        RWX            Retain           Available                                            6s
wp-pv02      5Gi        RWX            Retain           Available                                            6s

4、创建mysql密码的认证

代码语言:javascript
复制
kubectl create secret generic mysql-pass --from-literal=password=123456

5、vim mysql-deployment.yaml

创建mysql的Service、pvc、deployment

pvc匹配标签为上面创建的标签为apps: mysql-pv的pv

指定secret为上面创建的mysql-pass

拉取镜像为10.0.0.106:5000/lnmp/mysql

前面私有镜像的认证有问题所以我先登录私有仓库然后先拉取了镜像,所以设置优先在本地拉取imagePullPolicy: IfNotPresent

使用mysql-pv-claim这个pvc,把上面创建的mysql的pv挂载在容器的/var/lib/mysql目录下。

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# cat mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  selector:
    matchLabels:
      apps: mysql-pv
---
apiVersion: apps/v1beta2
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:
      - name: mysql
        image: 10.0.0.106:5000/lnmp/mysql
        imagePullPolicy: IfNotPresent
        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
      #imagePullSecrets:
       # - name: registrypullsecret
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

创建nginx的configmap,service,deployment ,pvc

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# cat nginx-deployment.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-wp-config
data:
  site.conf: |-
    server {
        listen 80;
        server_name localhost;
        root html;
        index index.html index.php;


        location ~ \.php$ {
            root html;
            fastcgi_pass wordpress-php:9000;
            fastcgi_param SCRIPT_FILENAME /var/www/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: wordpress-nginx
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress-nginx
    tier: frontend
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc02
  labels:
    app: wordpress
spec: 
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      apps: wp-pv02
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: wordpress-nginx
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-nginx
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-nginx
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: 10.0.0.106:5000/lnmp/nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /usr/local/nginx/html
        - name: config
          mountPath: /usr/local/nginx/conf/vhost/site.conf
          subPath: site.conf
        #imagePullSecrets:
        #- name: registrypullsecret
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc02
      - name: config
        configMap:
          name: nginx-wp-config

6、创建php的service,pvc,deployment

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# cat 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: wp-pvc01
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      apps: wp-pv01
---
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1
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: 10.0.0.106:5000/lnmp/php
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9000
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
        ##拉取镜像时的用户认证,没有的时候注释掉这2行
        #imagePullSecrets:
        #- name: registrypullsecret
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pvc01

7、创建

代码语言:javascript
复制
kubectl create -f mysql-deployment.yaml
kubectl create -f php-deployment.yaml

8、查看pod

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-mysql-757c75cf69-9dk56   1/1     Running   0          46s
wordpress-nginx-75fbb8b864-fmbkj   1/1     Running   0          40s
wordpress-nginx-75fbb8b864-rzk2k   1/1     Running   0          40s
wordpress-nginx-75fbb8b864-td7kg   1/1     Running   0          40s
wordpress-php-5b66665d68-hsn7r     1/1     Running   0          45s
wordpress-php-5b66665d68-rsgwp     1/1     Running   0          45s
wordpress-php-5b66665d68-zqm7m     1/1     Running   0          45s

9、在nfs服务器上

代码语言:javascript
复制
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

10、进入mysql容器配置账号密码

代码语言:javascript
复制
kubectl exec -it wordpress-mysql-757c75cf69-sph9x bash
mysql -uroot -p123456
create database wp;
[root@k8s-master-101 lnmp]# kubectl exec -it wordpress-mysql-757c75cf69-9dk56 bash
root@wordpress-mysql-757c75cf69-9dk56:/# mysql -uroot  -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.43 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database wp;
Query OK, 1 row affected (0.04 sec)

11、查看service的地址,可以看到被映射到宿主机的38127端口

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# kubectl get svc
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
glusterfs-cluster   ClusterIP   10.10.10.138   <none>        1/TCP          20m
kubernetes          ClusterIP   10.10.10.1     <none>        443/TCP        21d
wordpress-mysql     ClusterIP   10.10.10.53    <none>        3306/TCP       3m
wordpress-nginx     NodePort    10.10.10.65    <none>        80:38127/TCP   2m54s
wordpress-php       ClusterIP   10.10.10.139   <none>        9000/TCP       2m59s

12、登录这个地址http://10.0.0.102:38127

数据库名为刚才创建的wp,数据库主机名为mysql的service:wordpress-mysql

13、每次都用IP地址加端口访问很不方便,所以为博客创建一个Ingress,使之能直接通过域名访问,匹配wordpress-nginx这个service

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# cat wp-ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wp-ingress
spec:
  rules:
  - host: www.wangxiaoyu.blog
    http:
      paths:
      - backend:
          serviceName: wordpress-nginx
          servicePort: 80

14、查看

代码语言:javascript
复制
[root@k8s-master-101 lnmp]# kubectl create -f wp-ingress.yaml
ingress.extensions/wp-ingress created
[root@k8s-master-101 lnmp]# kubectl get ingress
NAME         HOSTS                     ADDRESS   PORTS     AGE
wp-ingress   www.wangxiaoyu.blog                 80        101s

修改hosts文件

15、然后在浏览器访问www.wangxiaoyu.blog

原文地址:https://blog.csdn.net/qq_41475058/article/details/88898004

作者:光明小学王

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 kubernetes中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档