企业级运维之云原生与Kubernets实战课程 - 第一章第3讲 理解Pod和容器设计

简介: 本节课主要介绍Pod概念、Pod解决的问题、Pod启动流程、Pod生命周期管理、Pod中服务探活和K8s常用的命令。

企业级运维之云原生与Kubernets实战课程

第一章第3讲 理解Pod和容器设计

 

视频地址:https://developer.aliyun.com/learning/course/913/detail/14498

 

摘要:本节课主要介绍Pod概念、Pod解决的问题、Pod启动流程、Pod生命周期管理、Pod中服务探活和K8s常用的命令。

 

一、为什么需要Pod

 

1.  思考:Pod是什么?

 

Kubernetes = 操作系统(Linux)

容器 = 进程(Linux线程)

Pod = ?

Pod就是进程组 (Linux线程组)

 

2.  Pod容器的主程序

 

Pod中可能包含了不止一个容器,容器之间哪个是主程序?它们之间会互相控制吗?

假如Pod中存在两个容器AB,容器通过NamespaceCgroup进行进程隔离,那么容器AB在自己的命名空间下,都会认为自己是主程序,Pid1

 

  • ps -ef:查看进程,可以看到进程Pid1的进程为system,其他进程都是通过这个父进程进行启动的;
  • pstree -t -p 加上进程号:查看进程树结构;
  • kubectl get pod:查看默认命名空间下的Pod
  • kubectl get ns:查看所有的命名空间;
  • kubectl get pod -A:查看所有命名空间下的Pod
  • kubectl get pod -n default -o wide:可以查看默认命名空间下Pod运行在哪个节点上;
  • kubeclt describe pod 跟上Pod名称:查看Pod的信息;
  • docker inspect 加上运行镜像ID:查看容器在宿主机上的进程,可以得出容器A和容器B没有关联性,没有父子进程和相互依赖关系。

 

3.  Pod对容器的管理

 

  • Pod使用声明式结构,通过Podyaml格式声明了容器A和容器B,用这种方式去管理K8sPod
  • 一个Pod中存在容器A和容器B,两个容器有相同的网络命名空间和IPC命名空间,实现了网络命名空间和IPC命名空间的互通,查看命令:kubectl exec -it-c 加上应用名字 --bash

 image.png

 

二、Pod要解决的问题

 

容器之间原本是被Linux NamespaceCgroup隔离开的,如何让一个Pod里的多个容器之间,最高效的共享某些资源和数据?

 

1.  共享网络

 image.png

 

Pod是逻辑上的概念,没有以Pod的维度在宿主机上运行,它所有的进程都是以容器维度在宿主机上运行,而网络的命名空间的实现是以Pod在宿主机上运行时,通过运行pause的小容器来共享同一个网络命名空间,实现不同容器之间的通信。

 

比如说在Kubernetes里,容器A和容器B要共享Network Namespace,它会在每个Pod里,额外起一个Infra container小容器,来共享整个PodNetwork Namespace

 

2.  共享存储

 

apiversion:v1

kind:Pod

metadata:

 name:two-containers

spec:

 restartPolicy:Never

 volumes:

 -name:shared-data

   hostPath:

     path:/data

 containers:

 -name:nginx-container

  image:nginx

  volumeMounts:

   -name:shared-data

   mountPath/usr/share/nginx/html

 -name:debian-container

  image:debian

  volumeMounts:

  -name:shared-data

   mountPath:/pod-data

  command:["/bin/sh"]

  args:["-c","echo Hello from the debian container>/

 pod-data/indexhtml"]

 

shared-data对应在宿主机上的目录会被同时绑定挂载进了上述两个容器当中。

 

三、Pod的启动流程

 

所有的应用都是在Pod上运行的,应用在更新时会遇到一些未知的问题,如:502错误、进程不可用、流量打到了Terminating状态的Pod、已被删除的Pod或正在启动的Pod上,如何在生产环境实现平滑的升级,避免更新升级时出现的问题,可以从SVC维度或者Pod维度去解决这个问题。

 

下面探讨一下从Pod维度实现平滑的升级,如何让Pod正常完成启动后才承受流量。

 

1.  Pod启动流程

 

a.  initial container:依次运行直到成功才会退出进入下个环节,作用是准备环境。

b.  多个init:如果失败,会根据设置的restartpolicy进行判断。

c.  Main container:通过poststart运行预先设定的命令,准备程序需要的环境,如果收到了要终止容器的通知,可以通过设置prestop相关指令,合理化的终止,从业务上是连续的并没有中断。

 

2.  探针

 

Pod正常启动后,如何判断能否让该容器承受流量呢?K8s提供了readnessProbeLivenessProbe探针:

 

  • readnessProbe就绪检查达到一定的符合条件Pod才会加到 SVC(VIP)的后端,才可以承受业务流量;
  • LivenessProbe存活检查,设定一定的业务维度探测手段,如果pod正常的,可以承受业务流量,如果不正常就会把Pod剔除掉;
  • 如果同时设置两种探针,是都生效运行的,如果LivenessProbe设置不合理,有一种可能readnessProbe还未成功,LivenessProbe就已经失败,导致容器被剔除,一直重启;
  • 还有一个startupProbe启动探针,如果该探针没有检测成功,其他探针则不会运行。

 

探针的作用:

 

  • 运行某些命令
  • 检测tcp端口
  • 通过http get请求探测

 

判断条件:

 

可以设置多久做一次探测,探测成功多少次认为探针检查成功,及连续探测多少次失败才认为探针失败,进行相应动作处理。

 

四、PodYaml文件讲解

 

ApiVersionK8s标准;

Kind:定义类型;

Metadata:元数据信息;

Lables:为Pod打标签;

Name:为Pod命名;

Namespace:部署的命名空间;

Spec:在这里进行设置容器信息,可以设置initContainers(特权容器);

initContainers:可以定义容器镜像,镜像拉取策略,环境初始化准备;

ImagePullPolicy:可以为Always总是拉取镜像,或IfNotPresent如果本地不存在拉取镜像;

VolumeMounts:设置mountPath挂载路径和挂载方式(如hostpath宿主机挂载);

Lifecycle:设置生命周期,prestop设置容器退出前执行的操作;

Resources:设置资源限制,limit设置最大使用内存和CPU大小,request设置最小运行内存和CPU大小;

StartupProbe:设置启动探针,设置探测的路径和端口及探测方式、延迟探测时间、探测频率及次数;

ReadinessProbelivenessProbe也是可以设置探针进行服务探活,设置方式和StartupProbe类似。

 

通过K8s常用命令(如kubectl describe podgetapply等)可以看到Pod的运行状态、Namespace、节点及Pod IP、启动时间等信息;可以查看到容器ID进而到宿主机上通过该ID找到运行的容器,查看到容器启动命令及容器init containers后的状态、状态码,通过退出状态码找到原因;查看到资源的限制情况及生命周期设置、挂载卷情况;QoS表示服务的优先级,由bestoiiortBurstatbleguaranleed依次升高。

 

在容器内资源限制目录/proc/sys/fs/cgroup,可以查看包括对CPU、内存的限制,如果CPU和内存超出了限制,会导致Pod级别的OOM(内存泄露),而非系统级别的OOM,有时候流量打到SVC后端,Pod响应很慢,也是因为资源超限导致。

 

 

五、本节小结

 

1.Pod是什么维度,为什么需要PodPod是逻辑还是物理。


2.Pod中容器在宿主机上是怎么体现的包括进程,cqroupnamespacePod的启动过程,启动中的探针,探针设置包括readinesslivesnessstartuppod根据规则对容器进行相应的处理。


3.Pod生命周期管理(poststartprestop)


4.K8s常见命令kubeletgetapply

 

下节课主要讲解Pod管理,Pod怎么通过IP暴露服务,管理有哪些型,SVC类型。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1024 108
|
4月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
4月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
7月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
374 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
12月前
|
Cloud Native 安全 Serverless
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
588 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
监控 安全 Cloud Native
阿里云容器服务&云安全中心团队荣获信通院“云原生安全标杆案例”奖
2024年12月24日,阿里云容器服务团队与云安全中心团队获得中国信息通信研究院「云原生安全标杆案例」奖。
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,智算时代云原生操作系统
2024云栖大会,阿里巴巴研究员易立分享了阿里云容器服务的最新进展。容器技术已成为云原生操作系统的基石,支持多样化的应用场景,如自动驾驶、AI训练等。阿里云容器服务覆盖公共云、边缘云、IDC,提供统一的基础设施,助力客户实现数字化转型和技术创新。今年,阿里云在弹性计算、网络优化、存储解决方案等方面进行了多项重要升级,进一步提升了性能和可靠性。