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

本文最后更新于:2023年5月6日 上午

👉️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

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

1
--feature-gates=EphemeralContainers=true

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

保存为 pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"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"
}]
}

apply 到已存在的 pod 上:

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

Describe rabbit pod : kubectl describe pod rabbit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

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

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

1
kubectl attach -it rabbit -c diagtools

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

1
2
3
4
ps auxww
ping 192.168.192.13
curl http://hello-node1:8081
htop

请记住,对于 Ephemeral Containers。

  • 不能有端口,所以诸如 portslivenessProbereadinessProbe 等字段不能被使用。
  • 不允许设置资源,因为 pod 资源是不可改变的。
    如果一个 pod 被删除 / 重新调度,它们将消失。

「译」在 Kubernetes 1.16 上启用和使用 Ephemeral(临时)容器
https://ewhisper.cn/posts/16311/
作者
东风微鸣
发布于
2022年4月18日
许可协议