「译」在 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 被删除 / 重新调度,它们将消失。
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
缓存 Kubernetes Docker
容器服务ACK常见问题之容器服务ACK ingress websocket配置失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 运维 Kubernetes
容器服务ACK常见问题之容器服务ACK 淘宝源过期了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
23天前
|
Kubernetes 容器
k8s容器时间与服务器时间不一致问题
k8s容器时间与服务器时间不一致问题
18 0
|
12天前
|
JSON Kubernetes Go
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
22 0
无缝集成:在IntelliJ IDEA中利用Kubernetes插件轻松管理容器化应用
|
26天前
|
Kubernetes API 调度
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
49 0
|
1月前
|
Kubernetes SDN 微服务
微服务与 Kubernetes 容器云的边界
【2月更文挑战第30天】该文探讨了微服务与Kubernetes集群的关系,主要关注是否应跨多集群部署。理想的状况是每个微服务对应一个Kubernetes集群,配置和注册中心在同一集群内,以减少网络延迟。
|
1月前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK启动时readiness告警如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 监控 Kubernetes
容器服务ACK常见问题之cmonitor-agent容器一直没起来如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
存储 Kubernetes 监控
容器服务ACK常见问题之容器服务ACK worker节点选择不同地域失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
弹性计算 运维 Kubernetes
容器服务ACK常见问题之线上的K8s一直waiting如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。

推荐镜像

更多