如何以编程方式检测kubernetes集群是否已经具有入口控制器?

时间:2019-10-09 12:05:08

标签: kubernetes

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

4 个答案:

答案 0 :(得分:1)

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

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

ingress resource是Kubernetes资源,用于定义入口规则。您可以在https://kubernetes/apis/extensions/v1beta1/ingresses处查询Kubernetes API服务器,也可以使用kubectl get ingress,如其他人所述。

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

因此,最后您可能会找到提示,表明存在一个ingerss控制器,并且通过阅读入口规则及其注释,您可能还会提示存在哪个入口控制器,但是您不能依赖它。

答案 1 :(得分:1)

是的,这有点棘手,因为没有ingress-controler这样的API对象,而只有ingress这样的API对象。 Ingress仅与入口控制器松散耦合,不需要成功部署后者。因此,存在Ingress资源并不能单独指示Ingress控制器。

然而,您 可能 想要利用的技巧是将Ingress的Events部分用作一些指示性信息的来源。

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

# 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进入事件确实获得了一些额外的信息:

# 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

答案 2 :(得分:0)

有一些用Golang编写的函数,当我们点击时会返回数据

kubectl get ingress --all-namespaces 

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

link to git repository

此博客还提供了有关此类实现的一些信息,尽管不是-

open this link

答案 3 :(得分:0)

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

您提到软件将首先部署在集群上,这强烈暗示着集群上将不会部署任何东西,因此您提到的{{3 }}。

您需要提供更多详细信息,该软件的确切功能,安装者和安装方式。

您可能会在安装中仅包含一个选项,该选项将由执行检查的脚本使用。否则,您将继续根据用户输入提供正确的信息。

这都是理论上的捏造,因为缺少信息。

更新

也许尝试使用类似here的东西,或者将其实现到脚本中。