kubernetes 5

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
8
yum 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
5
yum 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
16
vim 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
14
vim mypvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi

kubectl create -f mypvc.yaml

 

查看pvc信息

1
2
3
kubectl get pvc   ##Bound 表示绑定 myclaim绑定了pv001
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Bound    pv001    10Gi       RWX                           25s

5) 定义pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
vim 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
2
cd /nfs/
echo "Test file" > 1.html

 

2)进入到httpd-pod里

1
2
kubectl exec -it httpd-pvpod bash
cat htdocs/1.html   ##也有1.html文件

 

3)删除httpd-pvpod

1
2
kubectl delete pod httpd-pvpod
cat 1.html  ##删除pod不影响本地文件

 

4)重建httpd-pod

1
kubectl create -f pvpod.yaml

 

5)curl访问

1
2
3
4
5
6
7
kubectl 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
2
docker pull mysql:5.7
docker pull richarvey/nginx-php-fpm

用dockerfile重建nginx-php-fpm镜像(更改自定义的Nginx配置文件)

1
2
git clone https://git.coding.net/aminglinux/k8s_discuz.git   ##此项目有对应的dockfile和pod配置文件
cd k8s_discuz/dz_web_dockerfile/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tree .
.
├── Dockerfile  ##构建自定义镜像的dockfile
├── localtime   ##重置系统时间
├── nginx.conf  ##自定义的Nginx配置
└── php-fpm-www.conf  ##自定义的php配置

cat Dockerfile
FROM richarvey/nginx-php-fpm
COPY localtime /etc/localtime  
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN rm -f /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm -f /usr/local/etc/php-fpm.d/www.conf
COPY php-fpm-www.conf /usr/local/etc/php-fpm.d/www.conf
ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /usr/local/sbin/php-fpm -c /usr/local/etc/php-fpm.conf
1
docker build -t nginx-php .  ##创建nginx-php镜像

上传镜像到harbor

1
2
3
4
5
docker login harbor.yuankeedu.com  //输入正确的用户名和密码
docker tag mysql:5.7 harbor.yuankeedu.com/kun/mysql:5.7
docker push !$
docker tag nginx-php harbor.yuankeedu.com/aminglinux/nginx-php
docker push !$

搭建NFS

1
2
3
4
5
6
7
8
9
10
yum install -y nfs-utils rpcbind

vim /etc/exports

/nfs 192.168.80.0/24(rw,sync,no_root_squash)

systemctl start nfs
systemctl enable nfs

mkdir -p /nfs/discuz/{db,web}

搭建MySQL服务

1)创建secret (设定mysql的root密码)

1
kubectl create secret generic mysql-pass --from-literal=password=38003800

 

2)创建pv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim 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)创建pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim 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)创建deployment

1
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
44
vim 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)创建service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim 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
5
cd 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

 

测试MySQL

1
2
yum install -y mysql
mysql -uroot -p38003800 -h10.68.60.83  ##IP使用kubectl get svc查看

 

搭建nginx+php-fpm服务

1)创建pv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim 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)创建pvc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim 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)创建deployment

1
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
vim 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)创建service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim 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
5
cd 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
9
cd /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
5
cd /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
2
kubectl exec dz-web-85679896-mppdm id nginx   ##查看到web pod里面UIP100的用户
uid=100(nginx) gid=101(nginx) groups=101(nginx),101(nginx)

2)设置MySQL普通用户

1
2
3
4
kubectl 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
16
yum 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

 

绑定hosts

1
192.168.80.101 dz.yuankeedu.com

 

浏览器输入http://dz.yuankeedu.com/install/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值