带有TTL的Kubernetes端点

时间:2016-01-07 22:05:15

标签: kubernetes

我有一个没有选择器的Kubernetes服务,我想通过让端点服务器自己注册/心跳来手动管理端点。

当我将端点发送到Kubernetes API服务器时,有没有办法为端点指定TTL,以便它们会超时并在我的端点服务器终止并停止心跳时自动删除?

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

2 个答案:

答案 0 :(得分:3)

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

以下是如何自己动手。

  1. 为要拥有TTL的每个对象添加注释。注释可以说何时到期。您可以选择此注释的名称和格式。
  2. 每次更新对象时都会更新注释。
  3. 运行另一个进程,该进程重复列出给定类型的所有对象,并删除需要过期的对象。
  4. 以下是为端点执行此操作的特定命令。

    向端点添加注释,从现在起一分钟到期:

       #!/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,并且使用复制控制器,它将永远运行。

答案 1 :(得分:0)

端点API对象中没有内置TTL或心跳。你真的不想直接写给etcd但是......最终会咬你的