kubernetes搭建 十七、LNMP
一、镜像准备
1、在镜像仓库上,构建镜像,创建文件夹,将相应的文件放入,Dockerfile和安装包放在百度网盘了,这里就不多介绍了。
链接:https://pan.baidu.com/s/1IUxEAoNq6uEEKmudxsNDag
提取码:hdw8
mkdir -p lnmp/{php,nginx}
#有这些文件
[[email protected] php]# ls /root/lnmp/nginx/
Dockerfile nginx-1.12.1.tar.gz nginx.conf
[[email protected] 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、查看仓库里的镜像
[[email protected] 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
[[email protected] 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
[[email protected] 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然后查看
[[email protected] lnmp]# kubectl create -f pv.yaml
persistentvolume/mysql-pv created
persistentvolume/wp-pv01 created
persistentvolume/wp-pv02 created
[[email protected] 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目录下。
[[email protected] 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
[[email protected] 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
[[email protected] 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
[[email protected] 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;
[[email protected] lnmp]# kubectl exec -it wordpress-mysql-757c75cf69-9dk56 bash
[email protected]:/# 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端口
[[email protected] 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
[[email protected] 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、查看
[[email protected] lnmp]# kubectl create -f wp-ingress.yaml
ingress.extensions/wp-ingress created
[[email protected] lnmp]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
wp-ingress www.wangxiaoyu.blog 80 101s
修改hosts文件
15、然后在浏览器访问www.wangxiaoyu.blog