Kubernetes: Pod与Namespace

Pod#

基本特性#

  • Pod是Kubernetes中的最小单位,由一个或一组容器组成。一个容器中运行一个进程,而一个Pod运行多个进程;
  • 为实现亲密性应用,Pod内部的容器共享网络和挂载卷,因此可以方便地实现多个应用间交互;
  • 每一个Pod其实都具有两种不同的容器,一种是Init容器:在Pod启动时运行,主要用于初始化一些配置。另一种是Pod在Running状态时内部存活的应用容器,它们的主要作用是对外提供服务或者作为工作节点处理异步任务等;
  • Pod的生命周期短暂。

Spec和Status#

以一个名为busybox的Pod为例:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

Pod的Spec指定了Pod中包含的容器以及容器的镜像、启动命令等信息,上述例子中还包括了镜像拉取策略、容器资源限制以及Pod重启策略。
而每一个Pod的Status包含了生命周期、当前服务状态、宿主机和Pod的IP地址以及其中内部所有容器的状态信息等:

status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: 2018-12-09T02:40:37Z
    status: "True"
    type: Initialized
  containerStatuses:
  - containerID: docker://99f668a89db97342d7bd603471dfad5be262d7708b48cb6c5c8e374e9a13cf4f
    image: busybox:latest
    imageID: docker-pullable://busybox@sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5
    lastState: {}
    name: busybox
    ready: true
    restartCount: 0
    state:
      running:
        startedAt: 2018-12-09T02:40:37Z
  hostIP: 10.128.0.18
  phase: Running
  podIP: 10.4.0.28
  # ...

共享网络#

20210127152215

  • 每一个节点上都会由Kubernetes的网络插件Kubenet创建一个基本的cbr0网桥并为每一个Pod创建veth虚拟网络设备;
  • 同一个Pod中的所有容器就会通过这个网络设备共享网络,也就是能够通过localhost互相访问彼此暴露的端口和服务;
  • 这个网络设备Pause容器在启动时创建的。

共享存储#

  • 一个Pod可以设置一组共享的存储卷(Volume),Pod中的所有容器都可以访问该共享卷,从而允许这些容器共享数据;
  • Volume还允许Pod中的持久化数据保留下来,即使其中的容器需要重新启动;
  • 在当前Pod出现故障或者滚动更新时,对应Volume中的数据并不会被清除,而是会在Pod重启后重新挂载到期望的文件目录中;
  • 卷的挂载是Pod启动之前必须要完成的工作。

生命周期#

  • Pod的状态有:Pending、Running、Succeeded、Failed和Unkown,容器的状态有:Waiting、Running和Terminated;
  • Pod遵循一个预定义的生命周期,起始于Pending阶段,如果至少其中有一个应用容器正常启动,则进入Running阶段。如果Pod中的容器均成功正常退出,则Pod为Succeeded状态。若Pod中的容器均已退出但至少有一个容器因为发生错误而退出,则Pod为Failed状态;
  • 任何给定的Pod(由 UID 定义)从不会被“重新调度(rescheduled)”到不同的节点。相反,这一Pod可以被一个新的、几乎完全相同的 Pod 替换掉。如果需要,新Pod的名字可以不变,但是其UID会不同;
  • 一个Pod的完整生命周期经历:Create -> Probe -> Running -> Shutdown -> Restart。

Create#

Pod启动前由Init容器来完成一些初始化操作。初始化完毕后,Init容器运行至Terminated,应用容器启动。在应用容器启动后可以执行一些特定的指令,称为启动后钩子(PostStart)。Kubernetes在管理容器时,将一直等到PostStart执行完成后,才会将容器的状态标记为Running。

Probe#

如果我们配置了合适的健康检查方法和规则,那么就不会出现服务未启动就被打入流量或者长时间未响应依然没有重启等问题。因此,我们应当尽可能为每一个Pod添加livenessProbe(存活检查)和readinessProbe(就绪检查)。ProbeManager会根据Pod的配置分别选择调用Exec、HTTPGet或TCPSocket三种不同的Probe方式。

Shutdown#

对于每一个容器来说,它们的停止有一下几个步骤:

  1. 先从Pod的规格中计算出当前停止所需要的时间;
  2. 然后调用PreStop的钩子方法,让容器中的应用程序能够有时间完成一些未处理的操作;
  3. 随后调用远程的服务停止运行中的容器。

Namespace#

基本特性#

  • Namespace隔离各种资源,可以理解为kubernetes内部的虚拟集群组;
  • 不同Namespace内的资源Name可以相同,相同Namespace内的同种资源则不可以;
  • Namespace不能相互嵌套,每个Kubernetes资源只能在一个Namespace中;
  • 默认的Namespace:default, kube-system,kube-public。

kubectl命令#

  • 查看所有namespace:
    kubectl get ns
    
  • 查看指定namespace下的资源:
    kubectl get <resource> -n <namespace>
    
  • 查看所有namespace下的资源:
    kubectl get <resource> --all-namespace=true
    
  • 利用Openshift的oc命令切换namespace:
    oc project <namespace>
    

参考文献#

https://kubernetes.io/docs/home/
https://draveness.me/understanding-kubernetes/

posted @   koktlzz  阅读(777)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩