「译」在 Kubernetes 1.16 上启用和使用 Ephemeral(临时)容器

简介: 「译」在 Kubernetes 1.16 上启用和使用 Ephemeral(临时)容器

👉️URL: https://www.shogan.co.uk/kubernetes/enabling-and-using-ephemeral-containers-on-kubernetes-1-16/

📝Description:

这篇文章展示了如何在 Kubernetes 1.16 上使用 Ephemeral 容器,方法是启用功能标志,然后修改 pod 以添加一个诊断容器。

Ephemeral 容器是 Kubernetes 1.16 中的一个早期 alpha 功能,当涉及到我们可以在日常 Kubernetes 操作中使用的工具时,它提供了一些有趣的新动态。

在我们看 Ephemeral 容器之前,让我们先看看 Kubernetes 世界中的 Pod 是什么。

请记住,Kubernetes 中的 Pod 是由一个或多个容器(如 Docker 容器)组成的。

有了这个基本的信息,我们来看看 Pod 及其容器在过去一直具有的一些特征。

  • 它们的目的是一次性的,并且很容易以可控的方式用部署来替换。
  • 你不能在运行时向 pods 添加容器。
  • Pods 中的容器可以为网络访问分配端口,并使用诸如 liveness probes 的东西。
  • 对 pod 中的容器进行故障排除通常意味着查看日志或使用 kubectl exec 来进入运行中的容器并进行探测。当然,如果你的容器已经崩溃了,后者是没有用的。

因此,在这里我看到了新的 Ephemeral Containers 功能的最佳使用案例之一–故障排除。

Ephemeral Containers 可以在运行时被插入到一个正在运行的 pod 中。

这意味着它们非常适合于对你的应用程序进行实时故障排除。有多少次,你希望你的基本 docker 镜像,你已经构建了你的应用程序镜像的基础上有 curl,dig,甚至在某些情况下 ping…

如果我们一直遵循最佳实践,我们就会使我们的 docker 镜像尽可能的 slim ,并尽可能的去除攻击区域。这通常意味着所有有用的诊断工具都不见了。

Ephemeral Containers 是伟大的。我们现在可以将诊断 Docker 镜像与我们需要的所有工具放在一起,并在需要的时候将诊断容器插入正在运行的 pod 中以进行故障排除。

当 Ephemeral Container 运行时,它在目标 pod 的命名空间内执行。因此,你将能够访问,例如,文件系统和其他资源,这些容器在 pod 中拥有。

演示

为了跟上这个演示,你需要 Kubernetes 1.16 或更高版本,并且你需要使用两个与 pod 相关的功能。

  • EphemeralContainers(当然)–在 1.16 中默认禁用,因为它是 alpha。
  • PodShareProcessNamespace - 用于共享一个 pod 中的进程命名空间(在 1.16 中默认启用,因为它是一个测试版功能)。

要启用 Ephemeral Containers 功能,请在你的 Kubernetes 主节点上编辑以下配置文件,并重新启动每个主节点。

在以下地方启用 EphemeralContainers alpha feature gate

  • /etc/kubernetes/manifests/kube-apiserver.yaml
  • /etc/kubernetes/manifests/kube-scheduler.yaml

通过在 命令 部分添加以下一行。

--feature-gates=EphemeralContainers=true
INI

创建一个新的 pod(我使用的是 Rabbit MQ,专门针对 ARM 架构,因为我在这里使用的是 Raspberry Pi 集群),但是用你喜欢的任何东西替换这个镜像,因为它只是用于测试。

保存为 pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rabbit
  labels:
    role: myrole
spec:
  shareProcessNamespace: true
  containers:
    - name: rabbitmq
      image: arm32v7/rabbitmq
      ports:
        - name: rabbit
          containerPort: 5672
          protocol: TCP
YAML

创建:kubectl apply -f ./pod.yaml

接下来,创建一个 EphemeralContainer 资源,将其保存为 **ephemeral-diagnostic-container.json**。

(注意,我使用的是我创建的 Docker 镜像,shoganator/rpi-alpine-tools,添加了一堆诊断工具,而且这个镜像只针对 ARM 架构)。用你喜欢的其他东西来替换这个文件中的镜像,例如 busybox。

{
    "apiVersion": "v1",
    "kind": "EphemeralContainers",
    "metadata": {
            "name": "rabbit"
    },
    "ephemeralContainers": [{
        "command": [
            "bash"
        ],
        "image": "shoganator/rpi-alpine-tools",
        "imagePullPolicy": "Always",
        "name": "diagtools",
        "stdin": true,
        "tty": true,
        "terminationMessagePolicy": "File"
    }]
}
JSON

apply 到已存在的 pod 上:

kubectl -n default replace --raw /api/v1/namespaces/default/pods/rabbit/ephemeralcontainers -f ./ephemeral-diagnostic-container.json
BASH

Describe rabbit pod : kubectl describe pod rabbit

Ephemeral Containers:
   diagtools:
     Container ID:  docker://eb55c71f102ce3d56221934f6ebcabfd2da76204df718bd8d2573da24aecc8e9
     Image:         shoganator/rpi-alpine-tools
     Image ID:      docker-pullable://shoganator/rpi-alpine-tools@sha256:bb00f943d511c29cc2367183630940e797f5e9552683b672613bf4cb602a1c4c
     Port:          
     Host Port:     
     Command:
       bash
     State:          Running
       Started:      Sat, 16 Nov 2019 14:49:58 +0000
     Ready:          False
     Restart Count:  0
     Environment:    
     Mounts:         
 Conditions:
   Type              Status
   Initialized       True
   Ready             True
   ContainersReady   True
   PodScheduled      True
YAML

你现在可以看到,Ephemeral Containers 部分被填充了新运行的 Ephemeral Container,我们将其添加到 RabbitMQ 的 pod 中。

下一步是实际使用这个容器在 pod 内做一些诊断 / 探测。attach 到 pod 内的 diagtools ephemeral 容器。

kubectl attach -it rabbit -c diagtools
BASH

现在你可以列出进程,ping 网络中的项目,或者从这个 pod 的上下文中测试你集群中的另一个网络服务。例如

ps auxww
ping 192.168.192.13
curl http://hello-node1:8081
htop
NGINX

请记住,对于 Ephemeral Containers。

  • 不能有端口,所以诸如 portslivenessProbereadinessProbe 等字段不能被使用。
  • 不允许设置资源,因为 pod 资源是不可改变的。
    如果一个 pod 被删除 / 重新调度,它们将消失。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
356 185
|
3月前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
1天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
3天前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
8天前
|
弹性计算 人工智能 资源调度
DeepSeek大解读系列公开课上新!阿里云专家主讲云上智能算力、Kubernetes容器服务、DeepSeek私有化部署
智猩猩「DeepSeek大解读」系列公开课第三期即将开讲,聚焦阿里云弹性计算助力大模型训练与部署。三位专家将分别讲解智能算力支撑、Kubernetes容器服务在AI场景的应用实践、以及DeepSeek一键部署和多渠道应用集成,分享云计算如何赋能大模型发展。欲观看直播,可关注【智猩猩GenAI视频号】预约。 (239字符)
|
2月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
1天前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
2月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
3月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
195 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
254 11