Kubernetes 库伯内特斯的短暂容器

Kubernetes 库伯内特斯的短暂容器,kubernetes,sidecar,Kubernetes,Sidecar,我创建了一个标准的nginx pod,我想运行一个sidecar容器,但在Kubernetes 1.18-1.20中它对我不起作用 # kubectl alpha debug nginx --image=busybox --target=nginx Defaulting debug container name to debugger-6wlb5. # kubectl attach nginx -c debugger-6wlb5 If you don't see a command promp

我创建了一个标准的nginx pod,我想运行一个sidecar容器,但在Kubernetes 1.18-1.20中它对我不起作用

# kubectl alpha debug nginx --image=busybox --target=nginx
Defaulting debug container name to debugger-6wlb5.

# kubectl attach nginx -c debugger-6wlb5
If you don't see a command prompt, try pressing enter.
error: unable to upgrade connection: container debugger-6wlb5 not found in pod nginx_default 
我在apiserver、调度器和控制器管理器中启用了门功能。pod上的描述未显示错误或其他内容:

Mounts:
    /var/run/secrets/kubernetes.io/serviceaccount from default-token-4jhz2 (ro)
Ephemeral Containers:
  debugger-6wlb5:
    Image:        busybox
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
Conditions:
  Type              Status
挂载:
/来自default-token-4jhz2(ro)的var/run/secrets/kubernetes.io/serviceCount
临时容器:
调试器-6wlb5:
图片:busybox
端口:
主机端口:
环境:
挂载:
条件:
类型状态
我在这里错过了什么?

背景 不幸的是,这仍然是alfa功能,不适合生产。如文件所述

本页概述了临时容器:一种特殊类型的容器,在现有Pod中临时运行,以完成用户启动的操作,如故障排除。您使用临时容器来检查服务,而不是构建应用程序

警告:临时容器处于早期α状态,不适合生产集群

测验 我已经用Kubernetes 1.19在Kubeadm上测试了这一点。在配置文件中设置了标志,如
apiserver
scheduler
controller manager
-
--feature gates=EphemeralContainers=true
。也修改了
kubelet
。 由于这是
alpha
,因此需要特定的步骤才能使其正常工作

选项1

中描述了此方法

描述pod

在上面的示例中,
attach
是通过使用
-i
标志进行的。这是在一份声明中说的

默认情况下,-i标志导致kubectl调试附加到新容器。可以通过指定--attach=false来防止这种情况

旁注

引用的第二部分是
如果会话断开连接,可以使用kubectl attach重新连接。
但是它适用于另一种方法,而不是
临时容器

选项2

此选项和所有先决条件在本文中进行了描述。我使用了
nginx
pod,而不是
Deployment

$kubectl运行nginx--image=nginx

接下来,您必须使用以下配置创建
.json
文件。请将元数据.name
更改为您的pod名称

{
    "apiVersion": "v1",
    "kind": "EphemeralContainers",
    "metadata": {
            "name": "nginx"
    },
    "ephemeralContainers": [{
        "command": [
            "sh"
        ],
        "image": "busybox:latest",
        "imagePullPolicy": "IfNotPresent",
        "name": "debugger",
        "stdin": true,
        "tty": true,
        "terminationMessagePolicy": "File"
    }]
}
重要

必须使用
kubectl replace--raw

$ kubectl replace --raw /api/v1/namespaces/default/pods/<podName>/ephemeralcontainers -f <jsonFileName>.json
在应用正确的命令后:

$ kubectl replace --raw /api/v1/namespaces/default/pods/nginx/ephemeralcontainers -f debug.json
{"kind":"EphemeralContainers","apiVersion":"v1","metadata":{"name":"nginx","namespace":"default","selfLink":"/api/v1/namespaces/default/pods/nginx/ephemeralcontainers","uid":"...}
使用
kubectl description
验证是否创建了
EphemeralContainer

$ kubectl describe po | grep 'Container ID' -B 2
Containers:
  nginx:
    Container ID:   docker://a410b326cdc3b95abb2edff8cdb4d7edca9498ba44b54ca6a448967596391813
--
Ephemeral Containers:
  debugger:
    Container ID:  docker://a1357c0daed0ad5664b8c838183a3eb0716339020e829077c14e7438fa5e1cf5
使用此方法,您将能够使用
kubectl attach

$ kubectl attach -it nginx -c debugger
If you don't see a command prompt, try pressing enter.
/ # 
结论
临时容器
是一种特殊类型的容器,在现有Pod中临时运行,以完成用户启动的操作,如故障排除。一旦终止会话,您将无法再次连接

您将得到以下错误:

kubectl apply -f debug.json 
error: unable to recognize "debug.json": no matches for kind "EphemeralContainers" in version "v1"
$ kubectl attach -it nginx -c debugger
If you don't see a command prompt, try pressing enter.
error: unable to upgrade connection: container debugger not found in pod nginx_default
它将来可能会更改,但根据我的测试,您只能连接到此容器一次。

Background 不幸的是,这仍然是alfa功能,不适合生产。如文件所述

本页概述了临时容器:一种特殊类型的容器,在现有Pod中临时运行,以完成用户启动的操作,如故障排除。您使用临时容器来检查服务,而不是构建应用程序

警告:临时容器处于早期α状态,不适合生产集群

测验 我已经用Kubernetes 1.19在Kubeadm上测试了这一点。在配置文件中设置了标志,如
apiserver
scheduler
controller manager
-
--feature gates=EphemeralContainers=true
。也修改了
kubelet
。 由于这是
alpha
,因此需要特定的步骤才能使其正常工作

选项1

中描述了此方法

描述pod

在上面的示例中,
attach
是通过使用
-i
标志进行的。这是在一份声明中说的

默认情况下,-i标志导致kubectl调试附加到新容器。可以通过指定--attach=false来防止这种情况

旁注

引用的第二部分是
如果会话断开连接,可以使用kubectl attach重新连接。
但是它适用于另一种方法,而不是
临时容器

选项2

此选项和所有先决条件在本文中进行了描述。我使用了
nginx
pod,而不是
Deployment

$kubectl运行nginx--image=nginx

接下来,您必须使用以下配置创建
.json
文件。请将元数据.name
更改为您的pod名称

{
    "apiVersion": "v1",
    "kind": "EphemeralContainers",
    "metadata": {
            "name": "nginx"
    },
    "ephemeralContainers": [{
        "command": [
            "sh"
        ],
        "image": "busybox:latest",
        "imagePullPolicy": "IfNotPresent",
        "name": "debugger",
        "stdin": true,
        "tty": true,
        "terminationMessagePolicy": "File"
    }]
}
重要

必须使用
kubectl replace--raw

$ kubectl replace --raw /api/v1/namespaces/default/pods/<podName>/ephemeralcontainers -f <jsonFileName>.json
在应用正确的命令后:

$ kubectl replace --raw /api/v1/namespaces/default/pods/nginx/ephemeralcontainers -f debug.json
{"kind":"EphemeralContainers","apiVersion":"v1","metadata":{"name":"nginx","namespace":"default","selfLink":"/api/v1/namespaces/default/pods/nginx/ephemeralcontainers","uid":"...}
使用
kubectl description
验证是否创建了
EphemeralContainer

$ kubectl describe po | grep 'Container ID' -B 2
Containers:
  nginx:
    Container ID:   docker://a410b326cdc3b95abb2edff8cdb4d7edca9498ba44b54ca6a448967596391813
--
Ephemeral Containers:
  debugger:
    Container ID:  docker://a1357c0daed0ad5664b8c838183a3eb0716339020e829077c14e7438fa5e1cf5
使用此方法,您将能够使用
kubectl attach

$ kubectl attach -it nginx -c debugger
If you don't see a command prompt, try pressing enter.
/ # 
结论
临时容器
是一种特殊类型的容器,在现有Pod中临时运行,以完成用户启动的操作,如故障排除。一旦终止会话,您将无法再次连接

您将得到以下错误:

kubectl apply -f debug.json 
error: unable to recognize "debug.json": no matches for kind "EphemeralContainers" in version "v1"
$ kubectl attach -it nginx -c debugger
If you don't see a command prompt, try pressing enter.
error: unable to upgrade connection: container debugger not found in pod nginx_default

它将来可能会更改,但根据我的测试,您只能连接到此容器一次。

嗨,PjoterS!谢谢有没有其他方法可以将侧车添加到正在运行的吊舱中?如果吊舱正在运行,您只能使用短暂的侧车。如果您想将pod与另一个容器作为侧车,您可以
复制现有容器并添加新容器作为侧车