带 TTL 的 Kubernetes 端点

Kubernetes Endpoints with TTL

我有一个没有选择器的 Kubernetes 服务,我想通过让端点服务器 register/heartbeat 自己手动管理端点。

当我 POST 端点到 Kubernetes API 服务器时,有没有办法为端点指定 TTL,这样如果我的端点服务器终止并停止心跳,它们就会超时并自动删除?

如果不是,如果我通过 POST 将端点直接添加到底层 Etcd 而不是通过 Kubernetes API 将端点添加到注册表是否合理,或者这会导致其他有问题吗?

端点 API 对象中没有内置 TTL 或心跳。你真的不想直接写到 etcd ……那最终会咬你一口

您无需修改​​ kubernetes 即可执行此操作。

这是你自己做的方法。

  1. 为您希望拥有 TTL 的每个对象添加注释。注释可以说明它何时应该过期。您可以选择此注释的名称和格式。
  2. 每次更新对象时更新注释。
  3. 运行 重复列出给定类型的所有对象并删除需要过期的对象的另一个进程。

以下是针对端点执行此操作的特定命令。

向端点添加注解,并在一分钟后过期:

   #!/bin/bash
   expiretime=$(date -v+60S +%s)
   kubectl annotate endpoints/somename expires-at=$expiretime

用于列出端点的脚本,并在现在之后删除带有 expires-at 的端点:

   #!/bin/bash
   while 1
   do 
     for NS in $(kubectl get namespaces -o name | cut -f 2 -d "/")
     do 
         for NAME in $(kubectl --namespace=$NS get endpoints -o name)
         do
             exp=$( kubectl get --namespace $NS $NAME -o jsonpath={.metadata.annotations."expires-at"} 2> /dev/null) && \
             [[ $exp < $(date +%s) ]] && \
             echo "Deleting expired endpoints $NAME in $NS" && \ 
             kubectl delete $NS $NAME
         done
     done
   done

pod 是 运行 上面脚本的好地方。它将自动访问 API 并使用复制控制器,它将永远 运行。