kubernetes搭建 十七、LNMP

一、镜像准备

1、在镜像仓库上,构建镜像,创建文件夹,将相应的文件放入,Dockerfile和安装包放在百度网盘了,这里就不多介绍了。
链接:https://pan.baidu.com/s/1IUxEAoNq6uEEKmudxsNDag
提取码:hdw8

mkdir -p lnmp/{php,nginx}
#有这些文件
[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镜像构建

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镜像构建

cd php
docker bulid -t 10.0.0.106:5000/lnmp/php .
docker push 10.0.0.106:5000/lnmp/php

mysql镜像构建:

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、查看仓库里的镜像

[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优先拉取本地镜像,下次再研究一下认证。

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上再创建一个文件夹用来挂载

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
mkdir lnmp
cd lnmp
vim pv.yaml

[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然后查看

[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密码的认证

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目录下。

[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

[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

[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、创建

kubectl create -f mysql-deployment.yaml
kubectl create -f php-deployment.yaml
kubectl create -f nginx-deployment.yaml

8、查看pod

[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服务器上

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容器配置账号密码
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端口

[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

[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、查看

[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
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值