【Kubernetes系列】Container(容器)

2023-11-07

Container

每个运行的容器都是可重复的; 包含依赖环境在内的标准,意味着无论你在哪里运行它都会得到相同的行为。

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

Container Image(容器镜像)

容器镜像是一个随时可以运行的软件包, 包含运行应用程序所需的一切:代码和它需要的所有运行时、应用程序和系统库,以及一些基本设置的默认值。

根据设计,容器是不可变的:你不能更改已经运行的容器的代码。 如果有一个容器化的应用程序需要修改,则需要构建包含更改的新镜像,然后再基于新构建的镜像重新运行容器。

容器镜像(Image)所承载的是封装了应用程序及其所有软件依赖的二进制数据。 容器镜像是可执行的软件包,可以单独运行;该软件包对所处的运行时环境具有良定(Well Defined)的假定。

你通常会创建应用的容器镜像并将其推送到某仓库(Registry),然后在 Pod 中引用它。

镜像名称

容器镜像通常会被赋予 pauseexample/mycontainer 或者 kube-apiserver 这类的名称。 镜像名称也可以包含所在仓库的主机名。例如:fictional.registry.example/imagename。 还可以包含仓库的端口号,例如:fictional.registry.example:10443/imagename

如果你不指定仓库的主机名,Kubernetes 认为你在使用 Docker 公共仓库。

在镜像名称之后,你可以添加一个标签(Tag)(与使用 dockerpodman 等命令时的方式相同)。 使用标签能让你辨识同一镜像序列中的不同版本。

镜像标签可以包含小写字母、大写字母、数字、下划线(_)、句点(.)和连字符(-)。 关于在镜像标签中何处可以使用分隔字符(_-.)还有一些额外的规则。 如果你不指定标签,Kubernetes 认为你想使用标签 latest

更新镜像

当你最初创建一个 DeploymentStatefulSet、Pod 或者其他包含 Pod 模板的对象时,如果没有显式设定的话, Pod 中所有容器的默认镜像拉取策略是 IfNotPresent。这一策略会使得 kubelet 在镜像已经存在的情况下直接略过拉取镜像的操作。

镜像拉取策略

容器的 imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取(下载)指定的镜像。

以下列表包含了 imagePullPolicy 可以设置的值,以及这些值的效果:

  • IfNotPresent只有当镜像在本地不存在时才会拉取。
  • Always每当 kubelet 启动一个容器时,kubelet 会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet 就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器。
  • NeverKubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。 更多细节见提前拉取镜像。

只要能够可靠地访问镜像仓库,底层镜像提供者的缓存语义甚至可以使 imagePullPolicy: Always 高效。 你的容器运行时可以注意到节点上已经存在的镜像层,这样就不需要再次下载。

注意:在生产环境中部署容器时,你应该避免使用 :latest 标签,因为这使得正在运行的镜像的版本难以追踪,并且难以正确地回滚。
相反,应指定一个有意义的标签,如 v1.42.0

为了确保 Pod 总是使用相同版本的容器镜像,你可以指定镜像的摘要; 将 <image-name>:<tag> 替换为 <image-name>@<digest>,例如 image@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

当使用镜像标签时,如果镜像仓库修改了代码所对应的镜像标签,可能会出现新旧代码混杂在 Pod 中运行的情况。 镜像摘要唯一标识了镜像的特定版本,因此 Kubernetes 每次启动具有指定镜像名称和摘要的容器时,都会运行相同的代码。 通过摘要指定镜像可固定你运行的代码,这样镜像仓库的变化就不会导致版本的混杂。

默认镜像拉取策略

当你(或控制器)向 API 服务器提交一个新的 Pod 时,你的集群会在满足特定条件时设置 imagePullPolicy 字段:

  • 如果你省略了 imagePullPolicy 字段,并且容器镜像的标签是 :latestimagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且没有指定容器镜像的标签, imagePullPolicy 会自动设置为 Always
  • 如果你省略了 imagePullPolicy 字段,并且为容器镜像指定了非 :latest 的标签, imagePullPolicy 就会自动设置为 IfNotPresent

说明:

容器的 imagePullPolicy 的值总是在对象初次 创建 时设置的,如果后来镜像的标签发生变化,则不会更新。

例如,如果你用一个 :latest 的镜像标签创建一个 Deployment, 并在随后更新该 Deployment 的镜像标签为 :latest,则 imagePullPolicy 字段 不会 变成 Always。 你必须手动更改已经创建的资源的拉取策略。

强制拉去镜像

如果你想总是强制执行拉取,你可以使用下述的一中方式:

  • 设置容器的 imagePullPolicyAlways
  • 省略 imagePullPolicy,并使用 :latest 作为镜像标签; 当你提交 Pod 时,Kubernetes 会将策略设置为 Always
  • 省略 imagePullPolicy 和镜像的标签; 当你提交 Pod 时,Kubernetes 会将策略设置为 Always
  • 启用准入控制器 AlwaysPullImages。

ImagePullBackOff

当 kubelet 使用容器运行时创建 Pod 时,容器可能因为 ImagePullBackOff 导致状态为Waiting。

ImagePullBackOff 状态意味着容器无法启动, 因为 Kubernetes 无法拉取容器镜像(原因包括无效的镜像名称,或从私有仓库拉取而没有 imagePullSecret)。 BackOff 部分表示 Kubernetes 将继续尝试拉取镜像,并增加回退延迟。

Kubernetes 会增加每次尝试之间的延迟,直到达到编译限制,即 300 秒(5 分钟)。

使用私有仓库

从私有仓库读取镜像时可能需要密钥。 凭证可以用以下方式提供:

  • 配置节点向私有仓库进行身份验证
    • 所有 Pod 均可读取任何已配置的私有仓库
    • 需要集群管理员配置节点
  • 预拉镜像
    • 所有 Pod 都可以使用节点上缓存的所有镜像
    • 需要所有节点的 root 访问权限才能进行设置
  • 在 Pod 中设置 ImagePullSecrets
    • 只有提供自己密钥的 Pod 才能访问私有仓库
  • 特定于厂商的扩展或者本地扩展
    • 如果你在使用定制的节点配置,你(或者云平台提供商)可以实现让节点向容器仓库认证的机制

容器环境

容器运行环境是负责运行容器的软件。

Kubernetes 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现。

Kubernetes 的容器环境给容器提供了几个重要的资源:

  • 文件系统,其中包含一个镜像和一个或多个的
  • 容器自身的信息
  • 集群中其他对象的信息

容器信息

一个容器的 hostname 是该容器运行所在的 Pod 的名称。通过 hostname 命令或者调用 libc 中的 gethostname 函数可以获取该名称。

Pod 名称和命名空间可以通过 下行 API 转换为环境变量。

Pod 定义中的用户所定义的环境变量也可在容器中使用,就像在 container 镜像中静态指定的任何环境变量一样。

集群信息

创建容器时正在运行的所有服务都可用作该容器的环境变量。 这里的服务仅限于新容器的 Pod 所在的名字空间中的服务,以及 Kubernetes 控制面的服务。

对于名为 foo 的服务,当映射到名为 bar 的容器时,定义了以下变量:

FOO_SERVICE_HOST=<其上服务正运行的主机> FOO_SERVICE_PORT=<其上服务正运行的端口>

服务具有专用的 IP 地址。如果启用了 DNS 插件, 可以在容器中通过 DNS 来访问服务。

Runtime Class(容器运行时类)

RuntimeClass 是一个用于选择容器运行时配置的特性,容器运行时配置用于运行 Pod 中的容器。

可以在不同的 Pod 设置不同的 RuntimeClass,以提供性能与安全性之间的平衡。 例如,如果你的部分工作负载需要高级别的信息安全保证,你可以决定在调度这些 Pod 时尽量使它们在使用硬件虚拟化的容器运行时中运行。 这样,你将从这些不同运行时所提供的额外隔离中获益,代价是一些额外的开销。

还可以使用 RuntimeClass 运行具有相同容器运行时但具有不同设置的 Pod。

设置

  1. 在节点上配置 CRI 的实现(取决于所选用的运行时)

    RuntimeClass 的配置依赖于 运行时接口(CRI)的实现。所有这些配置都具有相应的 handler 名,并被 RuntimeClass 引用。 handler 必须是有效的 DNS 标签名。

  2. 创建相应的 RuntimeClass 资源

    每个配置都需要有一个用于标识配置的 handler。 针对每个 handler 需要创建一个 RuntimeClass 对象。RuntimeClass 资源当前只有两个重要的字段:RuntimeClass 名 (metadata.name) 和 handler (handler)。对象定义如下所示:

    # RuntimeClass 定义于 node.k8s.io API 组
    apiVersion: node.k8s.io/v1
    kind: RuntimeClass
    metadata:
      # 用来引用 RuntimeClass 的名字
      # RuntimeClass 是一个集群层面的资源
      name: myclass
    # 对应的 CRI 配置的名称
    handler: myconfiguration
    

    RuntimeClass 对象的名称必须是有效的 DNS 子域名。

更多关于CRI请看官网


使用说明

一旦完成集群中 RuntimeClasses 的配置, 你可以在 Pod spec 中指定 runtimeClassName 来使用它。例如:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  runtimeClassName: myclass
  # ...

这一设置会告诉 kubelet 使用所指的 RuntimeClass 来运行该 pod。 如果所指的 RuntimeClass 不存在或者 CRI 无法运行相应的 handler, 那么 pod 将会进入 Failed 终止阶段。 你可以查看相应的事件, 获取执行过程中的错误信息。

如果未指定 runtimeClassName,则将使用默认的 RuntimeHandler,相当于禁用 RuntimeClass 功能特性。


本文作者:Java技术债务
原文链接:https://cuizb.top/myblog/article/1663816976
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 3.0 CN协议进行许可。转载请署名作者且注明文章出处。


--------------------------------------------------希望大家点赞,收藏,关注下方公众号。。。--------------------------------------------------


另外我在支付宝发送了一个口令红包,关注公众号,找到

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Kubernetes系列】Container(容器) 的相关文章

  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • kubernetes,提示符在端口转发命令处冻结

    我想在在线指南之后设置从本地端口 节点 到 pod redis master 的端口转发库伯内特斯 https kubernetes io docs tasks access application cluster port forward
  • 无法使用 Docker 运行 Strapi

    我正在尝试 Docker 化我的Strapi应用程序 所以首先在项目的根目录中我创建了一个 env文件包含以下内容 HOST 0 0 0 0 PORT 3002 然后 里面backend config server js I have mo
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack

随机推荐

  • 【解决新手爬虫 python3】UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘‘ in position

    解决新手爬虫遇到的UnicodeEncodeError gbk codec can t encode character xa0 in position 7084 illegal multibyte sequence 起初的代码 from
  • Qt程序图标

    网络上有很多这方面的介绍 这里只是MARK一下 程序图标说明 准备 1 图标文件 ICO图标文件 也许需要BMP PNG转ICO工具 2 资源文件 RC文件 可手动创建一个空的RC文件 注 这两个文件应与工程文件 PRO 放在同一路径下 步
  • 编写一个函数计算传入字符串中数字、字母、空格以及其它字符的个数

    编写一个函数计算传入字符串中数字 字母 空格以及其它字符的个数 def num str1 a b c d 0 for i in str1 if i isdigit a 1 elif i isalpha b 1 elif i isspace
  • 记录一次生产环境Net Core应用内存暴涨导致OOM的排查过程

    事情起源于某个周五 刚开始是突然发现生产服务不能访问 请求时居然直接提示服务器拒绝响应 然后连用于管理生产环境的Portainer虽然能打开 但登录右上角直接出红色告警信息无法接收服务器信息 进去后所有的node都不显示 生产环境跑了二年多
  • XCTF黑客精神解题报告

    题目来源 https adworld xctf org cn 解题环境 kali frida 12 8 0 Win10 IDA PRO 7 0 整体思路 静态分析 dex 应用的核心思路为com gdufs xman MyAPP类中最先执行
  • 为什么 bindService 能和 Activity 的生命周期联动?

    前言 之前做一道面试题 startService 和 bindService 有什么不同 为什么 bindService 能和 Activity 的生命周期联动 前一个问题可以很快回答出来 生命周期不同 结束方式不同 交互方式不同 后一个问
  • java实现批量更新数据_java批量更新数据库

    String queries INSERT INTO Employee Eno Ename Ecode EDept values 1 Allen abc Sales INSERT INTO Employee Eno Ename Ecode
  • 在零配置的情况下,怎么启动、打包一个.vue文件?

    问题 比如我们在开发一个组件 以及做一些小demo的时候 怎么快速启动服务 解决 1 安装拓展 npm install g vue cli service global 复制代码 2 新建vue文件 建立一个vue test文件夹 在里面新
  • npm、yarn 与 pnpm 的逻辑区别

    目录 npm2的依赖管理 npm3 yarn的依赖管理 pnpm的依赖管理 npm2的依赖管理 npm2 安装依赖的时候比较简单直接 直接按照包依赖的树形结构下载填充本地目录结构 比如在项目中A和 C 都依赖 B 无论被依赖的 B 是否是同
  • Dapper入门

    Dapper 一 dapper是什么 dapper是一款轻量级的ORM Object Relationship Mapper 它负责 数据库和编程语言之间的映射 SqlConnection MysqlConnection OracleCon
  • Jmeter之Android脚本录制

    在进行测试的时候 可能有好多脚本或者界面需要操作测试 并且有些测试链接需要重复多线程高并发进行测试 我们一般会针对这一些操作 进行一个脚本录制 录制好之后 之后测试就可以在这个基础上进行测试 使用Jmeter自带的代理服务器进行脚本录制 注
  • 阿里云服务器linux选centos哪个版本好?

    如果要我推荐一般就推荐首选阿里云centos 8 2 64位或者是最新版本的centos系统 当天centos 7 9也可以的 其实具体哪个版本真的没啥区别的 一般用户不和系统打交道的话 完全是感受不到什么差异的 不过关于阿里云ecs服务器
  • Unity动画系统常用知识总结

    Unity动画系统常用知识总结 资源导入需要注意的地方 常用的组件 Animator 组件 Avatar Mask 骨骼遮罩 Animator Controller 动画切换 Any State Has Exit Time 是否有退出时间
  • windows11 - 快速实现局域网内传文件

    一条命令就可以实现局域网内共享传输文件 windows 简单共享目录 打开cmd 先cd进一个要共享的目录 这个步骤可以简化一步到达 参考这个链接 然后执行 python m http server 8010 其他设备 手机或者电脑 用浏览
  • dcmtk源码编译 (windows和 linux)

    说一下我们的项目是Java的dicom影像 但是有些医院的胶片打印机用的国产化的 dcm4che的通信模块不能使用 需要用 dcmtk的 dcmpsprt exe 和 dcmprscu exe的命令行服务 下面跟着我一起开始编译 1 dcm
  • 阿里云ECS服务器 2核4G/2核8G/4核8g配置的区别及如何选择【 可供新手小白参考】

    简介 阿里云服务器2核4G 2核8G 4核8g是企业级服务器中的热门选择 而且阿里云官方也一直在力推这三款配置作为企业级应用的首选 在阿里云的各种活动页面都能够看到这三款配置 基于这几款配置在活动中能见到的机型是计算型sn1ne实例 计算型
  • Linux下虚拟机终端背景颜色更改

    下载安装完虚拟机 发现背景颜色是白色的 总结了更改背景颜色的方法 基于CentOS 7演示 方法 1 进入终端2 选择 编辑 gt 首选项 3 更改主题类型 亮色 白底 暗色 黑底 4 若更改其他更多颜色 进入终端 选择 编辑 gt 配置文
  • 耕地单目标语义分割实践——Pytorch网络过程实现理解

    一 卷积操作 一 普通卷积 Convolution 二 空洞卷积 Atrous Convolution 根据空洞卷积的定义 显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图 具有构建特征金字塔的基础 三 深度可分离卷积 Dept
  • Qt 读取多行文本框中的内容

    本文介绍将plainTextEdit中的多行文本内容按行读取为字符串的方法 QTextDocument doc ui gt plainTextEdit gt document 将plainTextEdit中的内容读取到doc中 int co
  • 【Kubernetes系列】Container(容器)

    文章目录 Container Container Image 容器镜像 镜像名称 更新镜像 镜像拉取策略 默认镜像拉取策略 强制拉去镜像 ImagePullBackOff 使用私有仓库 容器环境 容器信息 集群信息 Runtime Clas
Powered by Hwhale