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

本文详细介绍了Kubernetes中pod的基本概念,重点探讨了如何通过emptyDir、hostPath和NFS实现pod数据持久化,以及如何使用hostNetwork和hostPort进行网络暴露。还涉及了如何在pod中设置容器环境变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、pod资源的概述

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

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

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

二、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>

#可以看到,当pod挂掉之后,数据也随之丢失;

· 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存储卷挂载、验证成功;

三、pod网络暴露

1,hostNetwork使用宿主机的网络

· 编辑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,宿主机端口映射

· 编辑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

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

四、pod中容器的环境变量env

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

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

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

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

1,编辑pod资源清单

[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环境变量传递成功;

<think>好的,用户现在问的是在Kubernetes 1.23版本下使用Ceph Nautilus版本,通过Ceph-CSI实现RBD持久化存储。首先,我需要回顾之前的历史对话,用户之前询问过K8s 1.23兼容的CSI版本,我给出了详细的兼容性信息,特别是提到了Ceph RBD/CSI的最低版本要求。现在用户具体到Ceph Nautilus,需要结合这两个版本来回答。 首先,要确认Ceph Nautilus是否支持与K8s 1.23的Ceph-CSI版本兼容。根据之前的回复,Ceph CSI需要v3.6.0+,并且Ceph Octopus(v15.2.0)或更高版本。但用户现在使用的是Nautilus,即Ceph 14.2.x,这可能存在兼容性问题。需要检查Ceph-CSI的文档,看看是否有对Nautilus的支持。 接下来,用户可能想知道如何在K8s 1.23上部署Ceph-CSI并使用RBD,但需要注意版本兼容性。可能需要指出虽然官方推荐Octopus或更高版本,但Nautilus可能仍然可用,但存在某些限制或需要特定版本的Ceph-CSI。 另外,用户可能需要具体的部署步骤,比如如何配置Secret、StorageClass等。这时候需要提供示例YAML文件,并确保参数正确,比如monitors的地址,pool的名称,以及csi配置中的集群ID等。 还需要注意K8s 1.23的一些变化是否会影响Ceph-CSI的使用,比如之前提到的弃用特性,比如CSIVolumeFSGroupPolicy,需要确认Ceph-CSI是否已经适配了这些变化。 同时,用户可能会遇到的问题包括认证失败、RBD镜像创建失败、挂载问题等,需要提供常见问题的解决方法,比如检查密钥是否正确,Ceph集群状态,内核模块是否加载等。 可能还需要提醒用户,虽然Nautilus可能在某些情况下工作,但为了更好的兼容性和功能支持,建议升级到Octopus或更高版本。特别是如果用户遇到无法解决的问题,升级Ceph可能是一个必要的步骤。 最后,总结部分需要明确列出兼容性要点、部署步骤和注意事项,确保用户能够清晰理解并在实际操作中参考。同时,提供官方文档链接,方便用户深入查阅。</think>以下是 Kubernetes 1.23 与 Ceph Nautilus (v14.2.x) 结合使用 Ceph-CSI 实现 RBD 持久化存储的完整指南: --- ### **一、兼容性验证** #### **1. 版本对应关系** | **组件** | **最低要求版本** | **说明** | |-------------------|---------------------------|-------------------------------------------------------------------------| | **Ceph 集群** | Nautilus (v14.2.x) | *官方推荐 Octopus (v15.2.0)+,但 Nautilus 仍可兼容* | | **Ceph-CSI** | v3.5.0+ | *v3.6.0+ 开始对 Kubernetes 1.23 有更完善的支持* | | **Kubernetes** | 1.23.x | 需启用 `CSIDriverRegistry` 和 `VolumeSnapshotDataSource` 特性门控(默认开启) | #### **2. 限制说明** - **RBD 功能限制**:Nautilus 不支持较新的 RBD 特性(如 `fast-diff` 镜像克隆加速)。 - **CSI 特性支持**:Ceph-CSI v3.x 在 Nautilus 上**不支持**以下功能: - 卷扩容(需 Ceph Octopus+) - 快照跨集群复制 - RBD Mirroring 自动故障转移 --- ### **二、部署 Ceph-CSI RBD 驱动** #### **1. 前提条件** - Ceph 集群已部署,且包含至少一个 RBD Pool(例如 `kubernetes`)。 - 所有 Kubernetes 节点已安装 `rbd` 内核模块: ```bash modprobe rbd # 手动加载模块(若无则需升级内核或安装 ceph-common 工具包) ``` - 获取 Ceph 管理员密钥(`ceph auth get-key client.admin`)。 #### **2. 创建 Kubernetes Secret** 生成包含 Ceph 集群凭据的 Secret: ```yaml # ceph-secret.yaml apiVersion: v1 kind: Secret metadata: name: ceph-admin-secret namespace: kube-system type: kubernetes.io/rbd data: key: <base64编码的Ceph管理员密钥> # echo "<key>" | base64 ``` #### **3. 部署 Ceph-CSI 驱动** 使用官方 Helm Chart 或 YAML 部署(以 YAML 为例): ```yaml # ceph-csi-rbd.yaml --- apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: rbd.csi.ceph.com spec: attachRequired: true podInfoOnMount: true --- # 部署 CSI Controller kind: Deployment apiVersion: apps/v1 metadata: name: csi-rbdplugin-provisioner namespace: kube-system spec: replicas: 2 selector: matchLabels: app: csi-rbdplugin-provisioner template: metadata: labels: app: csi-rbdplugin-provisioner spec: containers: - name: csi-provisioner image: quay.io/k8scsi/csi-provisioner:v3.0.0 args: ["--csi-address=$(ADDRESS)", "--v=5"] env: - name: ADDRESS value: /var/lib/csi/sockets/pluginproxy/csi.sock volumeMounts: - name: socket-dir mountPath: /var/lib/csi/sockets/pluginproxy/ - name: csi-rbdplugin image: quay.io/cephcsi/cephcsi:v3.6.0 args: ["--nodeid=$(NODE_ID)", "--type=rbd", "--controllerserver=true"] env: - name: NODE_ID valueFrom: fieldRef: fieldPath: spec.nodeName volumeMounts: - name: socket-dir mountPath: /var/lib/csi/sockets/pluginproxy/ volumes: - name: socket-dir emptyDir: {} --- # 部署 CSI Node kind: DaemonSet apiVersion: apps/v1 metadata: name: csi-rbdplugin namespace: kube-system spec: selector: matchLabels: app: csi-rbdplugin template: metadata: labels: app: csi-rbdplugin spec: containers: - name: csi-rbdplugin image: quay.io/cephcsi/cephcsi:v3.6.0 args: ["--nodeid=$(NODE_ID)", "--type=rbd", "--nodeserver=true"] env: - name: NODE_ID valueFrom: fieldRef: fieldPath: spec.nodeName securityContext: privileged: true volumeMounts: - name: plugin-dir mountPath: /var/lib/kubelet/plugins/rbd.csi.ceph.com - name: pods-mount-dir mountPath: /var/lib/kubelet/pods mountPropagation: Bidirectional volumes: - name: plugin-dir hostPath: path: /var/lib/kubelet/plugins/rbd.csi.ceph.com type: DirectoryOrCreate - name: pods-mount-dir hostPath: path: /var/lib/kubelet/pods type: Directory ``` #### **4. 创建 StorageClass** 定义 RBD 存储类: ```yaml # storageclass-rbd.yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-rbd-sc provisioner: rbd.csi.ceph.com parameters: clusterID: <ceph集群ID> # 通过 `ceph fsid` 获取 pool: kubernetes imageFeatures: layering csi.storage.k8s.io/provisioner-secret-name: ceph-admin-secret csi.storage.k8s.io/provisioner-secret-namespace: kube-system csi.storage.k8s.io/node-stage-secret-name: ceph-admin-secret csi.storage.k8s.io/node-stage-secret-namespace: kube-system reclaimPolicy: Delete allowVolumeExpansion: false # Nautilus 不支持扩容 mountOptions: - discard ``` --- ### **三、功能验证** #### **1. 创建 PVC 测试** ```yaml # pvc-test.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rbd-pvc-test spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: csi-rbd-sc ``` #### **2. 挂载到 Pod** ```yaml # pod-test.yaml apiVersion: v1 kind: Pod metadata: name: rbd-pod-test spec: containers: - name: app image: alpine command: ["sleep", "infinity"] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: rbd-pvc-test ``` #### **3. 检查状态** ```bash kubectl get pvc rbd-pvc-test # 应显示 Bound kubectl exec -it rbd-pod-test -- df -h /data # 查看挂载结果 ``` --- ### **四、故障排查** #### **常见问题与解决** 1. **PVC 处于 Pending 状态** - 检查 Ceph 集群监控地址是否可达。 - 验证 Secret 中的密钥是否正确(`kubectl get secret -n kube-system ceph-admin-secret -o yaml`)。 - 查看 CSI Controller 日志:`kubectl logs -n kube-system csi-rbdplugin-provisioner-xxxxx` 2. **Pod 挂载失败** - 确认节点已加载 `rbd` 内核模块(`lsmod | grep rbd`)。 - 检查 Ceph 集群的 RBD Pool 是否存在且权限正确。 3. **性能问题** - 调整 `mountOptions`,例如添加 `nouuid,relatime`。 - 启用 RBD 缓存(需权衡数据一致性风险)。 --- ### **五、升级建议** | **组件** | **推荐动作** | |--------------|-----------------------------------------------------------------------------| | **Ceph** | 升级至 Octopus (v15.2.0)+ 以支持卷扩容、快照克隆等新特性 | | **Ceph-CSI** | 使用 v3.8.0+ 版本以获得完整的 Kubernetes 1.23 兼容性 | --- 如需进一步优化,可参考 [Ceph-CSI 官方文档](https://docs.ceph.com/en/latest/rbd/rbd-kubernetes/) 调整参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心机の之蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值