跳到主要内容

pod

组件

apiserver :

  1. 中央控制面板 与其他组件进行通信(调度器、控制器和 kubelet)

  2. RESTful API 接口

kube-scheduler :

  1. 负责将 Pod 调度到合适的节点上运行。(节点的资源可用性、Pod 的亲和性和反亲和性规则) 均匀分布 并获得 足够的资源
  2. 会不断监控集群状态,并根据 Pod 的状态变化进行调整,例如当 Pod 失败时,调度器会重新调度 Pod 到其他节点上运行

kube-controller-manager

  1. 节点控制器:负责维护节点状态,例如检测节点故障并标记节点为不可用。
  2. 端点控制器:负责更新 Service 的端点信息,反映 Pod 的实际状态。
  3. 复制控制器:负责确保运行指定数量的 Pod 副本。
  4. 垃圾回收控制器:负责清理不再需要的资源,例如已完成的 Pod 和无用的镜像。

kubelet

  1. 本地节点上管理 Pod 的生命周期(创建容器、配置网络、挂载卷)
  2. kubelet 监控容器的状态,并向 API 服务器报告 Pod 的状态变化。
  3. kubelet 还负责执行其他任务,例如拉取镜像、清理容器日志等。

kube-proxy

  1. 根据 Service 的配置,将(iptables 或 ipvs)流量转发(负载均衡)到 Service 后端的 Pod 上。

Ingress

  • Ingress 使用七层路由规则来匹配传入流量,并将其路由到正确的 Service。
  • Ingress 可以提供 SSL 终止、身份验证和授权等功能。

CNI

  • CNI 可以是 Flannel、Calico、CNI-Genie 等多种实现。
  • CNI 会为 Pod 创建虚拟网卡,并分配 IP 地址和路由信息。

CNI, CSI, CRI

etcd

  • 作为 Kubernetes 的数据存储,负责保存集群状态,包括 Pod、Service、Deployment 等资源的信息。
  • API 服务器、调度器、控制器等组件都依赖 etcd 来获取和更新集群状态。

pod 创建过程

kubectl -> apiserver ->etcd ->scheduler -> kubelet -> CRI(容器运行时接口) 容器网络接口 (CNI) 挂载卷 ->docker

创建pod 主要流程如下:

1、客户端提交Pod的配置信息(可以是yaml文件定义的信息)到kube-apiserver。

2、Apiserver收到指令后,通知给controller-manager创建一个资源对象。

3、Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中。

4、Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节 点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到 node节点上的kubelet组件上。

5、Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给 scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心

1)客户端提交创建请求,可以通过 api-server 提供的 restful 接口,或者是通过 kubectl 命令行工具,支持的数据类型包括 JSON 和 YAML;

2)api-server 处理用户请求,将 pod 信息存储至 etcd 中;

3)kube-scheduler 通过 api-server 提供的接口监控到未绑定的 pod,尝试为 pod 分配 node 节点,主要分为两个阶段,预选阶段和优选阶段,其中预选阶段是遍历所有的 node 节点,根据策略筛选出候选节点,而优选阶段是在第一步的基础上,为每一个候选节点进行打分,分数最高者胜出;

4)选择分数最高的节点,进行 pod binding 操作,并将结果存储至 etcd 中;

5)随后目标节点的 kubelet 进程通过 api-server 提供的接口监测到 kube-scheduler 产生的 pod 绑定事件,然后从 etcd 获取 pod 清单,下载镜像并启动容器。

详细过程及组件交互 Kubernetes创建一个Pod的详细流程涉及多个组件之间的通信和协作。下面是一个简化的创建Pod的流程:

用户使用kubectl或通过Kubernetes API发送创建Pod的请求。

Kubectl或API Server接收到创建Pod的请求,并验证请求的合法性。

如果请求合法,API Server将请求转发给调度器(Scheduler)。

调度器根据预定义的调度策略和资源约束,选择一个合适的节点来运行Pod。

调度器将Pod的调度决策发送给API Server。

API Server将调度决策保存在etcd中,作为集群状态的一部分。

调度器将Pod的绑定信息发送给Kubelet节点。

Kubelet收到调度器发送的绑定信息后,在相应节点上创建Pod的容器。

Kubelet通过容器运行时(如Docker、containerd)创建和管理Pod的容器。

容器创建完成后,Kubelet会向API Server报告Pod的状态和健康状况。

API Server更新Pod的状态,并将更新写入etcd中。

如果Pod定义中定义了服务(Service),API Server将创建相应的服务对象,并将其与Pod关联起来。

负载均衡器(如kube-proxy)根据服务的定义,将流量转发到Pod所在的节点上的容器。

在这个流程中,涉及到以下几个关键组件的通信:

用户与kubectl或API Server之间的通信:用户通过命令行工具kubectl或使用Kubernetes API与API Server进行通信,发送创建Pod的请求。

API Server与调度器之间的通信:API Server将创建Pod的请求转发给调度器,并接收调度器返回的调度决策。

API Server与etcd之间的通信:API Server将集群状态信息(如调度决策、Pod状态更新)写入etcd中,并从etcd中读取集群状态信息。

调度器与API Server、etcd之间的通信:调度器接收API Server发送的创建Pod请求,并向API Server报告调度决策,这些信息通过API Server与etcd进行通信。

调度器与Kubelet之间的通信:调度器将Pod的绑定信息发送给相应的Kubelet节点,以指示在哪个节点上创建Pod。

Kubelet与容器运行时之间的通信:Kubelet通过容器运行时(如Docker、containerd)创建和管理Pod的容器。

Kubelet与API Server之间的通信:Kubelet向API Server报告Pod的状态和健康状况,以及接收API Server发送的更新信息。

API Server与负载均衡器之间的通信:如果Pod定义中定义了服务,API Server将创建相应的服务对象,并与负载均衡器(如kube-proxy)进行通信,以将流量正确转发到Pod所在的节点。

K8S删除POD的流程 从集群中移除 yaml endpoint 终止容器 优雅停止 kill -15 (-14 发送警告) 等待终止超时 30s 清理资源 可能的重新调度

1)pod从service的endpoint列表中被移除;

2)如果该pod定义了一个停止前的钩子,其会在pod内部被调用,停止钩子一般定义了如何优雅的结束进程;

3)进程被发送TERM信号(kill -14);

4)当超过优雅退出的时间后,Pod中的所有进程都会被发送SIGKILL信号(kill -9)

详述 当删除一个 Pod 时,以下事件将会发生:

从集群中移除:Kubernetes 控制平面接收到删除操作后,将从集群中移除该 Pod 的相关配置和定义。这意味着该 Pod 将不再被调度到任何节点,并且不再受到 Kubernetes 的管理。

终止容器:Kubernetes 会向 Pod 中的容器发送 SIGTERM 信号(15号信号),请求容器进行优雅关闭。容器收到该信号后,可以执行清理操作、释放资源、保存状态等,并尽量在一定时间内正常退出。

等待终止超时:在发送 SIGTERM 信号后,Kubernetes 会等待一段时间(默认为 30 秒)来等待容器正常退出。如果容器在超时时间内仍然没有终止,Kubernetes 将发送 SIGKILL 信号(9号信号)强制终止容器。

清理资源:一旦容器终止,Kubernetes 将清理与该 Pod 相关的资源。这可能包括释放节点上的网络、存储卷、临时文件等资源,以及更新集群中的状态信息。

可能的重新调度:如果删除的 Pod 属于由 ReplicaSet、Deployment 或其他控制器管理的副本集,Kubernetes 将尝试根据副本集的定义重新调度一个新的 Pod 来替代被删除的 Pod,以确保所需的副本数维持在正常状态。

静态pod

是由kubelet进行管理的仅存在于特定Node的Pod上,他们不能通过API Server进行管理,无法 与ReplicationController、Deployment或者DaemonSet进行关联,并且kubelet无法对他们进行健康检查。

静态Pod总是由kubelet进行创建,并且总是在kubelet所在的Node上运行。

K8S POD的共享资源 网络资源共享:Pod 中的容器可以共享同一个网络命名空间,它们可以通过 localhost 直接相互通信,而无需进行网络地址转换。此外,它们还可以共享同一个 IP 地址和端口空间。

存储资源共享:Pod 中的容器可以共享同一个存储卷(Volume)。这意味着它们可以访问和修改同一个存储卷中的数据。

进程间通信(IPC)资源共享:Pod 中的容器可以通过共享 IPC 命名空间进行进程间通信。它们可以使用共享的 System V IPC 对象(如共享内存、消息队列和信号量)进行通信。

命名空间(Namespace)资源共享:Pod 中的容器可以共享同一个命名空间,这意味着它们可以访问相同的系统资源和文件系统。

UTS 命名空间共享:UTS 命名空间用于隔离主机的主机名和域名。通过共享 UTS 命名空间,Pod 中的容器可以共享相同的主机名和域名。这意味着它们在网络上看起来像是同一台主机。 共享 UTS 命名空间对于某些应用场景很有用,比如需要在容器之间进行主机名解析或者依赖主机名的应用。共享 UTS 命名空间可以确保容器之间的主机名和域名保持一致,从而简化了应用的配置和管理。

pod 状态

Pending:API Server已经创建该Pod,且Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜

像的过程。

Running:Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状 态。

Succeeded:Pod内所有容器均成功执行退出,且不会重启。

Failed:Pod内所有容器均已退出,但至少有一个容器退出为失败状态。

Unknown:由于某种原因无法获取该Pod状态,可能由于网络通信不畅导致。

pod 处于 Pending 状态的原因

  • 调度器错误:如果调度器出现故障, 节点标签,亲和性,没有找到合适的节点
  • 资源不足:如果集群中没有足够的资源(limits/ CPU、内存等)来满足 pod 的要求,则 pod 将保持 Pending 状态。
  • pv/pvc ConfigMap 无法正常创建
  • 映像拉取错误(网络问题):如果 pod 无法拉取其所需的映像,则它将保持 Pending 状态。
  • 节点污点(Taint)和容忍度(Toleration)不匹配:如果节点被“污染”,则它将被标记为排斥某些 pod。
  • 节点不可调度:如果节点不可调度,则 pod 将无法在其上调度。

以下是排查 Kubernetes pod 处于 Pending 状态的一些步骤:

  1. 检查 pod 的资源请求和限制。确保 pod 的资源请求和限制不超过集群中可用资源的总量。
  2. 检查 pod 的日志,看看是否有任何错误消息。错误消息可能提供有关为什么 pod 处于 Pending 状态的线索。
  3. 使用 kubectl describe pod 命令获取有关 pod 的更多详细信息。此命令将输出有关 pod 的状态、资源、映像和节点的信息。
  4. 使用 kubectl get nodes 命令获取有关集群中节点的详细信息。此命令将输出有关每个节点的名称、状态、资源和污点的详细信息。

pod一直是waiting

容器的镜像名称正确否? 容器镜像推送否? 节点上docker pull / ctr -n k8s.io image pull 能拉取否?

pod处于running状态,但是不工作

yaml语法、格式问题排查 kubectl apply xxx.yaml --validate pod是否达到预期? kubectl get pod mypod -o yaml > mypod.yaml kubectl apply -f mp.yaml

Pod的重启策略包括

Always、OnFailure和Never,默认值为Always。

Always:当容器失效时,由kubelet自动重启该容器; OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器; Never:不论容器运行状态如何,kubelet都不会重启该容器。

同时Pod的重启策略与控制方式关联,当前可用于管理Pod的控制器包括ReplicationController、Job、 DaemonSet及直接管理kubelet管理(静态Pod)。

不同控制器的重启策略限制如下:

RC和DaemonSet:必须设置为Always,需要保证该容器持续运行; Job:OnFailure或Never,确保容器执行完成后不再重启; kubelet:在Pod失效时重启,不论将RestartPolicy设置为何值,也不会对Pod进行健康检查。

Pod的健康检查方式?

对Pod的健康检查可以通过两类探针来检查:LivenessProbe和ReadinessProbe。

LivenessProbe****探针:用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不 健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应处理。若一个容器不包含LivenessProbe 探针,kubelet认为该容器的LivenessProbe探针返回值用于是“Success”。

ReadineeProbe****探针:用于判断容器是否启动完成(ready状态)。如果ReadinessProbe探针探测到 失败,则Pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod 的Eenpoint。

startupProbe****探针:启动检查机制,应用一些启动缓慢的业务,避免业务长时间启动而被上面两类探 针kill掉。

kubelet定期执行LivenessProbe探针来诊断容器的健康状态,通常有以下三种方式: ExecAction:在容器内执行一个命令,若返回码为0,则表明容器健康。 TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,若能建立TCP连接,则表明容器健康。

HTTPGetAction:通过容器的IP地址、端口号及路径调用HTTP Get方法,若响应的状态码大于等于200 且小于400,则表明容器健康。

就绪探针的附加属性参数有以下几个:

initialDelaySeconds:延时秒数,即容器启动多少秒后才开始探测,不写默认容器启动就探测;

periodSeconds :执行探测的频率(秒),默认为10秒,最低值为1;

timeoutSeconds :超时时间,表示探测时在超时时间内必须得到响应,否则视为本次探测失败,默认为1秒,最小值为1;

failureThreshold :连续探测失败的次数,视为本次探测失败,默认为3次,最小值为1次;

successThreshold :连续探测成功的次数,视为本次探测成功,默认为1次,最小值为1次;

Pod****的常见调度方式? Kubernetes中,Pod通常是容器的载体,主要有如下常见调度方式:

Deployment或RC:该调度策略主要功能就是自动部署一个容器应用的多份副本,以及持续监控副 本的数量,在集群内始终维持用户指定的副本数量。 NodeSelector:定向调度,当需要手动指定将Pod调度到特定Node上,可以通过Node的标签 (Label)和Pod的nodeSelector属性相匹配。 NodeAffinity亲和性调度:亲和性调度机制极大的扩展了Pod的调度能力,目前有两种节点亲和力 表达: requiredDuringSchedulingIgnoredDuringExecution:硬规则,必须满足指定的规则,调度器才 可以调度Pod至Node上(类似nodeSelector,语法不同)。 preferredDuringSchedulingIgnoredDuringExecution:软规则,优先调度至满足的Node的节 点,但不强求,多个优先级规则还可以设置权重值。

Taints和Tolerations(污点和容忍): Taint:使Node拒绝特定Pod运行; Toleration:为Pod的属性,表示Pod能容忍(运行)标注了Taint的Node。

Kubernetes 提供了多种机制来确保 Pod 正常运行:

容器重启策略 Always deployment

节点健康检查

生命周期探测

日志记录和监控

资源配额

污点和容忍

Kubernetes 服务发现的工作原理如下:

  1. 客户端发送请求到 Kubernetes 集群中的任意一个 Pod。
  2. Pod 将请求转发到 Service 代理(kube-proxy)。
  3. kube-proxy 根据 Service 的配置规则,通过 iptables 或 IPVS 将请求转发到正确的 Pod。
  4. 请求被转发到与 Service 关联的 Pod,并由容器中的应用程序处理。
  5. Pod 将响应发送回 kube-proxy,然后 kube-proxy 将响应返回给客户端。

CoreDNS 提供以下优势,使其成为 Kubernetes 服务发现的理想选择:

  • 高性能:CoreDNS 是一个高性能的 DNS 服务器,可以快速处理 DNS 查询。
  • 可扩展性:CoreDNS 可以扩展到支持大型 Kubernetes 集群。
  • 可定制性:CoreDNS 可以使用插件进行定制以满足您的特定需求。

Kubernetes 服务发现具有以下优点:

  • 简单性:客户端无需知道 Pod 的 IP 地址或端口即可连接到它们。
  • 可扩展性:随着 Pod 的数量增加或减少,Service 将自动更新以反映这些更改。
  • 高可用性:如果 Pod 失败,Service 将继续将流量路由到其他 Pod。
  • 负载均衡:Service 可以将流量均匀地分布在 Service 后端的 Pod 之间。

Kubernetes 负载均衡是一种通过将流量分配给多个后端 Pod 来提高应用程序可用性和性能的技术。它通过使用称为 Service 的抽象和 Kube-proxy 守护进程来实现。

Service 充当一组 Pod 的前端,并提供稳定的网络端点。客户端可以使用 Service 名称和端口来连接到 Pod,而无需知道 Pod 的 IP 地址或端口。

Kube-proxy 运行在每个节点上,负责将请求转发到 Service 后端的 Pod。它使用各种负载均衡算法来选择要路由到哪个 Pod,例如随机、轮询和最少活跃最少使用 (LEAST_ACTIVE_POD_LAST_USED)。

Kubernetes 负载均衡具有以下优点:

  • 提高可用性:如果一个 Pod 失败,Kube-proxy 将继续将流量路由到其他 Pod。
  • 提高性能:通过将流量分布在多个 Pod 上,可以提高应用程序的性能。
  • 降低复杂性:客户端无需知道 Pod 的 IP 地址或端口即可连接到它们。

Ingress 是一种 Kubernetes 资源,用于将外部流量路由到集群内部的服务。它使用七层路由规则来匹配传入流量并将其路由到正确的服务。

Ingress 通常与 Ingress 控制器 一起使用,例如 Nginx 或 Traefik。Ingress 控制器将 Ingress 资源转换为负载均衡器配置,并负责将流量路由到正确的服务。

Ingress 具有以下优点:

  • 灵活性:Ingress 支持使用七层路由规则来匹配传入流量,这使您可以更灵活地控制流量路由。
  • SSL 终止:Ingress 可以终止 SSL/TLS 连接,这可以保护您的应用程序。
  • 身份验证和授权:Ingress 可以与身份验证和授权后端(如 Auth0 或 Keycloak)集成,以保护您的应用程序。
  • 外部名称:Ingress 可以为您的应用程序提供外部名称,这使您可以轻松地从外部访问它们。

何时使用服务

如果您需要一种简单的方法来暴露内部服务,则 服务 是一个不错的选择。服务易于使用且可扩展,并且它们提供高可用性和负载均衡。

何时使用 Ingress

如果您需要更灵活的路由功能,例如 SSL 终止、身份验证和授权或外部名称,则 Ingress 是一个不错的选择。Ingress 还可用于将外部流量路由到多个服务。

K8S中负载均衡的原理

service

endpoint

k8s service是如何与pod关联的

Service 使用 Selector 来指定它要关联的 Pod。Selector 是一种基于标签的匹配机制,允许 Service 根据 Pod 的标签值来选择要关联的 Pod。

Endpoint 是 Service 的实际后端,它包含了 Service 所关联的 Pod 的 IP 地址和端口信息。Endpoint 由 kube-proxy 维护,并根据 Service 的 Selector 动态更新。

当客户端连接到 Service 时,kube-proxy 会根据 Service 的负载均衡算法将请求转发到 Endpoint 中的 Pod 之一。例如,kube-proxy 可以使用轮询、随机或最少活跃最少使用 (LEAST_ACTIVE_POD_LAST_USED) 等算法来选择转发请求的 Pod。

  1. 用户创建 Service 并定义 Selector。
  2. API Server 将 Service 信息存储到 etcd 中。
  3. kube-proxy 监视 etcd 中的 Service 信息。
  4. Pod 创建并运行后,kubelet 会将 Pod 的信息更新到 API Server。
  5. API Server 会将 Pod 的信息更新到 etcd 中。
  6. kube-proxy 监视 etcd 中的 Pod 信息,并根据 Selector 更新 Service 的 Endpoint 信息。
  7. 客户端连接到 Service 时,kube-proxy 会根据 Endpoint 信息将请求转发到 Pod 之一。

K8S的四种PORT nodePort 对外通过端口访问 port 对内 通过 server:port 访问 targetPort 经过kube-proxy转发到的端口 containerPort 转发后进入容器的端口

k8s 控制器 工作原理

必须启动的控制器

  • EndpointController: 负责管理 Endpoints 对象,Endpoints 对象用于描述服务的端点信息。

默认启动的可选控制器

  • ReplicationController: 负责确保集群中的 Pod 数量与指定的数量相匹配。
  • NodeController: 负责管理集群中的节点,包括节点的加入、退出和更新。
  • DaemonSetController: 负责确保每个节点上都运行指定数量的 Pod。
  • JobController: 负责运行一次性作业。
  • HorizontalPodAutoscalerController: 负责根据 CPU 或内存使用率自动伸缩 Pod 的数量。
  • NamespaceController: 负责管理命名空间,包括命名空间的创建、删除和更新。
  • ServiceAccountController: 负责管理服务账号,服务账号用于为 Pod 提供身份验证和授权。
  • TokenController: 负责管理 Bootstrap Token,Bootstrap Token 用于简化集群的引导过程。

默认禁止的可选控制器

  • ReschedulerController: 负责将 Pod 重新调度到其他节点上,当 Pod 所在的节点出现故障时。
  • ValidatingAdmissionWebhookController: 负责验证 Pod、Service 等资源的有效性。

Pod 无法启动,如何查找原因?

  • 使用 kubectl describe pod [podname] -n [namespace_name] 命令意看该 Pod 的状态信息,检直容器的状态和事件信息,判断是否出现问题。

  • 使用 kubectl logs [pod_name] -n [namespace_name] 命令查看该 Pod 容器的日志信息,判断是否有错误或异常信息。

  • 使用 kubectl get events --field-selector involvedobject.name= [pod_name] -n [namespace_name] 命令查看该 Pod 相关的事件信息,判断是否 有异常事件发生,

Pod 无法连接到其他服务,如何排查?

使用 kubectl exec -it [pod_name] -n [namespace-name] -- /bin/bash 命令进入该 Pod 所在的容品,尝试使用 ping 或 telnet 等命令测试与其他 服务的网络连接情况。 使用 kubectl describe pod [podLname] -n [namespace_name] 命令检查 Pod 的 NetworkPolicy 配置,判新是否阻止了该 Pod 访问其他服务。 使用 kubectl describe service [service_name] -n [namespace-name]命令检查目标服务的配置和状态信息,判断是否存在故隨。

Pod 运行缓慢或异常,如何排查?

  • 使用 kubectl top pod [pod_name] -n [namespace_name] 命令查看该 Pod 的 CPU 和内存使用情况,判断是否存在性能瓶颈。

  • 使用 kubectl exec -it [pod_name] -n Inamespace_name] --/bin/bash 命令进入该 Pod 所在的容器,使用 top 或 htop 命令查看容器内部进程的CPU 和内存使用情况,找出可能存在的瓶颈。

  • 使用 kubectl logs [pod_name] -n [namespace_name]命令查看该 Pod 容器的日志信息,寻找可能的错误或异常信息。

Pod 无法被调度到节点上运行,如何排差

  • 使用 kubectl describe pod [pod_name] -n [namespace_name]命令童看 Pod 的调度情况,判断是否存在资源不足、调庭策略等问题。

  • 使用 kubectl get nodes 和 kubectl describe node [node-name]命令查看所有节点的资源使用情况,判断是否存在节点资源不足或故瞳的情况。

  • 使用 kubectl describe pod [podname] -n [namespace_name] 命令检查 Pod 所需的标签和注释,以及节点的标签和注释,判断是否匹配。

Pod 状态一直是 Pending, 怎么办? 查看该 Pod 的事件信息:kubect1 describe pod [pod-name] 查看该节点资源利用率是否过高:kubectl top node 如果是调度问题,可以通过以下方式解决: 确保有足彩的节点资源满足该 Pod 调度需求

查看 Pod 中的应用程序日志:kubectl logs [pod-name] 查看该 Pod 的事件信息:kubectl describe pod [pod-name] 检查应用程序的配置文件是否正确 检查应用程序的依赖是否正常 尝试在本地使用相同的镇像运行该容强,查看是否有报谱信息,如执行 docker run ximage-names 确认该应用程序是否与 Pod 的资源限制相符

Kubernetes 集群中的 Service 不可访问,怎么办? 检查 Service 的定义是否正确 检查 endpoint 是否正确生成 检直网络插件配置是否正确 确保防火埔配置允许 Service 对外开放

pod特点

每个pod就像一个独立的逻辑机器,k8s会为每个pod分配一个集群内部唯一的IP地址,所以每个pod都拥有自己的IP地址、主机名、进程等;

2、一个pod可以包含1个或多个容器,1个容器一般被设计成只运行1个进程,1个pod只可能运行在单个节点上,即不可能1个pod跨节点运行,pod的生命周期是短暂,也就是说pod可能随时被消亡(如节点异常,pod异常等情况);

3、每一个pod都有一个特殊的被称为"根容器"的pause容器,也称info容器,pause容器对应的镜像属于k8s平台的一部分,除了pause容器,每个pod还包含一个或多个跑业务相关组件的应用容器;

4、一个pod中的容器共享network命名空间;

5、一个pod里的多个容器共享pod IP,这就意味着1个pod里面的多个容器的进程所占用的端口不能相同,否则在这个pod里面就会产生端口冲突;既然每个pod都有自己的IP和端口空间,那么对不同的两个pod来说就不可能存在端口冲突;

6、应该将应用程序组织到多个pod中,而每个pod只包含紧密相关的组件或进程;

7、pod是k8s中扩容、缩容的基本单位,也就是说k8s中扩容缩容是针对pod而言而非容器。

img