03-k8s的pod资源01-数据持久化、env环境变量、网络暴露

一、pod资源的概述

1,pod资源是k8s集群当中,最小的管理单位;

2,其他所有资源都是围绕着为pod资源提供服务的;给pod提供服务的;

3,pod就是“一组”容器,一个pod中可以有1个或者多个容器;

容器和Pod的区别:

        容器挂了或被删了,不影响pod的声明周期,而且容器还会自动被拉起来,重启来保证业务的稳定性,但是Pod被delete了,则不会自动拉起来,而是需要kubectl apply pod.yaml资源清单来启动pod;

        注意容器删除是docker rm 容器id,而pod删除是kubectl delete pod pod名称,一个pod中可以有多个容器contains;

二、pod的数据持久化

0.存储卷的作用

        之前的Pod资源清单yaml文件中,如果没写存储卷的信息,那么pod中的容器创建后,容器被删掉(docker rm 容器id)后,容器中的数据是不会持久化保存下来的;

        容器想使用pod的存储卷,就要挂载存储卷,就跟nfs一样,想使用nfs存储,就要linux挂载上nfs一样,linux才能用nfs的存储

       存储卷的作用,其实就是把容器的数据通过挂载到pod上或者node宿主机上,来持久化容器的数据,保证容器被删或pod被删后,容器数据持久化不丢失,核心是容器通过挂载存储卷,来将数据持久化到node宿主机或pod上;

1,emptyDir存储卷

 emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被删除;

· 编写pod资源清单

[root@k8s231 pod]# cat 05-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-multiple
spec:
   containers:
   - image: nginx:1.20.1-alpine
     name: c1

[root@k8s231 pod]# kubectl apply -f 05-nginx.yaml 
pod/nginx-multiple created

· pod中nginx写入静态文件模拟访问

[root@k8s231 pod]# kubectl exec nginx-multiple -it -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # echo xinjizhiwa > index.html 
/usr/share/nginx/html # exit
[root@k8s231 pod]# curl 10.100.2.11
xinjizhiwa

· 模拟容器挂掉

[root@k8s233 ~]# docker container rm -f c8e5fb7c17bc
c8e5fb7c17bc

[root@k8s231 pod]# curl 10.100.2.11 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

· 重新编辑pod清单挂载存储卷

[root@k8s231 pod]# cat 05-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: m05
spec:
   #声明存储卷
   volumes:
   - name: xinjizhiwa-dir
     #声明存储卷类型为emptyDir
     emptyDir: {}

   containers:
   - image: nginx:1.20.1-alpine
     name: c1
     #容器挂载存储卷
     volumeMounts:
     #挂载存储卷的名称
     - name: xinjizhiwa-dir
       #指定挂载的目录
       mountPath: /usr/share/nginx/html/

[root@k8s231 pod]# kubectl apply -f 05-nginx.yaml 

· 进入nginx容器,写一个静态文件

[root@k8s231 pod]# kubectl exec m05 -it -- sh 
/ # echo xinjizhiwa > /usr/share/nginx/html/index.html

· 再次模拟容器挂掉

[root@k8s233 ~]# docker kill e4877ef03ad4

· 自动重新拉起容器后,再次模拟访问nginx

[root@k8s231 pod]# curl 10.100.2.12
xinjizhiwa

发现数据没丢,说明存储卷挂载成功,实现pod内容器的持久化;

问题来了,当我们删除pod,数据还会存在吗?

[root@k8s231 pod]# curl 10.100.2.13
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

· emptyDir存储卷特点总结

1,容器挂掉,数据不会丢失;

2,pod挂掉,数据会丢失;

3,所以,不推荐使用;

2,hostPath存储卷

       将物理机节点中的目录挂载到pod中,pod意外宕机,或者被删除,数据不丢失,仍然存在;同一个pod中不同的容器之间数据共享,同一个worker节点不同的pod之间的数据共享使用;

        在不同worker节点的pod就无法数据共享了;

· 编辑pod资源清单,挂载hostPath存储卷

[root@k8s231 pod]# vim 06-pod-hostpath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m06
spec:
  #指定pod创建在哪个worker节点中;
  nodeName: k8s232
  volumes:
  - name: hp-01
    #声明存储卷类型是hostPath;物理机节点目录挂载
    hostPath: 
      #指定hostPath的路径(物理机挂载路径)
      path: /xinjizhiwa/pod-volumes

  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: hp-01
      mountPath: /usr/share/nginx/html/

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 06-pod-hostpath.yaml

· k8s232创建挂载目录,写入index文件

[root@k8s232 ~]# mkdir -p /xinjizhiwa/pod-volumes
[root@k8s232 ~]# echo xinjizhiwa > /xinjizhiwa/pod-volumes/index.html

· 此时访问nginx

[root@k8s231 pod]# curl 10.100.1.4
xinjizhiwa

· 模拟删除pod再创建查看数据是否丢失

#1,模拟删除pod

[root@k8s231 pod]# kubectl delete pods m06
pod "m06" deleted

#2,重新创建pod
[root@k8s231 pod]# kubectl apply -f 06-pod-hostpath.yaml 
pod/m06 created
[root@k8s231 pod]# kubectl get pods -o wide 
NAME   READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
m05    1/1     Running   0          74m   10.100.2.13   k8s233   <none>           <none>
m06    1/1     Running   0          6s    10.100.1.5    k8s232   <none>           <none>

#3,再次访问,发现数据没有丢失;
[root@k8s231 pod]# curl 10.100.1.5
xinjizhiwa

此时,持久化成功;

3,NFS存储卷

· 所有节点安装nfs,harbor节点配置nfs

本次学习我们使用harbor节点作为存储节点

[root@harbor ~]# yum -y install nfs-utils

创建共享目录

[root@harbor ~]# mkdir -p /k8s/data/

编辑NFS配置文件

#1,修改配置文件
[root@harbor ~]# vim /etc/exports

#2,启动并开机自启
[root@harbor ~]# systemctl enable --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

#3,查看nfs共享目录是否存在

[root@harbor ~]# exportfs 
/k8s/data         <world>

· harbor节点创建要挂在的nfs目录

[root@harbor ~]# mkdir /k8s/data/nginx

· 编辑pod资源清单,挂载nfs

[root@k8s231 pod]# vim 07-pod-nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volumes-nfs
spec:
  volumes:
  - name: nfs-data
    # 指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      # 指定nfs挂在路径
      path: /k8s/data/nginx
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml 

· 验证,删除pod重新创建数据是否丢失

[root@k8s231 pod]# kubectl delete pods volumes-nfs 
pod "volumes-nfs" deleted
[root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml 
pod/volumes-nfs created
[root@k8s231 pod]# kubectl get pods -o wide 
NAME          READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
volumes-nfs   1/1     Running   0          4s    10.100.2.15   k8s233   <none>           <none>
[root@k8s231 pod]# curl 10.100.2.15
xinjizhiwa

· 创建两个pod,都挂载相同nfs存储卷

知识点:【---】代表同一个yaml文件中,多个资源;

[root@k8s231 pod]# cat 07-pod-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: volumes-nfs01
spec:
  nodeName: k8s233
  volumes:
  - name: nfs-data
    # 指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      # 指定nfs挂在路径
      path: /k8s/data/nginx
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html

---

apiVersion: v1
kind: Pod
metadata:
  name: volumes-nfs02
spec:
  nodeName: k8s232
  volumes:
  - name: nfs-data
    # 指定存储卷的类型是nfs

    nfs:
      #指定nfs在哪个节点
      server: harbor
      # 指定nfs挂在路径
      path: /k8s/data/nginx
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html

· 验证是否访问结果都一样

[root@k8s231 pod]# kubectl apply -f 07-pod-nfs.yaml 
pod/volumes-nfs01 created
pod/volumes-nfs02 created

[root@k8s231 pod]# kubectl get pods -o wide 
NAME            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
volumes-nfs01   1/1     Running   0          4s    10.100.2.16   k8s233   <none>           <none>
volumes-nfs02   1/1     Running   0          4s    10.100.1.6    k8s232   <none>           <none>

[root@k8s231 pod]# curl 10.100.2.16
xinjizhiwa
[root@k8s231 pod]# curl 10.100.1.6
xinjizhiwa

至此,nfs存储卷挂载、验证成功;

4. 3个存储卷区别

1)emptyDir存储卷
        容器下的路径的东西挂载到pod的emptydir存储卷上了,简单说就是容器内容都持久化到pod的emptydir存储卷上了,而不是hostpath存储卷那样持久化到Node宿主机上了,所以pod没了,持久化的数据也照样没了,emptyDir存储卷跟pod是共生关系,在生产中不会用这种存储卷;

2)Pod的存储卷之hostPath存储卷
        (注意,不是容器下的路径挂载到pod的emptydir存储卷上了,而是容器下的路径挂载到node宿主机上了,简单说就是pod的容器的数据持久化到Node宿主机上了,不是像emptydir存储卷,容器数据持久化到pod上)

emptyDir存储卷优缺点:

优点:

         (1)可以实现同一个Pod内多个容器之间数据共享;(因为这个存储卷是pod的,不是某个容器的,先在pod中定义创建一个存储卷,然后再把容器存储路径挂载到存储卷上,容器才能用存储卷持久化数据)

        (2)当Pod内的某个容器被强制删除时,数据并不会丢失,因为Pod没有删除;(分清楚pod和容器是两码事,一个Pod里面可以有多个容器)

缺点:

        (1)当Pod被删除时,数据也会被随之删除; (2)不同的Pod之间无法实现数据共享;
 

三、pod网络暴露(外部浏览器如何访问到Pod)

1,hostNetwork使用宿主机的网络(pod跟宿主机共享网络)--几乎不用这种方式(用services)

· 编辑pod资源清单

[root@k8s231 pod]# cat 08-pod-hnw.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: m08
spec:

  #声明使用宿主机的网络;
  hostNetwork: true
  containers:
  - name: c1
    image: nginx:1.20.1-alpine

· 查看pod

发现,ip不再是pod网段,而是宿主机的ip地址了;

[root@k8s231 pod]# kubectl get pods -o wide

此时外部浏览器访问测试

2,宿主机端口映射(宿主机端口映射到容器的端口,外部浏览器依然可以通过访问宿主机ip+宿主机端口来访问到容器)

· 编辑pod清单

[root@k8s231 pod]# vim 09-pod-hostport.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m09
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    #声明容器与宿主机端口映射;
    ports:
    - name: c1-port
      #容器端口
      containerPort: 80
      #宿主机端口
      hostPort: 99
      #指定访问协议(默认不写是TCP协议,其实不用写)
      #protocol: TCP

· 创建pod资源

[root@k8s231 pod]# kubectl apply -f 09-pod-hostport.yaml 
pod/m09 created
[root@k8s231 pod]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS      AGE     IP            NODE     NOMINATED NODE   READINESS GATES
m-nginx-k8s231          1/1     Running   0             3h53m   10.100.0.6    k8s231   <none>           <none>
m05                     1/1     Running   0             98s     10.100.1.25   k8s232   <none>           <none>
m08                     1/1     Running   0             10m     10.0.0.233    k8s233   <none>           <none>
m09                     1/1     Running   0             2s      10.100.2.20   k8s233   <none>           <none>
注意:宿主机端口映射这种方式生成的pod的ip可不是宿主机ip

测试访问宿主机的99端口,看是否能够访问到pod的80端口;(注意,这里的pod的ip不是宿主机ip,但是浏览器依然可以通过宿主机ip+宿主机端口来访问到容器,因为做了宿主机的端口映射了

 使用emptyDir存储卷时,就不能用pod网络暴露这两种方式,报403

[root@k8s231 pod]# cat 055-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: m05
spec:
   #声明存储卷
   volumes:
   - name: xinjizhiwa-dir
     #声明存储卷类型为emptyDir
     emptyDir: {}
  # hostNetwork: true
   containers:
   - image: nginx:1.20.1-alpine
     name: c1
     #容器挂载存储卷
     ports:
     - name: c1-port
       containerPort: 80
       hostPort: 99
     volumeMounts:
     #挂载存储卷的名称
     - name: xinjizhiwa-dir
       #指定挂载的目录
       mountPath: /usr/share/nginx/html/

[root@k8s231 pod]# kubectl apply -f 055-nginx.yaml 
pod/m05 created
[root@k8s231 pod]# kubectl get pod -o wide
NAME                    READY   STATUS             RESTARTS         AGE     IP            NODE     NOMINATED NODE   READINESS GATES
m-nginx-k8s231          1/1     Running            0                3h57m   10.100.0.6    k8s231   <none>           <none>
m05                     1/1     Running            0                3s      10.100.1.26   k8s232   <none>           <none>

 

四、pod中容器的环境变量env(资源清单来传递环境变量到容器)

        什么是pod中容器的环境变量?

        跟linux中的env是一个意思,key=value

        这里环境变量用法就是,先写到pod资源清单中,然后创建pod,然后进入到pod容器中,env命令可以查看到资源清单中写好的【环境变量】是否传递到容器中,是传递到容器中了,然后在容器中的配置中用到环境变量的值;

[root@k8s231 pod]# xinjizhiwa=HELLO
[root@k8s231 pod]# echo $xinjizhiwa
HELLO

      也就是说,我们通过pod资源清单的编写,可以为容器中声明env环境变量

1,编辑pod资源清单

Broad views:先delete

Broad views:再apply

Broad views:apply只能更新 你要是删除了yaml里面的某些字段就要delete再apply
 

[root@k8s231 pod]# vim 10-pod-env.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m10
spec:
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    #声明环境变量
    env:
    #name就是key
    - name: xinjizhiwa
      #value就是value值
      value: HELLO
    - name: k8s
      value: 1.23.17

2,创建pod资源

[root@k8s231 pod]# kubectl apply -f 10-pod-env.yaml 
pod/m10 created

3,进入到pod容器中,验证是否传递成功

[root@k8s231 pod]# kubectl exec m10 -it -- sh
/ # env
k8s=1.23.17
xinjizhiwa=HELLO
..........

/ # echo $xinjizhiwa
HELLO
/ # echo $k8s
1.23.17

至此,env环境变量传递成功;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值