Pod是Kubernetes系统的基础单元,是资源对象模型中可由用户创建或部署的最小组件,也是在Kubernetes系统上运行容器化应用的资源对象。其他的大多数资源对象都是用于支撑和扩展Pod对象功能的,比如同于管控的Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。这些资源对象大体可分为有限的几个类别,并且可基于资源清单作为资源配置文件进行陈述式或声明式管理。

管理Pod对象的容器

一个Pod对象中至少要存在一个容器,所以containers字段是定义Pod时其嵌套字段Spec中的必选项,用于为Pod指定要创建的容器列表。进行容器配置时,name为必选字段,用于指定容器名称,image字段是可选字段,以方便更高级别的管理类资源(如Deployment)等能覆盖此字段,于是自主式的Pod并不可省略此字段。因此,定义一个容器的基础框架如下:

name:CONTAINER_NAME
image: IMAGE_FILE_NAME

  

此外定义容器时还有一些其他常用的自字段,比如定义要暴露的端口、改变镜像运行的默认程序、传递环境变量、定义可用的系统资源配额等。

镜像及其获取策略

各工作节点负责运行Pod对象,而Pod的核心功用在于运行容器,因此工作节点上必须配置容器运行引擎,如Docker等。启动容器时,容器引擎将首先于本地查找指定的镜像文件,不存在的镜像则需要从指定的镜像仓库(Registry)下载至本地。

Kubernetes系统支持用户自定义镜像文件的获取策略,比如在网络资源较为紧张时可以禁止从仓库中获取镜像文件等。容器的“imagePullPolicy”字段用于为其指定镜像获取策略,它的可用值包括如下几个:

  • Always:镜像标签为“latest”或镜像不存在时总是从指定的仓库中获取镜像。
  • IfNotPresent:仅当本地镜像缺失时方才从目标仓库下载镜像。
  • Never:禁止从仓库下载镜像,即仅使用本地镜像。

下面资源清单中的容器定义了如何使用nginx: latest镜像,其获取策略为Always,这意味着每次启动容器时它都会到镜像仓库中获取最新版本的镜像文件:

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy:Always

  

对于标签为“latest”的镜像文件,其默认的镜像获取策略即为“Always”,而对于其他标签的镜像,其默认策略则为“IfNotPresent”。需要注意的是使用私有仓库中的镜像时通常需要由Registry服务器完成认证后才能进行。认证过程要么需要在相关节点上交互式执行docker login命令来进行要么就是将认证信息定义为专有的Secret资源,并配置Pod通过“imagePullSecretes”字段调用此认证信息完成。

暴露端口

Docker的网络模型中,使用默认网络的容器化应用需通过NAT机制将其“暴露”(expose)到外部网络中才能被其他节点之上的容器客户端所访问。然而Kubernetes系统的网络模型中,各Pod的Ip地址处于同一网络平面,无论是为容器指定了要暴露的端口,都不会影响集群中其他节点之上的Pod客户端对其进行访问,这就意味着任何监听在非lo接口上的端口都可以通过Pod网络直接被请求。从这个角度来说,容器端口只是信息性数据,它只是为集群用户提供了一个快速了解相关Pod对象的可访问端口的途径呢,而且显示指定容器端口还能为其赋予一个名称以方便调用。

容器的ports字段的值是一个列表,由一个到多个端口对象组成,它的常用嵌套字段包括:

  • containerPort :必选字段,指定在Pod对象的IP地址上暴露的容器端口,有效范围为(0,65536);使用时应该总是指定容器应用正常监听着的端口。
  • name :当前端口的名称,必须符合IANA_SVC_NAME规范且在当前Pod内必须是唯一的;此端口名可被Service资源调用。
  • protocol:端口相关的协议,其值仅可为TCP或UDP,默认为TCP。
提示:可以通过“kubectl example pods.spec.containers.ports”获取ports对象可用的字段列表。

下面的资源配置清单实例(pod-example-with-port.yaml)中定义的pod-example指定了要暴露容器上TCP的80端口,并将之命名为http:

apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name:
containerPort: 80
portocol: TCP

  

然而Pod对象的IP地址仅在当前集群内可达,它们无法直接接收来自集群外部客户端的请求流量,尽管它们的服务可达性不受工作节点边界的约束,但依然受制于集群边界。一个简单的解决方案是通过其所在的工作节点的IP地址和端口将其暴露到集群外部。

  • hostPort :主机端口,它将接收到的请求通过NAT机制转发至由containerPort字段指定的容器端口。
  • hostIP :主机端口要绑定的主机IP,默认为0.0.0.0,即主机之上所有可用的IP地址;考虑到托管的Pod对象是由调度器调度运行的,工作节点的IP地址难以明确指定~因此此字段通常使用默认值。

需要注意的是,hostPort与NodePort类型的Service对象暴露端口的方式不同,NodePort是通过所有节点暴露容器服务,而hostPort则经由Pod对象所在节点的IP地址来进行。

 

Kubernetes--管理Pod对象的容器(1)的更多相关文章

  1. k8s管理pod资源对象(上)

    一.容器于pod资源对象 现代的容器技术被设计用来运行单个进程时,该进程在容器中pid名称空间中的进程号为1,可直接接收并处理信号,于是,在此进程终止时,容器即终止退出.若要在一个容器中运行多个进程, ...

  2. Kubernetes之Pod使用

    一.什么是Podkubernetes中的一切都可以理解为是一种资源对象,pod,rc,service,都可以理解是 一种资源对象.pod的组成示意图如下,由一个叫”pause“的根容器,加上一个或多个 ...

  3. kubernetes concepts -- Pod Overview

    This page provides an overview of Pod, the smallest deployable object in the Kubernetes object model ...

  4. 2-1.了解Pod对象

    1.Pod参数定义 # 必填,版本号 apiVersion: string kind: Pod # 必填,元数据 metadata: # 必填,Pod对象的名称(命名规范需要符合RFC 1035规范) ...

  5. (转)Kubernetes 配置Pod和容器(十七) 使用Secrets管理安全证书

    转:https://www.jianshu.com/p/530b3642c642 本章节展示了如何把密码秘钥等敏感数据安全的注入到Pod里面. 转换安全数据成base-64表示 假设你有两个秘密数据: ...

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

    作为 Kubernetes 项目里最核心的编排对象,Pod 携带的信息非常丰富.其中,资源定义(比如 CPU.内存等),以及调度相关的字段.在本篇,我们就先从一种特殊的 Volume 开始,来帮助你更 ...

  7. Docker Kubernetes 创建管理 Pod

    Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  8. [转帖] Kubernetes如何使用ReplicationController、Replica Set、Deployment管理Pod ----文章很好 但是还没具体操作实践 也还没记住.

    Kubernetes如何使用ReplicationController.Replica Set.Deployment管理Pod https://blog.csdn.net/yjk13703623757 ...

  9. Kubernetes基石-pod容器

    引用三个问题来叙述Kubernetes的pod容器 1.为什么不直接在一个Docker容器中运行所有的应用进程. 2.为什么pod这种容器中要同时运行多个Docker容器(可以只有一个) 3.为什么k ...

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

    在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...

随机推荐

  1. HCIP-ICT实战进阶05-路由策略与策略路由

    HCIP-ICT实战进阶05-路由策略与策略路由 0 前言 什么是路由策略? 基于报文的目的IP地址进行路由表查找, 之后转发数据; 针对控制平面, 为路由协议和路由表服务, 针对路由信息进行过滤或者 ...

  2. 硬件路灯第一期CPU篇

    CPU,central processing unit,也就是中央处理器,如果计算机是一个人的话,CPU就是他的大脑我们近下来会科普CPU的几大参数 1.主频假设CPU是建筑工地的话,主频相当于工人们 ...

  3. 使用Wireshark完成实验3-IP

    1.使用Wireshark打开ip-ethereal-trace-1,如图 电脑IP地址为192.168.1.102 2.如图,IP包头中上层协议字段的值为1,代表为ICMP 3.如图,IP头中有20 ...

  4. (原创)Onlyoffice docs docker实例安装示例后,打开文档提示:文档下载失败

    不能使用localhost.请用本机ip访问

  5. HashMap问题

    package com.google; import javax.lang.model.element.NestingKind; import java.util.HashMap; public cl ...

  6. 解决Maven资源导出失败问题

    由于 maven 的约定大于配置,maven 约定资源或配置文件放在 resources 目录下才能正常导出,但是如果我们将其放在 java 目录下,就需要在 pom.xml 添加如下配置,才能导出资 ...

  7. webpack5用url-loader(file-loader)处理图片和img-loader压缩图片

    webpack-cli 4.0的版本和 webpack-dev-server 3.11.0的版本不兼容,只能用webpack@5.0 + webpack-cli@3.3.12 + webpack-de ...

  8. vue3文档学习

    1.vue的核心功能 1.声明式渲染2.响应性: vue会自动跟踪JavaScript状态并在其发生变化时响应式的更新DOM. 2.渐进式框架 根据不同的需求场景,可以用不同的方式使用vue: 1.无 ...

  9. 并发多线程学习(五)Java线程的状态及主要转化方法

    1 操作系统中的线程状态转换 首先我们来看看操作系统中的线程状态转换. 在现在的操作系统中,线程是被视为轻量级进程的,所以操作系统线程的状态其实和操作系统进程的状态是一致的. 操作系统线程主要有以下三 ...

  10. 高CPU Java应用分析

    模拟CPU 40%左右 import java.util.concurrent.CountDownLatch; public class Main extends Thread { private C ...