kubernetes_关于Kubernetes垃圾收集的艰苦教训

kubernetes

前段时间,我很艰难地学到了重要的Kubernetes课程。 故事始于Kubernetes Operators ,它是打包,部署和管理Kubernetes应用程序的一种方法。 我绊倒的是集群中的垃圾回收 ,清理了不再拥有所有者对象的对象(但稍后会进行更多讨论)。

任务

去年,我工作的团队被分配来开发Kubernetes Operator。 对于团队中的大多数人来说,这是他们第一次使用Operator SDK (软件开发套件)和Kubernetes控制器 ,这是为Kubernetes供电的控制回路。 我们都阅读了有关Operator SDK的一些基本介绍信息,并遵循了使用Go编程语言构建Operator的快速入门指南 。 我们学习了一些基本原理和一些方便的技巧,并且我们渴望应用它们。

我们的任务是开发一个操作员,该操作员将安装,配置并确保许多项目的生产就绪。 我们的目标是使我们的站点可靠性工程(SRE)团队能够以最少的人工工作来自动化管理实例队列 。 这不是一件容易的事,但是我们喜欢挑战和可以使用的技术,因此我们在快速前进并打破了一些难题。

错误

最初,我们追求的是概念验证的实现,因此我们记录了错误,并计划在以后修复它们。

我将描述的错误完全适合此艾森豪威尔矩阵的象限II(正如斯蒂芬·科维所倡导的那样),它并不紧急,但很重要。 实际上非常重要-操作员创建的所有名称空间有时都会在没有用户任何请求的情况下终止。 它很少发生,因此我们决定稍后对其进行修复。

最终,我从积压的订单中发现了这个错误,并开始寻找根本原因。 操作员肯定无法终止名称空间,因为那时我们还没有在代码中编写任何Delete API调用,因此,这是第一个线索。 我通过拨打Kubernetes API服务器上的日志并确保安全保存日志来开始侦探工作。 然后,我等待问题再次发生。

一旦问题出现在我设置的环境中,我便在日志中搜索以下字符串组合: "requestURI":"/api/v1/namespaces/my-namespace" + "verb":"delete"

从搜索结果中,我发现正在执行名称空间删除的内容: "user":{"username":"system:serviceaccount:kube-system:generic-garbage-collector"

现在,我知道如何删除名称空间,但是不知道为什么 。 我打开了Kubernetes 垃圾收集文档 ,但是由于我不是一个有耐心的人,所以我只是浏览了有关ownerReference字段的基本信息,并继续思考为什么会这样。

我们在创建的名称空间上使用了ownerReference元数据字段。 所有者是由自定义资源API定义的我们自己的资源。 并且当我们的自定义资源被删除时,它通过ownerReference拥有的关联名称空间也将被删除。 关联对象的删除使卸载步骤变得轻而易举。

我没有发现任何问题,因此我继续阅读日志以获取更多线索。 我注意到当kube-controller-manager pod重启时,名称空间将被删除。 重新启动的原因对我来说很有意义: kube-controller-manager pod在主节点上运行,我们的开发集群中只有一个主节点,并且对于我们使用的实例大小,该节点上的负载非常高。

因此,我尝试自己重现该问题。 我删除了一个新创建的kube-controller-manager pod,并检查了它的日志。 一旦看到有关垃圾收集的一些日志,我最终将两个和两个放在一起,并返回到垃圾收集文档。 在那里:

注意:跨命名空间所有者引用在设计上是不允许的。这意味着:1)命名空间范围的从属只能指定同一命名空间中的所有者,而集群范围的所有者。2)集群范围的从属只能指定集群-范围内的所有者,但不是命名空间范围内的所有者。”

我们的自定义资源是命名空间范围的,但是命名空间是群集范围的。 即使设计使我们不允许使用所有者引用,Kubernetes API服务器也会创建名称空间。 因此,使用所有者引用创建名称空间,然后必须删除它们,因为垃圾回收遵循记录的规则。

经验教训

kube-controller-manager pod启动。

但是我学到的更重要的教训是不要低估文档 。 如果我在第一次阅读文档时比较耐心,那肯定可以节省一些时间。

您可能还认为,如果在将无效所有者引用添加到代码库中时遵循我的建议,我们可以避免这种情况。 但是事实证明它尚未被记录。 在Kubernetes是一种成熟的技术很久之后,于2019年2月的拉取请求添加了此重要说明。

我认为这突出了这样一个事实,即文档总是存在改进的空间。 让我们一起做,从阅读有关Kubernetes文档贡献的指南开始。

翻译自: https://opensource.com/article/20/6/kubernetes-garbage-collection

kubernetes

### 回答1: 错误:没有提供配置,请尝试设置kubernetes_master环境变量。 这个错误通常是由于缺少Kubernetes的配置信息导致的。解决方法是设置kubernetes_master环境变量,指定Kubernetes的主节点地址。具体操作可以参考Kubernetes的官方文档或者相关教程。 ### 回答2: “no configuration has been provided, try setting kubernetes_master environment variable”这个错误信息通常出现在使用Kubernetes命令行工具(kubectl)时,因为在执行kubectl命令的时候,kubectl需要获取集群的相关配置信息,如API Server地址、Token等等。如果这些配置信息未被正确设置,kubectl就会出现“error: no configuration has been provided”这个错误提示。 解决这个问题可以尝试以下几种方法: 1. 设置Kubernetes master环境变量 通过设置环境变量来告诉kubectl如何连接到Kubernetes集群。Kubernetes master环境变量指定了Kubernetes API服务器的地址,你可以将其设置为Kubernetes Master节点的IP地址或域名。在命令行中执行如下命令: ``` export KUBECONFIG=/path/to/kubeconfig.yaml export KUBERNETES_MASTER=http://your-kubernetes-master:8080 ``` 2. 在命令中指定kubeconfig文件 使用--kubeconfig选项可以让kubectl从指定文件中获取集群的配置信息。例如: ``` kubectl --kubeconfig=/path/to/kubeconfig.yaml get pods ``` 3. 检查kubeconfig文件中的配置信息 如果配置信息正确,那么可以打开kubeconfig文件来检查其中是否包含正确的集群信息,例如apiServer地址、证书、token等。 以上是一些解决“error: no configuration has been provided, try setting kubernetes_master environment variable”错误的方法,如果以上解决方法仍然无法解决问题,那么也可以考虑咨询相关专业人员。 ### 回答3: 这个错误提示意味着在运行Kubernetes命令时没有配置正确的环境变量。Kubernetes是一个开源的容器编排系统,它可以让开发者快速、自动化地部署、扩展和管理容器化应用程序。 在使用Kubernetes时,需要正确设置相关的环境变量以便Kubernetes能够访问和管理集群。这些环境变量包括Kubernetes Master的地址、证书和凭证等信息。 解决该错误的步骤如下: 1. 设置Kubernetes Master环境变量。可以通过以下命令来设置: ``` export KUBECONFIG=path/to/kubeconfig.yaml ``` 其中path/to/kubeconfig.yaml是指向Kubernetes Master的配置文件路径。该配置文件包含了Kubernetes API Server的地址、证书以及其他凭证信息。 2. 检查Kubernetes Master的地址是否正确。在设置Kubernetes Master环境变量时,需要确保指定的地址是正确的。可以通过命令行或者其他工具来验证Kubernetes Master是否正常运行。 3. 检查证书和凭证是否正确。在访问Kubernetes Master时,需要使用正确的证书和凭证。如果证书或凭证不正确,可能会导致连接失败。 在解决该错误之后,可以通过Kubernetes命令来管理容器化应用程序,并通过Kubernetes Dashboard等工具来监控和调试Kubernetes集群的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值