Kubernetes对象之Pod

系列目录

Pod是Kubernetes调度的最小单元。一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机。Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统 因此处于一个Pod中的多个容器共享以下资源:

  • PID命名空间:Pod中不同的应用程序可以看到其他应用程序的进程ID。
  • network命名空间:Pod中多个容器处于同一个网络命名空间,因此能够访问的IP和端口范围都是相同的。也可以通过localhost相互访问。
  • IPC命名空间:Pod中的多个容器共享Inner-process Communication命名空间,因此可以通过SystemV IPC或POSIX进行进程间通信。
    UTS命名空间:Pod中的多个容器共享同一个主机名。
  • Volumes:Pod中各个容器可以共享在Pod中定义分存储卷(Volume)。

Pod,容器与Node(工作主机)之间的关系如下图所示:

1. Pod的定义

通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

在生产环境中,推荐使用诸如Deployment,StatefulSet,Job或者CronJob等控制器来创建Pod,而不是直接创建。

将上述pod描述文件保存为nginx-pod.yaml,使用kubectl apply命令运行pod

kubectl apply -f nginx-pod.yaml

下面简要分析一下上面的Pod定义文件:

  • apiVersion: 使用哪个版本的Kubernetes API来创建此对象
  • kind:要创建的对象类型,例如Pod,Deployment等
  • metadata:用于唯一区分对象的元数据,包括:name,UID和namespace
  • labels:是一个个的key/value对,定义这样的label到Pod后,其他控制器对象可以通过这样的label来定位到此Pod,从而对Pod进行管理。(参见Deployment等控制器对象)

spec: 其它描述信息,包含Pod中运行的容器,容器中运行的应用等等。不同类型的对象拥有不同的spec定义。详情参见API文档:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.9/

Kubernetes在每个Pod启动时,会自动创建一个镜像为gcr.io/google_containers/pause:version的容器,所有处于该Pod中的容器在启动时都会添加诸如--net=container:pause --ipc=contianer:pause --pid=container:pause的启动参数,因此pause容器成为Pod内共享命名空间的基础。所有容器共享pause容器的IP地址,也被称为Pod IP。

如果我们希望从外部访问这nginx应用,那么我们还需要创建Service对象来暴露IP和port。

2. Pod的生命周期

Pod的生命周期是Replication Controller进行管理的。一个Pod的生命周期过程包括:

  • 通过yaml或json对Pod进行描述
  • apiserver(运行在Master主机)收到创建Pod的请求后,将此Pod对象的定义存储在etcd中
  • scheduler(运行在Master主机)将此Pod分配到Node上运行
  • Pod内所有容器运行结束后此Pod也结束

在整个过程中,Pod通常处于以下的五种阶段之一:

  • Pending:Pod定义正确,提交到Master,但其所包含的容器镜像还未完全创建。通常,Master对Pod进行调度需要一些时间,Node进行容器镜像的下载也需要一些时间,启动容器也需要一定时间。(写数据到etcd,调度,pull镜像,启动容器)。
  • Running:Pod已经被分配到某个Node上,并且所有的容器都被创建完毕,至少有一个容器正在运行中,或者有容器正在启动或重启中。
  • Succeeded:Pod中所有的容器都成功运行结束,并且不会被重启。这是Pod的一种最终状态
  • Failed:Pod中所有的容器都运行结束了,其中至少有一个容器是非正常结束的(exit code不是0)。这也是Pod的一种最终状态。
  • Unknown:无法获得Pod的状态,通常是由于无法和Pod所在的Node进行通信。

2.1 Restart policy

定义Pod时,可以指定restartPolicy字段,表明此Pod中的容器在何种条件下会重启。restartPolicy拥有三个候选值:

  • Always:只要退出就重启
  • OnFailure:失败退出时(exit code不为0)才重启
  • Never:永远不重启

2.2 通过controller管理Pod

Pod本身不具备容错性,这意味着如果Pod运行的Node宕机了,那么该Pod无法恢复。因此推荐使用Deployment等控制器来创建Pod并管理。

一般来说,Pod不会自动消失,只能手动销毁或者被预先定义好的controller销毁。但有一种特殊情况,当Pod处于Succeeded或Failed阶段,并且超过一定时间后(由master决定),会触发超时过期从而被销毁。

总体上来说,Kubernetes中拥有三种类型的controller:

  • Job。通常用于管理一定会结束的Pod。如果希望Pod被Job controller管理,那么restartPolicy必须指定为OnFailure或Never。
  • ReplicationController,ReplicaSet和Deployment。用于管理永远处于运行状态的Pod。如果希望Pod被此类controller管理,那么restartPolicy必须指定为Always。
  • DaemonSet。它能够保证你的Pod在每一台Node都运行一个副本。

原文地址:https://www.cnblogs.com/tylerzhou/p/10977482.html

时间: 2024-08-01 08:17:28

Kubernetes对象之Pod的相关文章

Kubernetes对象之Pod详解(附安装部署方法)

首先介绍一下K8S是什么:(引用自K8S中文社区) Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署.自动扩缩容.维护等功能. 通过Kubernetes你可以: 快速部署应用 快速扩展应用 无缝对接新的应用功能 节省资源,优化硬件资源的使用 其实K8S能够做的事情有很多,而且操作简单,十分方便,下面先介绍如何安装,然后是对于pod详细介绍,如果你对docker还不怎么了解,可以先参考前面的文章学习一下! 环境介绍: CentOS 7.2 Kubernetes

Kubernetes对象

Kubernetes对象 在之前的文章已经讲到了很多Kubernets对象,包括pod,service,deployment等等.Kubernets对象是一种持久化,表示集群状态的实体.它是一种声明式的意图的记录,一般使用yaml文件描述对象,它使用Kubernetes对象来表示集群的状态,通过API/kubectl管理Kubernetes对象. name和uid 在Kubernetes对象模型中,使用了name和uid作为对象的唯一标识,其中name在同一种对象中是唯一的,在不同类型对象可以是

Docker Kubernetes 创建管理 Pod

Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点:192.168.1.77 管理节点:创建pod yaml文件 vim pod.yaml apiVersion: v1 kind: Pod metadata: name: pod-test labels: os: centos spec: contain

kubernetes基本概念 pod, service

k8s的部署架构 kubernetes中有两类资源,分别是master和nodes,master和nodes上跑的服务如下图, kube-apiserver | kubelet kube-controller-manager | kube-scheduler | kube-proxy ---------------------- -------------------- k8s master node (non-master) master:负责管理整个集群,例如,对应用进行调度(扩缩).维护应

使用kustomize进行Kubernetes对象的声明式管理

使用kustomize进行Kubernetes对象的声明式管理 kustomize是一个独立的工具,用于通过kustomization文件来自定义Kubernetes对象. 从1.14开始,Kubectl还支持使用kustomization文件管理Kubernetes对象.要查看在包含kustomization文件的目录中找到的资源,请运行以下命令: kubectl kustomize <kustomization_directory> 要应用这些资源,请使用--kustomize或-k标志运

Kubernetes — 深入解析Pod对象:基本概念(一)

在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 API 对象上,容器(Container)就成了 Pod 属性里的一个普通的字段.那么,一个很自然的问题就是:到底哪些属性属于 Pod 对象,而又有哪些属性属于 Container 呢? 要彻底理解这个问题,你就一定要牢记我在上一篇文章中提到的一个结论:Pod 扮演的是传统部署环境里“虚拟机”的角色.

kubernetes 实践之Pod

首先看一个例子,Guestbook,对k8s对于容器应用的基本操作和用法进行理解,本例通过pod .RC.Service等资源对象创建完成,架构图: ①.创建redis-master的RC和Service [[email protected]_master php-redis]# cat redis-master-controller-RC.yaml apiVersion: v1 kind: ReplicationController metadata: name: redis-master #

kubernetes 无法删除 pod 问题的解决

[摘要] kubernetes 可能会产生垃圾或者僵尸pod,在删除rc的时候,相应的pod没有被删除,手动删除pod后会自动重新创建,这时一般需要先删除掉相关联的resources,实际中还要具体情况具体分析. 在使用Helm部署gitlab的时候发现有垃圾的pod存在,一直删除不掉 # kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE gitlab-migrations.1-2km-4rwnm 1/1 Running

Kubernetes基础:Pod的详细介绍

本文的演练环境为基于Virtualbox搭建的Kubernetes集群,具体搭建步骤可以参考kubeadm安装kubernetes V1.11.1 集群 1. 基本概念 1.1 Pod是什么 Pod是Kubernetes中能够创建和部署的最小单元,是Kubernetes集群中的一个应用实例,总是部署在同一个节点Node上.Pod中包含了一个或多个容器,还包括了存储.网络等各个容器共享的资源.Pod支持多种容器环境,Docker则是最流行的容器环境. 单容器Pod,最常见的应用方式. 多容器Pod