【发布时间】:2020-02-06 18:26:44
【问题描述】:
类似于this question,但适用于通用 kubernetes。我正在编写的软件如何以编程方式检测集群中是否已经存在任何入口控制器?
【问题讨论】:
标签: kubernetes
类似于this question,但适用于通用 kubernetes。我正在编写的软件如何以编程方式检测集群中是否已经存在任何入口控制器?
【问题讨论】:
标签: kubernetes
您很可能做不到,因为入口控制器只是一个部署,它通过使用 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 控制器的提示,并且通过阅读入口规则及其注释,你还可能会得到存在哪个入口控制器的提示,但你不能依赖它。
【讨论】:
是的,这有点棘手,因为没有像 ingress-controler 这样的 API 对象,而只有 ingress。 Ingress 只是松散地耦合到入口控制器,不需要后者成功部署。所以 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
【讨论】:
Golang 中写了一些函数,当我们点击时返回数据
kubectl get ingress --all-namespaces
请参考此链接,也许在将 github 存储库合并到您的代码后,您可以获得一些帮助。
这个博客也有一些关于这种实现的信息,虽然不完全是 -
【讨论】:
如果您为软件提供足够的访问权限,例如使用 RBAC,您可以使用 Kubernetes API 或 kubectl 命令实施检查。
这应该作为一种安全措施被限制在当前的命名空间中。
您提到该软件将首先部署在集群上,这强烈暗示集群上不会部署任何东西,因此不会有 Ingress,正如您提到的 SO 问题 here .
您需要提供更多详细信息,该软件的具体用途、安装人员和安装方式。
您可能只在安装中包含一个选项,该选项将由执行检查的脚本使用。或者您将根据用户输入来提供正确的信息。
由于缺乏信息,这都是理论制作。
更新
也许可以尝试使用 Peer finder 之类的东西或将这个想法实施到您的脚本中。
【讨论】: