热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

k8s开启临时容ephemeral器进行debug调试

1.1什么是临时容器?临时容器与其他容器的不同之处在于,它缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用

ef41d60e17919645c3c17f22a26e93e7.gif


1.1 什么是临时容器?

  临时容器与其他容器的不同之处在于,它缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序。临时容器使用与常规容器相同的 Container.Spec字段进行描述,但许多字段是不允许使用的。

  • 临时容器没有端口配置,因此像 ports,livenessProbe,readinessProbe 这样的字段是不允许的。

  • Pod 资源分配是不可变的,因此 resources 配置是不允许的。

临时容器是使用 API 中的一种特殊的 ephemeralcontainers处理器进行创建的, 而不是直接添加到 pod.spec段,因此无法使用 kubectledit来添加一个临时容器。

与常规容器一样,将临时容器添加到 Pod 后,将不能更改或删除临时容器。

1.2 临时容器的用途

 当由于容器崩溃或容器镜像不包含调试实用程序而导致 kubectlexec 无用时,临时容器对于交互式故障排查很有用。

1.3 开启特性支持临时容器

需要开启支持临时容器的特性:

修改kube-apiserver.yaml、kube-scheduler.yaml、kubelet配置。

[root@xianchaomaster1]# cat/etc/kubernetes/manifests/kube-apiserver.yaml

apiVersion: v1

kind: Pod

metadata:

  annotations:

   kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint:192.168.40.180:6443

  creationTimestamp: null

  labels:

    component: kube-apiserver

    tier: control-plane

  name: kube-apiserver

  namespace: kube-system

spec:

  containers:

  - command:

    - kube-apiserver

    - --advertise-address=192.168.40.180

    ………

    - --feature-gates=RemoveSelfLink=false

- --feature-gates=EphemeralContainers=true

………

#新增加--feature-gates=EphemeralContainers=true字段

[root@xianchaomaster1]# cat/etc/kubernetes/manifests/kube-scheduler.yaml

apiVersion: v1

kind: Pod

metadata:

  creationTimestamp: null

  labels:

    component:kube-scheduler

    tier: control-plane

  name: kube-scheduler

  namespace: kube-system

spec:

  containers:

  - command:

    - kube-scheduler

    ---authentication-kubeconfig=/etc/kubernetes/scheduler.conf

    ---authorization-kubeconfig=/etc/kubernetes/scheduler.conf

    ---bind-address=192.168.40.180

    - --kubeconfig=/etc/kubernetes/scheduler.conf

    - --leader-elect=true

    - --feature-gates=EphemeralContainers=true

#新增加--feature-gates=EphemeralContainers=true字段

[root@xianchaomaster1]# cat /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--feature-gates=EphemeralContainers=true"

[root@xianchaonode1 ~]# cat /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--feature-gates=EphemeralContainers=true"

#修改之后重启k8s控制节点和工作节点的kubelet

[root@xianchaomaster1]# systemctl restart kubelet

[root@xianchaonode1 ~]# systemctl restart kubelet

#查看kube-system名称空间pod,都是running说明修改正常

[root@xianchaomaster1 test]# kubectl get pods -n kube-system

NAME                                       READY   STATUS    RESTARTS  AGE

calico-kube-controllers-6949477b58-thdxp    1/1    Running   0          22d

calico-node-t9bxc                           1/1     Running  0          46d

calico-node-xr4jj                           1/1     Running  0          46d

coredns-7f89b7bc75-lb9vn                    1/1     Running  0          22d

coredns-7f89b7bc75-w4m6r                    1/1     Running  0          22d

etcd-xianchaomaster1                        1/1     Running  0          46d

fluentd-elasticsearch-9jbn2                 1/1     Running  0          22d

fluentd-elasticsearch-n7cc8                 1/1     Running  0          22d

kube-apiserver-xianchaomaster1              1/1     Running  0          64m

kube-controller-manager-xianchaomaster1     1/1    Running   0         46d

kube-proxy-8nfx7                            1/1     Running  0          46d

kube-proxy-zwjjx                            1/1     Running  0          46d

kube-scheduler-xianchaomaster1              1/1     Running  0          29m

2、使用临时容器

 参考:https://kubernetes.io/zh/docs/tasks/debug-application-cluster/debug-running-pod/#ephemeral-container

   #创建一个部署tomcat的pod

[root@xianchaonode1 ~]# docker load -i xianchao_tomcat.tar.gz

[root@xianchaomaster1]# cat pod-tomcat.yaml

apiVersion: v1

kind: Pod

metadata:

  name: tomcat-test

  namespace: default

  labels:

    app:  tomcat

spec:

  containers:

  - name:  tomcat-java

    ports:

    - containerPort: 8080

    image:xianchao/tomcat-8.5-jre8:v1

    imagePullPolicy:IfNotPresent

[root@xianchaomaster1]# kubectl apply -f pod-tomcat.yaml

[root@xianchaomaster1]# kubectl get pods

NAME                              READY   STATUS   RESTARTS   AGE

tomcat-test                        1/1     Running  0          21m

#创建临时容器

[root@xianchaomaster1]# kubectl debug -it tomcat-test--image=busybox:1.28 --target=tomcat-java

Defaulting debug container name to debugger-6m2s8.

If you don't see a command prompt, try pressing enter.

/ #ps -ef | grep tomcat

    1 root      0:09/usr/lib/jvm/java-1.8-openjdk/jre/bin/java-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djdk.tls.ephemeralDHKeySize=2048-Djava.protocol.handler.pkgs=org.apache.catalina.webresources-Dorg.apache.catalina.security.SecurityListener.UMASK=0027-Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar-Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat-Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrapstart

#查看tomcat-test这个pod是否已经有临时容器

[root@xianchaomaster1 test]# kubectl describe pods tomcat-test

Name:         tomcat-test

Namespace:    default

Containers:

  tomcat-java:

    Ready:          True

    Restart Count:  0

    Environment:   

    Mounts:

     /var/run/secrets/kubernetes.io/serviceaccount from default-token-qbgqq(ro)

Ephemeral Containers:

  debugger-6m2s8:

    State:          Terminated

      Reason:       Completed

      Exit Code:    0

      Started:      Sun, 18 Jul 2021 11:32:34 +0800

      Finished:     Sun, 18 Jul 2021 11:34:50 +0800

    Ready:          False

    Restart Count:  0

    Environment:   

    Mounts:        

3、kubectl raw更新临时容器

[root@xianchaomaster1]# kubectl delete -f pod-tomcat.yaml

[root@xianchaomaster1]# kubectl apply -f pod-tomcat.yaml

[root@xianchaomaster1]# kubectl get pods

NAME                               READY   STATUS   RESTARTS   AGE

tomcat-test                        1/1     Running  0          21m

[root@xianchaomaster1]# cat a.json

{

   "apiVersion": "v1",

    "kind":"EphemeralContainers",

    "metadata":{

           "name": "tomcat-test"

    },

   "ephemeralContainers": [{

       "command": [

           "sh"

        ],

       "image": "busybox",

       "imagePullPolicy": "IfNotPresent",

        "name":"debugger",

       "stdin": true,

        "tty":true,

       "targetContainerName": "tomcat-java",

       "terminationMessagePolicy": "File"

    }]

}

[root@xianchaomaster1]# kubectl replace --raw/api/v1/namespaces/default/pods/tomcat-test/ephemeralcontainers -f a.json

#显示如下:

{"kind":"EphemeralContainers","apiVersion":"v1","metadata":{"name":"tomcat-test","namespace":"default","selfLink":"/api/v1/namespaces/default/pods/tomcat-test/ephemeralcontainers","uid":"e058969c-f610-4d58-83e5-28f872f16d54","resourceVersion":"548549","creationTimestamp":"2021-07-18T04:43:43Z"},"ephemeralContainers":[{"name":"debugger","image":"busybox","command":["sh"],"resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent","stdin":true,"tty":true,"targetContainerName":"tomcat-java"}]}

此时,可以直接attach到临时容器上去:

[root@xianchaomaster1]# kubectl attach -it -c debuggertomcat-test

If you don't see a command prompt, try pressing enter.

/ # ps -ef | grep tomcat

1 root      0:05/usr/lib/jvm/java-1.8-openjdk/jre/bin/java-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djdk.tls.ephemeralDHKeySize=2048-Djava.protocol.handler.pkgs=org.apache.catalina.webresources-Dorg.apache.catalina.security.SecurityListener.UMASK=0027-Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar-Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat-Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrapstart

/ #exit

调试完成退出临时容器之后,这个容器会被销毁,无法再次attach:

4、总结

临时容器特别适合包含主容器剥离出来的一些调试工具,在需要的时候临时注入到目标pod中。有个比较尴尬的问题,就是在pod中添加临时容器之后,目前还无法删除,同时如果这时候临时容器已经退出,会导致无法再次attach,也不会被拉起(临时容器不支持probe什么的),相关的issue:https://github.com/kubernetes/kubernetes/issues/84764

5、补充

目前临时容器最大的坑是无法删除,如果attach了临时容器,然后退出了容器主进程(和前面示例中展示的那样),会导致这个容器无法再attach,也无法重新启动。此时,如果要重复上述步骤再次进行调试,需要新创建一个临时容器,同时还需要保留老的配置,否则k8s会拒绝新的配置:

[root@xianchaomaster1]# cat a.json

{

   "apiVersion": "v1",

    "kind":"EphemeralContainers",

    "metadata":{

            "name": "tomcat-test"

    },

   "ephemeralContainers": [

   {

       "command": [

           "sh"

        ],

       "image": "busybox",

       "imagePullPolicy": "IfNotPresent",

        "name":"debugger",

       "stdin": true,

        "tty":true,

       "targetContainerName": "tomcat-java",

       "terminationMessagePolicy": "File"

    },

     {"command": [

           "sh"

        ],

       "image": "busybox",

       "imagePullPolicy": "IfNotPresent",

        "name":"debugger1",

       "stdin": true,

        "tty":true,

       "targetContainerName": "tomcat-java",

       "terminationMessagePolicy": "File"

    }

]

}

配置文件需要做这样的修改,再新增一个临时容器。重新修改后pod的状态(describe结果):

[root@xianchaomaster1]# kubectl replace --raw/api/v1/namespaces/default/pods/tomcat-test/ephemeralcontainers -f a.json

看tomcat-test详细信息,可以看到新增加了一个debugger1临时容器

END

微信公众号

82e5875f1b68fd9cc6a4a7ac01806234.png

作者微信:luckylucky421302

05d2cef97e0030b193696c973276ea3d.png

精彩文章推荐

K8s 常见问题

k8s超详细解读

K8s 超详细总结!

K8S 常见面试题总结

k8s控制器Deployment详细介绍:资源清单编写技巧

k8s安装隐患如何优化?从以下维度分享

使用k3s部署轻量Kubernetes集群快速教程

基于Jenkins和k8s构建企业级DevOps容器云平台

k8s原生的CI/CD工具tekton

K8S二次开发-自定义CRD资源

基于Jenkins+git+harbor+Helm+k8s+Istio构建DevOps流水线

基于k8s+Prometheus+Alertmanager+Grafana构建企业级监控告警系统

ab8771b340a343ef445c00c18942b6c8.png

                   点亮,服务器10年不宕机6d95e156a55f8989827fe39ccdbbb0b6.gif

b29b9a573b63f546119aada98f931e9c.gif 点击阅读 | 了解更多


推荐阅读
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • k8s之Service介绍
    1、Service是什么?​Service是一种k8s集群中访问pod的一种策略。k8s中的pod具有生命周期,且不可复活。每个pod有着自己的IP地址,pod的销毁与创建都会创新 ... [详细]
  • SOE中三个重要概念:Schema、Resource、Operation。
    前面几节我们介绍了SOE基本概念、RESTSOE模板以及如何处理输入输出数据。今天详细介绍一下SOE中三个重要概念:Schema、Resource、Operation。1.SchemaSOE中的R ... [详细]
  • k8snamespace配置cpu最大和最小限额
    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。问:如何为namespace配置最大和最小限额&#x ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 第五章详细探讨了 Red Hat Enterprise Linux 6 中的 Ext3 文件系统。5.1 节介绍了如何创建 Ext3 文件系统,包括必要的命令和步骤,以及在实际操作中可能遇到的问题和解决方案。此外,还涵盖了 Ext3 文件系统的性能优化和维护技巧,为用户提供全面的操作指南。 ... [详细]
  • CephPool资源池管理#查看ceph资源池cephosdlspools#创建资源池osdpoolcreate{}{rep ... [详细]
  • 本文整理了Java中org.assertj.core.api.AbstractCharSequenceAssert.hasSize()方法的一些代码示例,展示了 ... [详细]
  • 一、概述ceph为k8s提供存储服务主要有两种方式,cephfs和cephrdb;cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ... [详细]
author-avatar
呸了个安6_552
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有