【问题标题】:How can I programmatically detect whether a kubernetes cluster has an ingress controller already?如何以编程方式检测 kubernetes 集群是否已经有入口控制器?
【发布时间】:2020-02-06 18:26:44
【问题描述】:

类似于this question,但适用于通用 kubernetes。我正在编写的软件如何以编程方式检测集群中是否已经存在任何入口控制器?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    您很可能做不到,因为入口控制器只是一个部署,它通过使用 REST 或其他一些 Kubernetes API 客户端从 Kubernetes API 服务器获取 Kubernetes 入口资源来读取和解释 Kubernetes 入口资源。

    如果存在入口资源,则强烈暗示存在入口控制器。

    ingress resource 是用于定义入口规则的 Kubernetes 资源。可以通过https://kubernetes/apis/extensions/v1beta1/ingresses查询Kubernetes API server,也可以使用别人提到的kubectl get ingress

    注释ingress.class 不是强制性的,除非存在多个入口控制器(请参阅https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#using-multiple-ingress-controllers)。

    所以最后你可能会发现存在一个 ingress 控制器的提示,并且通过阅读入口规则及其注释,你还可能会得到存在哪个入口控制器的提示,但你不能依赖它。

    【讨论】:

    • 什么资源?我可以检测到入口类吗?还是别的什么?
    • 我添加了更多细节
    • 不幸的是,我可能无法依赖存在任何入口。在某些情况下,我的软件将首先部署在集群上。我需要事先验证集群是否处于良好状态。
    • 不幸的是,您也无法可靠地检测到入口控制器。您可以检查常见的入口控制器,例如kubernetes.io/docs/concepts/services-networking/… 列出的那些可能已经足够好,但它不是通用的。
    【解决方案2】:

    是的,这有点棘手,因为没有像 ingress-controler 这样的 API 对象,而只有 ingressIngress 只是松散地耦合到入口控制器,不需要后者成功部署。所以 Ingress 资源的存在并不能作为 Ingress Controller 本身的指示。

    但是您可能想要利用的技巧是使用 Ingress 的 Events 部分作为一些指示性信息的来源。

    因此,当您在尚未部署入口控制器的新 k8s 集群中部署入口时,事件部分为空:

    # deploy Ingress (no ingress controller yet)
    $ kubectl apply -f - <<EOF
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: test-ingress
    spec:
      rules:
      - http:
          paths:
          - path: /testpath
            backend:
              serviceName: test
              servicePort: 80
    EOF
    
    # check that Ingress deployed successfully
    $ k get ing
    NAME           HOSTS   ADDRESS   PORTS   AGE
    test-ingress   *                 80      36m
    
    # confirm there are no Events so far
    $ k describe ing
    Name:             test-ingress
    Namespace:        default
    Address:          
    Default backend:  default-http-backend:80 (<none>)
    Rules:
      Host  Path  Backends
      ----  ----  --------
      *     
            /testpath   test:80 (<none>)
    ...
      nginx.ingress.kubernetes.io/rewrite-target:  /
    Events:                                        <none>
    
    

    那么,如果您deploy the ingress controller Ingress 的活动确实获得了一些额外信息:

    # deploy ingress controller
    $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
    namespace/ingress-nginx created
    configmap/nginx-configuration created
    configmap/tcp-services created
    configmap/udp-services created
    serviceaccount/nginx-ingress-serviceaccount created
    clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
    role.rbac.authorization.k8s.io/nginx-ingress-role created
    rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
    clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
    deployment.apps/nginx-ingress-controller created
    
    # check Ingress details once again
    $ k describe ing test-ingress
    Name:             test-ingress
    Namespace:        default
    Address:          
    Default backend:  default-http-backend:80 (<none>)
    Rules:
      Host  Path  Backends
      ----  ----  --------
      *     
            /testpath   test:80 (<none>)
    ...
      nginx.ingress.kubernetes.io/rewrite-target:  /
    Events:
      Type    Reason  Age    From                      Message
      ----    ------  ----   ----                      ------- 
    
    Normal  CREATE  7m11s  nginx-ingress-controller  Ingress default/test-ingress
    

    【讨论】:

    • 这是一种有趣的方法。只是想补充一点,这也是入口控制器特定的。我正在使用一个定制的入口控制器,它不会出现在任何入口事件中。
    【解决方案3】:

    Golang 中写了一些函数,当我们点击时返回数据

    kubectl get ingress --all-namespaces 
    

    请参考此链接,也许在将 github 存储库合并到您的代码后,您可以获得一些帮助。

    link to git repository

    这个博客也有一些关于这种实现的信息,虽然不完全是 -

    open this link

    【讨论】:

    • “手动”不是一个选项。我不是在管理集群,而是在编写软件。
    【解决方案4】:

    如果您为软件提供足够的访问权限,例如使用 RBAC,您可以使用 Kubernetes API 或 kubectl 命令实施检查。 这应该作为一种安全措施被限制在当前的命名空间中。

    您提到该软件将首先部署在集群上,这强烈暗示集群上不会部署任何东西,因此不会有 Ingress,正如您提到的 SO 问题 here .

    您需要提供更多详细信息,该软件的具体用途、安装人员和安装方式。

    您可能只在安装中包含一个选项,该选项将由执行检查的脚本使用。或者您将根据用户输入来提供正确的信息。

    由于缺乏信息,这都是理论制作。

    更新

    也许可以尝试使用 Peer finder 之类的东西或将这个想法实施到您的脚本中。

    【讨论】:

    • 我正在编写这种脚本,并且可以完全访问 kubectl 和/或 api 服务器。它可能是一个全新的集群,也可能是一个已经在使用的集群。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多