首页 > Web开发 > 详细

Kubernetes Pod学习

时间:2020-09-22 12:00:07      阅读:46      评论:0      收藏:0      [点我收藏+]

Kubernetes-Pod 学习

K8s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务Pod。Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。

Pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet,本文后面会一一介绍。

什么是POD

Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上。Pod中包含了一个或多个容器,还包括了存储、网络等各个容器共享的资源。Pod支持多种容器环境,Docker则是最流行的容器环境。

Pod并不提供保证正常运行的能力,因为可能遭受Node节点的物理故障、网络分区等等的影响,整体的高可用是Kubernetes集群通过在集群内调度Node来实现的。通常情况下我们不要直接创建Pod,一般都是通过Controller来进行管理,但是了解Pod对于我们熟悉控制器非常有好处。

Pod带来的好处

  • Pod做为一个可以独立运行的服务单元,简化了应用部署的难度,以更高的抽象层次为应用部署管提供了极大的方便。
  • Pod做为最小的应用实例可以独立运行,因此可以方便的进行部署、水平扩展和收缩、方便进行调度管理与资源的分配。
  • Pod中的容器共享相同的数据和网络地址空间,Pod之间也进行了统一的资源管理与分配。

Pod是如何管理多个容器的

Pod中可以同时运行多个进程(作为容器运行)协同工作。同一个Pod中的容器会自动的分配到同一个 node 上。同一个Pod中的容器共享资源、网络环境和依赖,所以它们总是被同时调度。在一个Pod中同时运行多个容器是一种比较高级的用法。只有当你的容器需要紧密配合协作的时候才考虑用这种模式。

Pod的持久性

Pod在设计?持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐。 通常,?户不需要?动直接创建Pod, ?是应该使?controller(例如Deployments) , 即使是在创建单个Pod的情况下。 Controller可以提供集群级别的?愈功能、 复制和升级管理。

Pod的启动流程分析

kubelet 通过 API Server 监听 etcd 目录,同步 pod 列表。如果发现有新的 pod 绑定到本节点,则按照 pod 清单要求创建 pod,如果是发现 pod 被更新,则做出相应更改。读取到 pod 的信息之后,如果是创建和修改 pod 的任务,则做如下处理:

  1. 为该 pod 创建一个数据目录
  2. 从 API Server 读取该 pod 清单
  3. 为该 pod 挂载外部卷
  4. 下载 pod 所需的 Secret
  5. 检查已经运行在节点中 pod,如果该 pod 没有容器或者 Pause 容器没有启动,则先停止pod里所有的容器进程。
  6. 使用 pause 镜像为每个pod创建一个容器,该容器用于接管 Pod 中所有其他容器的网络。
  7. 为 pod 中的每个容器做如下处理:1.为容器计算一个 hash 值,然后用容器的名字去查询对于 docker 容器的 hash 值。若查找到容器,且两者的 hash 值不同,则停止 docker 中容器中进程,并停止与之关联的 pause 容器,若相同,则不做处理。若容器被终止了,且容器没有指定的重启策略,则不做任何处理调用 docker client 下载容器镜像,并启动容器。

Pod的生命周期

初始化容器

pod 内主容器启动之前要运行的容器,主要是做一些前置工作,初始化容器具有以下特征:

  • 初始化容器必须首先执行,若初始化容器运行失败,集群会一直重启初始化容器直至完成,注意,如果 pod 的重启策略为 Never,那初始化容器启动失败后就不会重启。
  • 初始化容器必须按照定义的顺序执行,初始化容器可以通过 pod 的 spec.initContainers 进行定义。

生命周期钩子

Kubernetes 为容器提供了两种生命周期钩子

  • Poststart:于容器创建完成之后立即运行的钩子程序。
  • preStop:容器终止之前立即运行的程序,是以同步方式的进行,因此其完成之前会阻塞 删除容器的调用

容器探测

容器探测分为存活性探测和就绪性探测容器探测是kubelet对容器健康状态进行诊断,容器探测的方式主要以下三种

  • ExecAction:在容器中执行命令,根据返回的状态码判断容器健康状态,返回0即表示成功,否则为失败。
  • TCPSocketAction: 通过与容器的某TCP端口尝试建立连接进行诊断,端口能打开即为表示成功,否则失败。
  • HTTPGetAction:向容器指定 URL 发起 HTTP GET 请求,响应码为2xx或者是3xx为成功,否则失败。

Pod终止

Pod终止包含如下几个步骤

  1. 用户发出删除 pod 命令
  2. Pod 对象随着时间的推移更新,在宽限期(默认情况下30秒),pod 被视为“dead”状态
  3. 将 pod 标记为“Terminating”状态
  4. 第三步同时运行,监控到 pod 对象为“Terminating”状态的同时启动 pod 关闭过程
  5. 第三步同时进行,endpoints 控制器监控到 pod 对象关闭,将pod与service匹配的 endpoints 列表中删除
  6. 如果 pod 中定义了 preStop 钩子处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期
  7. Pod 内对象的容器收到 TERM 信号
  8. 宽限期结束之后,若存在任何一个运行的进程,pod 会收到 SIGKILL 信号
  9. Kubelet 请求 API Server 将此 Pod 资源宽限期设置为0从而完成删除操作

pause容器主要功能

每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。同一个Pod里的容器之间仅需通过localhost就能互相通信。
  • PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID。
  • 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围。
  • IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。
  • UTS命名空间:Pod中的多个容器共享一个主机名;Volumes(共享存储卷):
  • Pod中的各个容器可以访问在Pod级别定义的Volumes。

配置

Pod的配置信息中有几个重要部分,apiVersion、kind、metadata(元数据)、spec以及status。其中apiVersion和kind是比较固定的,status是运行时的状态,所以最重要的就是metadata和spec两个部分。
apiVersion: v1
kind: Pod
metadata:
  name: first-pod
  labels:
    app: bash
spec:
  containers:
    - name: bash-container
      image: busybox
      command: [‘sh‘, ‘-c‘, ‘echo Hello Kubernetes! && sleep 10‘]Copy to clipboardErrorCopied

执行结果

[root@instance-gvpb80ao docs]# kubectl apply -f test.yaml 
pod/first-pod created
[root@instance-gvpb80ao docs]# kubectl get -f test.yaml 
NAME        READY   STATUS              RESTARTS   AGE
first-pod   0/1     ContainerCreating   0          6sCopy to clipboardErrorCopied

Pod资源清单

apiVersion: v1                             # 必选,API的版本号
kind: Pod                                  # 必选,类型Pod
metadata:                                  # 必选,元数据
  name: nginx                              # 必选,符合RFC 1035规范的Pod名称
  namespace: web-testing                   # 可选,不指定默认为default,Pod所在的命名空间
  labels:                                  # 可选,标签选择器,一般用于Selector
    - app: nginx
  annotations:                             # 可选,注释列表
    - app: nginx
spec:                                      # 必选,用于定义容器的详细信息
  containers:                              # 必选,容器列表
  - name: nginx                            # 必选,符合RFC 1035规范的容器名称
    image: nginx:v1                        # 必选,容器所用的镜像的地址
    imagePullPolicy: Always                # 可选,镜像拉取策略
    workingDir: /usr/share/nginx/html      # 可选,容器的工作目录
    volumeMounts:                          # 可选,存储卷配置
    - name: webroot                        # 存储卷名称
      mountPath: /usr/share/nginx/html     # 挂载目录
      readOnly: true                       # 只读
    ports:                                 # 可选,容器需要暴露的端口号列表
    - name: http                           # 端口名称
      containerPort: 80                    # 端口号
      protocol: TCP                        # 端口协议,默认TCP
    env:                                   # 可选,环境变量配置
    - name: TZ                             # 变量名
      value: Asia/Shanghai
    - name: LANG
      value: en_US.utf8
    resources:                            # 可选,资源限制和资源请求限制
      limits:                             # 最大限制设置
        cpu: 1000m
        memory: 1024MiB
      requests:                           # 启动所需的资源
        cpu: 100m
        memory: 512MiB
    readinessProbe:                       # 可选,容器状态检查
      httpGet:                            # 检测方式
        path: /                           # 检查路径
        port: 80                          # 监控端口
      timeoutSeconds: 2                   # 超时时间 
      initialDelaySeconds: 60             # 初始化时间
    livenessProbe:                        # 可选,监控状态检查
      exec:                               # 检测方式
        command: 
        - cat
        - /health
      httpGet:                            # 检测方式
        path: /_health
        port: 8080
        httpHeaders:
        - name: end-user
          value: jason
      tcpSocket:                         # 检测方式
        port: 80
      initialDelaySeconds: 60            # 初始化时间
      timeoutSeconds: 2                  # 超时时间
      periodSeconds: 5                   # 检测间隔
      successThreshold: 2                # 检查成功为2次表示就绪
      failureThreshold: 1                # 检测失败1次表示未就绪
    securityContext:                     # 可选,限制容器不可信的行为
      provoleged: false
  restartPolicy: Always                  # 可选,默认为Always
  nodeSelector:                          # 可选,指定Node节点
    region: subnet7
  imagePullSecrets:                      # 可选,拉取镜像使用的secret
  - name: default-dockercfg-86258
  hostNetwork: false                     # 可选,是否为主机模式,如是,会占用主机端口
  volumes:                               # 共享存储卷列表
  - name: webroot                        # 名称,与上述对应
    emptyDir: {}                         # 共享卷类型,空
    hostPath:                            # 共享卷类型,本机目录
      path: /etc/hosts
    secret:                             # 共享卷类型,secret模式,一般用于密码
      secretName: default-token-tf2jp   # 名称
      defaultMode: 420                  # 权限
      configMap:                        # 一般用于配置文件
      name: nginx-conf
      defaultMode: 420

Kubernetes Pod学习

原文:https://www.cnblogs.com/jojoblog/p/13710558.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!