自学内容网 自学内容网

Pod资源-持久化-网络暴露-env

一.资源清单

资源清单组成

apiVersion:v1    #对应不同的k8s版本中的api;
kind:Pod            #资源的名称(service、ConfigMap、hpa.....)
metadata:          #声明资源的元数据信息(资源的名称)
spec:                 #使用者期望的运行状态;
--- 代表同一个yaml文件中,多个资源

资源示例

编写资源清单

[root@master pod]# cat 01-pod-nginx.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: m-nginx
spec:
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine

创建资源

可以使用create或者apply这两种方式创建

kubectl  apply -f  资源清单
kubectl  create -f 资源清单
[root@master pod]# kubectl apply -f 01-pod-nginx.yaml 

create与apply的区别:

        create创建的资源属于固定的资源,后期若想修改只能先delete删除资源,再create创建资源

        apply是一种实时更新的创建资源的方式,后期修改完配置文件后,再apply即可。这里若是apply未生效,需要先delete删除资源,再apply -f创建资源

查看资源

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

这里若发现状态不是running,describe查看pod的详细信息

模拟报错使用describe

故意写错镜像的标签,模拟创建pod的ststus不是running的错误

[root@master pod]# cat 01-pod-nginx.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: m-nginx
  labels:
    wangshuyuan: wsy
    wsy: wangshuyuan
spec:
  restartPolicy: Always
  containers:
    - name: c-nginx
      image: nginxL:1.20.1-alpine
      imagePullPolicy: IfNotPresent

创建资源

[root@master pod]# kubectl apply -f 01-pod-nginx.yaml 
pod/m-nginx created

查看pod,发现pod的ststus不是running

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

查看创建pod的详情,在events下有具体的报错信息:

[root@master pod]# kubectl describe pod m-nginx 

根据错误提示修改资源清单即可

排查问题步骤
1.发现错误报错

kubectl  get  资源类型   资源名   # 发现不是running;

2.查看资源的详细信息

kubectl  describe  资源类型  资源名  

3.找到问题所在Events字段下的创建过程信息

4.根据问题所在的原因,解决问题

--------------------------------------------------------------------
若describe资源没有发现任何问题,或者其他位置原因,可以先检查集群的节点状态
[root@master pod]# kubectl get nodes 
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   8d    v1.23.17
worker1   Ready    <none>                 8d    v1.23.17
worker2   Ready    <none>                 8d    v1.23.17

二 .pod

pod概述 

        pod是kubernets中最小的管理管理单位;pod就是一组容器,一个pod中可以有1个或者多个容器;其他资源都是为pod资源提供服务的

pod持久化

1.emptyDir(不推荐使用)

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

官方解释:
    对于定义了 emptyDir 卷的 Pod,在 Pod 被指派到某节点时此卷会被创建。 就像其名称所表示的那样,emptyDir 卷最初是空的。尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。      

emptyDir 的一些用途:

         缓存空间,例如基于磁盘的归并排序。
        为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
        在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

emptyDir存储卷的特点:

        容器挂掉,数据不会丢失

        pod挂掉,数据丢失

1.编写pod资源清单
[root@master demo]# cat 01-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  containers:
  - name: c-demo
    image: nginx:1.20.1-alpine
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 01-nginx.yaml 
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-demo   1/1     Running   0          15s   10.100.2.30   worker2   <none>           <none>
3.pod中nginx写入静态文件模拟访问
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd /usr/share/nginx/html
/usr/share/nginx/html # echo demo > index.html
/usr/share/nginx/html # exit
[root@master demo]# curl 10.100.2.30
demo
 4.模拟容器挂掉

        容器挂掉重新加载就没了

        通过查看pod详情找到pod挂载的节点(NODE),在对应的节点上删除容器

[root@worker2 ~]# docker ps |grep "c-demo"
a4adf2bdad09   7f18bdc92ca5                                        "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes             k8s_c-demo_nginx-demo_default_94b28a9e-cbec-4be3-a00d-da00baeee4cc_0

[root@worker2 ~]# docker rm -f a4adf2bdad09
a4adf2bdad09
5.再次模拟访问
[root@master demo]# curl 10.100.2.30
<!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>
6.重新编辑pod清单挂载存储卷(emptyDir)
[root@master demo]# cat 01-nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  #声明存储卷
  volumes:
  - name: demo-dir
    #声明存储卷类型-emptyDir
    emptyDir: {}
  
  containers:
  - name: c-demo
    image: nginx:1.20.1-alpine
    #容器挂载存储卷
    volumeMounts:
    #挂载存储卷的名称
    - name: demo-dir
    # 指定挂载的目录
      mountPath: /usr/share/nginx/html/
7.创建并查看pod
[root@master demo]# kubectl apply -f 01-nginx.yaml 
pod/nginx-demo created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-demo   1/1     Running   0          93s   10.100.2.31   worker2   <none>           <none>
8.进入容器挂载目录下写一个静态文件
[root@master demo]# kubectl exec nginx-demo -it -- sh
/ # cd usr/share/nginx/html/
/usr/share/nginx/html # echo demoetest > index.html
/usr/share/nginx/html # exit
9.模拟容器挂掉
[root@worker2 ~]# docker ps |grep "c-demo"
8f90c58f0914   7f18bdc92ca5                                        "/docker-entrypoint.…"   About a minute ago   Up About a minute             k8s_c-demo_nginx-demo_default_80e6bc07-eb59-4acf-a06c-d60b2b8c2d20_0
[root@worker2 ~]# docker rm -f 8f90c58f0914
8f90c58f0914
10.待容器自动拉起后,再次模拟访问
[root@master demo]# curl 10.100.2.31
demoetest

发现数据未丢失,说明存储卷挂在成功,实现了pod内容器的持久化

---当删除pod后数据还存在吗?

        不存在,上面emptyDir的概述说了,pod挂掉,数据也会丢失

hostPath

        hostpath存储卷:将物理机节点的目录挂载到pod中,pod意外宕机,或者被误删时,数据不会丢失,可以实现同一个pod中不同容器之间数据共享,同一个人worker节点不同pod之间数据共享;不同worker节点的pod无法共享数据

1.编写pod资源清单,挂载hostpath存储卷
[root@master demo]# cat 02-pod-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo01
spec:
  #指定pod创建在哪个worker节点中
  nodeName: worker1
  volumes:
  - name: hp-01
    #声明存储卷类型是hostPath;物理机节点目录挂载
    hostPath:
      #指定hostPath的路径(物理机挂载路径)
      path: /data/pod-volumes
  containers:
  - name: demo-v1
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: hp-01
      mountPath: /usr/share/nginx/html/  
2.创建并查看pod资源
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml 
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo01   1/1     Running   0          80s   10.100.1.22   worker1   <none>           <none>
3.worker1节点创建挂载目录并写入静态文件
[root@worker1 data]# mkdir -p /data/pod-volumes
[root@worker1 data]# echo demotest > /data/pod-volumes/index.html

4.模拟访问
[root@master demo]# curl 10.100.1.22
demotest
5.模拟删除pod后看数据是否会丢失
[root@master demo]# kubectl delete pods demo01 
pod "demo01" deleted
[root@master demo]# kubectl apply -f 02-pod-hostpath.yaml 
pod/demo01 created
[root@master demo]# kubectl get pods -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo01   1/1     Running   0          14s   10.100.1.23   worker1   <none>           <none>
[root@master demo]# curl 10.100.1.23
demotest

持久化成功

NFS存储卷

1.所有节点先安装nfs,存储节点配置nfs
yum -y install nfs-utils
2.存储节点创建共享目录
mkdir -p /k8s/data/
3.编辑NFS配置文件
#1.修改配置文件
[root@harbor ~]# cat /etc/exports
/k8s/data *(rw,no_root_squash)
#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>
4.存储节点创建要挂载的nfs目录
mkdir /k8s/data/nginx
5.编辑pod资源清单,挂载nfs
[root@master demo]# cat 03-pod-nfs.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: demo-nfs
spec:
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
       #指定nfs在哪个节点
       server: harbor
       #指定nfs挂在路径
       path: /k8s/data/nginx
  containers:
  - name: demo-v2
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html
6.创建并查看pod资源
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml 
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs   1/1     Running   0          75s   10.100.2.32   worker2   <none>           <none>
7.模拟访问
[root@master demo]# curl 10.100.2.32
demotest
8.删除pod重新创建看数据是否会丢失
[root@master demo]# kubectl delete pods demo-nfs 
pod "demo-nfs" deleted
[root@master demo]# kubectl apply -f 03-pod-nfs.yaml 
pod/demo-nfs created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs   1/1     Running   0          4s    10.100.1.24   worker1   <none>           <none>
9.再次模拟访问
[root@master demo]# curl 10.100.1.24
demotest
 10.创建两个pod,都挂载相同nfs存储卷
[root@master demo]# cat 04-pod-nfs2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-nfs02
spec:
  nodeName: worker1
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      #指定nfs挂在路径
      path: /k8s/data/nginx
  containers:
  - name: demo-v3
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html
---
apiVersion: v1
kind: Pod
metadata:
  name: demo-nfs03
spec:
  nodeName: worker2
  volumes:
  - name: nfs-data
    #指定存储卷的类型是nfs
    nfs:
      #指定nfs在哪个节点
      server: harbor
      #指定nfs挂在路径 
      path: /k8s/data/nginx
  containers:
  - name: demo-v3
    image: nginx:1.20.1-alpine
    volumeMounts:
    - name: nfs-data
      mountPath: /usr/share/nginx/html

创建查看资源并模拟访问验证结果是否相同

[root@master demo]# kubectl apply -f 04-pod-nfs2.yaml 
pod/demo-nfs02 created
pod/demo-nfs03 created
[root@master demo]# kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-nfs02   1/1     Running   0          15s   10.100.1.25   worker1   <none>           <none>
demo-nfs03   1/1     Running   0          15s   10.100.2.33   worker2   <none>           <none>
[root@master demo]# curl 10.100.1.25
demotest
[root@master demo]# curl 10.100.2.33
demotest

nfs存储卷挂载验证成功

pod网络暴露

1.hostNetwork使用宿主机网络
·编辑pod资源清单
[root@master demo]# cat 05-pod-nw.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-nw
spec:
  #声明使用宿主机的网络
  hostNetwork: true
  containers:
  - name: demov5
    image: nginx:1.20.1-alpine
·创建并查看pod资源,查看IP是否是宿主机IP
[root@master demo]# kubectl apply -f 05-pod-nw.yaml 
pod/demo-nw created
[root@master demo]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
demo-nw   1/1     Running   0          12s   10.0.0.233   worker2   <none>           <none>
·浏览器测试访问

2.宿主机端口映射

·编辑pod资源清单
[root@master demo]# cat 06-pod-port.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: demo-port
spec:
  containers:
  - name: demo00
    image: nginx:1.20.1-alpine
    #声明容器与宿主机端口映射;
    ports:
    - name: demo-port
      #容器端口
      containerPort: 80
      #宿主机端口
      hostPort: 99
      #指定访问协议(默认是TCP协议,可以不写)
      protocol: TCP
·创建并查看pod
[root@master demo]# kubectl apply -f 06-pod-port.yaml 
pod/demo-port created
[root@master demo]# kubectl get pods -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP            NODE      NOMINATED NODE   READINESS GATES
demo-nw     1/1     Running   0          9m8s   10.0.0.233    worker2   <none>           <none>
demo-port   1/1     Running   0          12s    10.100.1.26   worker1   <none>           <none>
·浏览器测试访问

  测试访问宿主机的99端口,看是否能够访问到pod的80端口

pod中容器的环境变量env

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

1.编辑pod资源清单
[root@master demo]# cat 07-pod-env.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: demo-env
spec:
  containers:
  - name: demo009
    image: nginx:1.20.1-alpine
    #声明环境变量
    env:
    #name就是key
    - name: demoenv
      #value就是value值
      value: demoaa
    - name: k8s
      value: 1.23.7
2.创建并查看pod
[root@master demo]# kubectl apply -f 07-pod-env.yaml 
pod/demo-env created
[root@master demo]# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
demo-env   1/1     Running   0          11s   10.100.1.27   worker1   <none>           <none>
3.进入到pod容器中,验证变量是否传递成功
[root@master demo]# kubectl exec demo-env -it -- sh

env环境变量传递成功


原文地址:https://blog.csdn.net/weixin_46466657/article/details/140404798

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!