K8S | 容器和Pod组件

简介: 不论是软件环境还是虚拟机系统的搭建,基本都是通过下载软件安装包,然后在本地部署和定期更新以及运行,基于这个场景再去理解容器和Pod组件,会轻松许多;

对比软件安装和运行;

一、场景

作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境;

1.png

对于「基础设施」、「主机操作系统」、「系统软件」来说,通常只做配置修改;

对于自行安装的软件环境来说,个人通常这样分类:「应用软件」、「研发软件」、「持续集成」、「虚拟机环境」;

  • 应用软件:主要指常用的办公软件,比如文档编写,画图设计,通信产品等;
  • 研发软件:比如基础开发环境,各种中间件环境,数据存储查询等;
  • 持续集成:主流的就是Jenkins、Docker、Kubernetes等组件,整体比较复杂,不好管理;
  • 虚拟机环境:研发必备的Linux操作系统,用来部署一些标准的组件集群;

不论是这些软件环境还是虚拟机系统的搭建,基本都是通过下载软件安装包,然后在本地部署和定期更新以及运行,基于这个场景再去理解容器和Pod组件,会轻松许多;

二、容器

1、容器镜像

参考上面系统环境的管理,软件包和安装部署的原理;

Docker容器镜像是一个轻量级的、独立的、可执行的软件包,它包含了运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置,带有创建Docker容器的说明;

可以通过Dockerfile脚本自定义镜像,也可以使用云端仓库中其他人公开发布的,生产环境通常采用私有仓库管理镜像;

2.png

容器镜像所承载的是封装了应用程序及其所有软件依赖的二进制数据,容器镜像是可执行的软件包,可以单独运行;通常会创建应用的容器镜像并将其推送到某仓库,然后在Pod中引用它;

2、容器

容器将应用程序从底层的主机设施中解耦,这使得在不同的云或OS环境中部署更加容易;

容器的本质就是一个视图隔离、可限制资源、独立文件系统的进程集合;

以常见的Linux研发环境来分析,可以限制容器的资源分配,比如内存大小、CPU使用,隔离进程之间的通信,设置独立的文件系统等;

Kubernetes集群中的每个节点都会运行容器,这些容器构成分配给该节点的Pod,单个Pod中的容器会在共同调度下,于同一位置运行在相同的节点上;

从整体上可以把K8S理解为「操作系统」,镜像理解为「软件安装包」,容器理解为「应用进程」;

3、实践案例

制作镜像,首先将代码工程auto-clientauto-serve打包,然后构建镜像文件,放在本地环境中;

  • 制作【auto-client】镜像

构建命令

docker build -t auto-client:latest .

Dockerfile脚本

# 基础镜像
FROM openjdk:8

# 维护者
MAINTAINER cicadasmile

# 持久化目录
VOLUME /data/docker/logs

# 添加应用服务JAR包
ADD auto-client.jar application.jar

# 配置参数
ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]
  • 制作【auto-serve】镜像

构建命令

docker build -t auto-serve:latest .

Dockerfile脚本

# 基础镜像
FROM openjdk:8

# 维护者
MAINTAINER cicadasmile

# 持久化目录
VOLUME /data/docker/logs

# 添加应用服务JAR包
ADD auto-serve.jar application.jar

# 配置参数
ENTRYPOINT ["java","-Dspring.profiles.active=dev","-Djava.security.egd=file:/dev/./urandom","-jar","/application.jar"]

3.png

三、Pod组件

1、基本概念

Pod是可以在K8S中创建和管理的、最小的可部署的计算单元;

Pod是一组(一个或多个)容器,这些容器共享存储、网络、以及怎样运行这些容器的声明,Pod中的内容总是并置的并且一同调度,在共享的上下文中运行;

2、Pod管理

【Pod创建】

通常不会直接创建Pod,而是使用诸如Deployment或Job这类工作负载资源来创建Pod;是相对临时性的、用后即抛的一次性实体;

【单容器Pod】

每个Pod都意在运行给定应用程序的单个实例,可以使用多个Pod对应用程序横向扩展,即一个实例一个Pod对应,Pod看作单个容器的包装器由K8S直接管理,是常见的部署方式;

【多容器Pod】

分布式系统中可能存在由多个紧密耦合且需要共享资源的共处容器组成的应用程序,比较典型的是「生产消费」场景,Pod将这些容器和存储资源打包为一个可管理的实体;

4.png

Pod中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度,容器之间可以共享网络和存储资源和依赖、彼此通信、协调何时以及何种方式终止自身;

容器之间原本是被隔离开的,而Pod在设计上可以突破这种隔离,进而实现资源共享;

  • 存储共享

在Pod层面设置共享的Volume,该Pod中所有容器都可以访问该共享Volume,这也是Pod组件的存储方式,Volume还允许Pod中持久数据保留下来,即使其中的容器需要重新启动;

  • 网络共享

同一个Pod内,所有容器共享一个IP地址和端口空间,并且可以通过localhost发现对方;

3、实践案例

3.1 Pod脚本

在此前的案例中,都是单容器Pod,这里演示多容器Pod,将【auto-client】和【auto-serve】放在同一个「auto-pod」中运行;

并且这里为两个容器分配CPU和内存资源,requests是要为容器指定资源需求,limits是要为容器指定资源限制;

apiVersion: v1
kind: Pod
metadata:
  name: auto-pod
spec:
  containers:
    - name: auto-client
      image: auto-client
      imagePullPolicy: Never
      ports:
        - containerPort: 8079
      resources:
        requests:
          cpu: "250m"
          memory: "64Mi"
        limits:
          cpu: "500m"
          memory: "128Mi"
    - name: auto-serve
      image: auto-serve
      imagePullPolicy: Never
      ports:
        - containerPort: 8082
      resources:
        requests:
          cpu: "250m"
          memory: "64Mi"
        limits:
          cpu: "500m"
          memory: "128Mi"

3.2 Pod命令

  • 创建Pod
kubectl create -f pod.yaml
  • 查看指定Pod
kubectl get pod/auto-pod -o wide
NAME       READY   STATUS    RESTARTS   AGE    IP           NODE             NOMINATED NODE   READINESS GATES
auto-pod   2/2     Running   0          9m2s   10.1.0.123   docker-desktop   <none>           <none>
  • 查看指定Pod描述
kubectl describe pod/auto-pod

# 此处只展示部分信息
Name:         auto-pod
Namespace:    default
Node:         docker-desktop/192.168.65.11
Status:       Running
IP:           10.1.0.123
Containers:
  auto-client:
    Container ID:   docker://Container-ID
    Image:          auto-client
    Image ID:       docker://sha256:Image-ID
    Port:           8079/TCP
    Limits:
      cpu:     500m
      memory:  128Mi
    Requests:
      cpu:        250m
      memory:     64Mi
  auto-serve:
    Container ID:   docker://Container-ID
    Image:          auto-serve
    Image ID:       docker://sha256:Image-ID
    Port:           8082/TCP
    Limits:
      cpu:     500m
      memory:  128Mi
    Requests:
      cpu:        250m
      memory:     64Mi
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  38s   default-scheduler  Successfully assigned default/auto-pod to docker-desktop
  Normal  Pulled     37s   kubelet            Container image "auto-client" already present on machine
  Normal  Created    37s   kubelet            Created container auto-client
  Normal  Started    37s   kubelet            Started container auto-client
  Normal  Pulled     37s   kubelet            Container image "auto-serve" already present on machine
  Normal  Created    37s   kubelet            Created container auto-serve
  Normal  Started    37s   kubelet            Started container auto-serve
  • 删除Pod
kubectl delete -f pod.yaml

3.3 服务日志

在「auto-client」服务中,提供一个简单的定时任务,每10秒访问一次「auto-serve」的接口,打印请求的响应结果;

@Component
public class HttpJob {
   
   

    private static final Logger LOG = LoggerFactory.getLogger(HttpJob.class.getName()) ;

    private static final String SERVER_URL = "http://localhost:8082/serve";

    /**
     * 每10秒执行一次
     */
    @Scheduled(fixedDelay = 10000)
    public void systemDate (){
   
   
        try{
   
   
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setReadTimeout(3000);
            factory.setConnectTimeout(6000);
            RestTemplate restTemplate = new RestTemplate(factory);
            Map<String,String> paramMap = new HashMap<>() ;
            String result = restTemplate.getForObject(SERVER_URL,String.class,paramMap);
            LOG.info("server-resp::::"+result);
        } catch (Exception e){
   
   
            e.printStackTrace();
        }
    }
}

在「auto-serve」服务中,提供一个简单的Get请求接口;

@RestController
public class ServeWeb {
   
   
    private static final Logger logger = LoggerFactory.getLogger(ServeWeb.class) ;

    @Value("${server.port:}")
    private Integer servePort ;

    @GetMapping("/serve")
    public String serve (){
   
   
        logger.info("serve:{}",servePort);
        return "serve:"+servePort ;
    }
}

查看两个容器的运行日志,发现「auto-client」和「auto-serve」可以正常通信,以此来验证同一个Pod内网络共享;

5.png

4、状态与重启

4.1 重启策略

可以在Pod中通过restartPolicy属性设置重启策略,常用的取值是Always以降低应用的中断时间,适用于Pod中的所有容器;

  • Always:默认值,容器失效时,kubelet自动重启该容器。
  • OnFailure:容器停止运行且退出码不为0时,kubelet自动重启该容器。
  • Never:不论容器是什么状态,kubelet都不重启该容器。

4.2 生命周期

  • Pending:Pod被Kubernetes系统接受,但有一个或者多个容器未创建,此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间。
  • Running:Pod已经绑定到了某个节点,Pod中所有的容器都已被创建,至少有一个容器在运行,或者正处于启动或重启状态。
  • Succeeded:Pod中的所有容器都已成功终止,并且不会再重启。
  • Failed:Pod中的所有容器都已终止,并且至少有一个容器是因为失败被终止。
  • Unknown:因为某些原因无法取得Pod的状态,通常是因为与Pod所在主机通信失败。

Pod遵循预定义的生命周期,起始于Pending阶段,如果至少其中有一个主要容器正常启动,则进入Running阶段,之后取决于Pod中是否有容器以失败状态结束而进入Succeeded或者Failed阶段。

四、参考源码

文档仓库:
https://gitee.com/cicadasmile/butte-java-note

脚本仓库:
https://gitee.com/cicadasmile/butte-auto-parent
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
Web App开发 前端开发 JavaScript
前端新利器:CSS容器查询——让组件真正“自适应
前端新利器:CSS容器查询——让组件真正“自适应
561 83
|
9月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
985 3
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
1361 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
Kubernetes 调度 异构计算
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
生产环境 K8S + Deepseek 实现大模型部署 和 容器调度(图解+史上最全)
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
599 25
|
数据采集 消息中间件 Kubernetes
容器化爬虫部署:基于K8s的任务调度与自动扩缩容设计
随着业务复杂度提升,传统定时任务和手工扩缩容难以满足高并发与实时性需求。本文对比两种基于 Kubernetes 的爬虫调度与扩缩容方案:CronJob+HPA 和 KEDA。从调度灵活性、扩缩容粒度、实现难度等维度分析,并提供 YAML+Python 示例。方案 A(CronJob+HPA)适合固定定时任务,配置简单;方案 B(KEDA)支持事件驱动,适合高并发与异步触发场景。根据实际需求可混合使用,优化资源利用与效率。
515 4
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
558 12
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
459 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
10月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1335 108

热门文章

最新文章

推荐镜像

更多