29.9 kubernetes中使用NFS创建pv_pvc
29.10 在kubernetes中部署LNMP并运行Discuz
29.9 kubernetes中使用NFS创建pv_pvc
持久化卷下PV和PVC概念:Persistent Volume
(持久化卷)简称PV,是一个K8S资源对象,我们可以单独创建一个PV,它不和Pod直接发生关系,而是通过 Persistent Volume Claim
, 简称PVC来实现动态绑定,我们会在Pod定义里指定创建好的PVC,然后PVC会根据Pod的要求去自 动绑定合适的PV给Pod使用。Persistent Volume
(PV)是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV是Volume之类的卷插件,但具有独立于使用PV的Pod的生命周期。此API 对象包含存储实现的细节,即 NFS,iSCSI或特定于云供应商的存储系统。
它和普通Volume的区别是什么呢?
普通Volume和使用它的Pod之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的Volume。Volume是Pod 的附属品,我们无法单独创建一个Volume,因为它不是一个独立的K8S资源对象。
参考文档 http://www.showerlee.com/archives/2280
总结
个人理解 pv类似容器,是种资源。pvc类似pod
。此例子是用NFS创建pv并再k8s中使用它。目的要在NFS的共享目录中创建文件,k8s集群中的pod(集群中任意机器上)里的目录也有此文件。
1) 准备一台机器,搭建NFS服务1
2
3
4
5
6
7
8yum install -y nfs-utils rpcbind
vim /etc/exportfs
/nfs 192.168.80.0/24(rw,sync,no_root_squash)
mkdir /nfs
systemctl start nfs
systemctl enable nfs
2) 在node节点上测试1
2
3
4
5yum install -y nfs-utils
showmount -e 192.168.80.101 ##查看nfs目录状态
Export list for 192.168.80.101:
/data/nfs 192.168.80.0/24
3)创建pv(master上)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim mypv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfs/ ##指定nfs目录和IP
server: 192.168.80.101
kubectl create -f mypv.yaml
查看pv信息
1 | kubectl get pv |
4) 创建pvc(master上)1
2
3
4
5
6
7
8
9
10
11
12
13
14vim mypvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 8Gi
kubectl create -f mypvc.yaml
查看pvc信息
1 | kubectl get pvc ##Bound 表示绑定 myclaim绑定了pv001 |
5) 定义pod1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23vim pvpod.yaml
apiVersion: v1
kind: Pod
metadata:
name: httpd-pvpod
spec:
containers:
- image: httpd
name: httpd-withpvc-pod
imagePullPolicy: Always
volumeMounts:
- mountPath: "/usr/local/apache2/htdocs/" ##指定pvc挂载到的目录
name: httpd-volume
volumes:
- name: httpd-volume
persistentVolumeClaim:
claimName: myclaim ##指定pvc
kubectl create -f pvpod.yaml
kubectl get pod
kubectl describe pod httpd-pvpod //查看Volumes那部分里的ClaimName
验证
1)到NFS的共享目录下创建一个文件1
2cd /nfs/
echo "Test file" > 1.html
2)进入到httpd-pod里1
2kubectl exec -it httpd-pvpod bash
cat htdocs/1.html ##也有1.html文件
3)删除httpd-pvpod1
2kubectl delete pod httpd-pvpod
cat 1.html ##删除pod不影响本地文件
4)重建httpd-pod1
kubectl create -f pvpod.yaml
5)curl访问1
2
3
4
5
6
7kubectl get pod httpd-pvpod -o wide ##查看pod在那个节点上
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
httpd-pvpod 1/1 Running 0 2m50s 172.20.1.4 192.168.80.103 <none>
httpd-pvpod在192.168.80.103节点上 虚拟ip是 172.20.1.4
curl 172.20.1.4/1.html
29.10 在kubernetes中部署LNMP并运行Discuz
本实验在k8s集群中部署lnmp环境,再跑discuz
步骤思路是下载mysql,Nginx+php-fpm镜像再通过更改好的镜像,上传到harbor
k8s通过harbor下载镜像来跑MySQL和Nginx的pod,他们两个pod通过nfs的pvc把数据挂载到nfs的目录上
,本实验在已经搭建harbor基础上 跳转kubernetes 4
思路拓扑图
文档整理 https://coding.net/u/aminglinux/p/k8s_discuz/git/tree/master
下载MySQL、PHP以及Nginx镜像
1 | docker pull mysql:5.7 |
用dockerfile重建nginx-php-fpm镜像(更改自定义的Nginx配置文件)
1 | git clone https://git.coding.net/aminglinux/k8s_discuz.git ##此项目有对应的dockfile和pod配置文件 |
1 | tree . |
1 | docker build -t nginx-php . ##创建nginx-php镜像 |
上传镜像到harbor
1 | docker login harbor.yuankeedu.com //输入正确的用户名和密码 |
搭建NFS
1 | yum install -y nfs-utils rpcbind |
搭建MySQL服务
1)创建secret (设定mysql的root密码)1
kubectl create secret generic mysql-pass --from-literal=password=38003800
2)创建pv1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfs/discuz/db
##这里的IP,是NFS server的IP
server: 192.169.80.101
kubectl create -f mysql-pv.yaml
3)创建pvc1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
kubectl create -f mysql-pvc.yaml
4)创建deployment1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44vim mysql-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-mysql
labels:
app: discuz
spec:
selector:
matchLabels:
app: discuz
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: discuz
tier: mysql
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: harbor.yuankeedu.com/kun/mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: dz-mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-claim
kubectl create -f mysql-dp.yaml
5)创建service1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-mysql
labels:
app: discuz
spec:
ports:
- port: 3306
selector:
app: discuz
tier: mysql
kubectl create -f mysql-svc.yaml
使用下载的项目 修改IP直接创建1
2
3
4
5cd k8s_discuz/mysql/
kubectl create -f mysql-pv.yaml
kubectl create -f mysql-pvc.yaml
kubectl create -f mysql-dp.yaml
kubectl create -f mysql-svc.yaml
测试MySQL1
2yum install -y mysql
mysql -uroot -p38003800 -h10.68.60.83 ##IP使用kubectl get svc查看
搭建nginx+php-fpm服务
1)创建pv1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim web-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: web-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
path: /nfs/discuz/web
server: 192.168.80.101
kubectl create -f web-pv.yaml
2)创建pvc1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16vim web-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-claim
labels:
app: discuz
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
kubectl create -f web-pvc.yaml
3)创建deployment1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38vim web-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dz-web
labels:
app: discuz
spec:
replicas: 1
selector:
matchLabels:
app: discuz
tier: nginx-php
template:
metadata:
labels:
app: discuz
tier: nginx-php
spec:
imagePullSecrets:
- name: my-secret
containers:
- image: harbor.yuankeedu.com/kun/nginx-php
name: dz-web
ports:
- containerPort: 9000
- containerPort: 80
name: dz-web
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/www/html/
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: web-claim
kubectl create -f web-dp.yaml
4)创建service1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18vim web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: dz-web
labels:
app: discuz
spec:
type: NodePort
ports:
- port: 80 ##容器里的端口
nodePort: 30001 ##映射到物理机上的端口
selector:
app: discuz
tier: nginx-php
kubectl create -f web-svc.yaml
使用下载的项目 修改IP直接创建1
2
3
4
5cd k8s_discuz/nginx_php/
kubectl create -f web-pv.yaml
kubectl create -f web-pvc.yaml
kubectl create -f web-dp.yaml
kubectl create -f web-svc.yaml
测试1
2
3
4
5
6
7
8
9cd /nfs/discuz/web/
echo 111 > index.html
kubectl get svc -o wide ##查看虚拟IP
dz-web NodePort 10.68.94.21 <none> 80:30001/TCP 7m36s app=discuz,tier=nginx-php
curl 10.68.94.21
kubectl get pod -o wide ##查看web pod所在的物理机IP
dz-web-85679896-mppdm 1/1 Running 0 38m 172.20.2.12 192.168.80.103 <none>
curl 192.168.80.103:30001
安装Discuz
1)下载dz代码 (到NFS服务器上)1
2
3
4
5cd /tmp/
git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git
cd /nfs/discuz/web/
mv /tmp/DiscuzX/upload/* . ##把ipload目录里的文件拷贝到web里
chown -R 100 data uc_server/data/ uc_client/data/ config/ ##更改权限 100UIP是pod里面的用户
1 | kubectl exec dz-web-85679896-mppdm id nginx ##查看到web pod里面UIP100的用户 |
2)设置MySQL普通用户1
2
3
4kubectl get svc dz-mysql ##mysq虚拟Ip
mysql -uroot -p38003800 -h10.68.60.83
> create database dz;
> grant all on dz.* to 'dz'@'%' identified by '38003800'; ##用户dz
3)设置Nginx代理
虚拟IP只能在节点上访问 浏览器访问可以通过IP:port访问,可是不太方便,所以一般都会通过代理虚拟IP来访问web服务1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16yum install -y nginx
vim /etc/nginx/nginx.conf
##删除原来server 添加下面参数
server {
listen 80;
server_name dz.yuankeedu.com;
location / {
proxy_pass http://10.68.94.21:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
service nginx start
绑定hosts1
192.168.80.101 dz.yuankeedu.com
浏览器输入http://dz.yuankeedu.com/install/