如何列出作用于 Kubernetes 服务的入口?

我想检索所有作用于 Kubernetes 服务的入口。

我可以使用命令 kubectl get ingress -n <namespace> 获取命名空间中的入口。

kubectl 中是否有一个命令可以让我获取作用于特定 Kubernetes 服务的入口?

stack overflow How can I list the ingresses that act on a Kubernetes service?
原文答案

答案:

作者头像

要获取集群中的所有入口规则,您可以运行:

kubectl get ingress -A

要获取所有入口规则(包括它们使用的服务)的摘要,您可以运行以下命令:

kubectl describe ingress -A

要获取 json 格式的完整入口对象,您可以运行以下命令:

kubectl get ingress -A -o json

然后,您可以解析该 json 以获取使用的服务。

作者头像

kubectl 中没有命令,但您可以围绕它编写脚本(Bash):

kubectl get ingress --all-namespaces -o custom-columns=:.metadata.namespace,:.metadata.name --no-headers | while read line; do
  namespace=$(awk '{print $1}' <<<"$line")
  name=$(awk '{print $2}' <<<"$line")
  if kubectl get ingress "$name" -n "$namespace" -o yaml | grep -n " name: $SERVICE"; then
    echo "$namespace/$name"
  fi
done

这并不完美,因为这会检测到每个 Ingress 的行匹配 name: $SERVICE (其中 $SERVICE 是您的服务的名称),因此可能会出现误报。但是,它应该检测集群中所有作用于指定服务的入口。

作者头像

您可以列出所有入口对象及其相应的服务,如下所示:

> kubectl get ing -o=custom-columns='NAME:.metadata.name,SVCs:..service.name'

NAME           SVCs
my-ingress     my-products,my-discounted-products
my-ingress2    my-products,my-discounted-products
my-ingress3    my-products,my-discounted-products
my-ingress4    my-products11,my-discounted-products
my-ingress5    my-products22,my-discounted-products
neg-demo-ing   neg-demo-svc

如果您想过滤并仅获取入口对象列表,对于给定的服务名称,您可以执行以下操作(需要安装 jq):

> kubectl get ing -o=json | jq '.items[] | select(..|.service?.name == "my-products") | .metadata.name'

"my-ingress"
"my-ingress2"
"my-ingress3"
> kubectl get ing -o=json | jq '.items[] | select(..|.service?.name == "neg-demo-svc") | .metadata.name'

"neg-demo-ing"

我一直在寻找一种仅使用 jsonpath 就无需额外依赖即可实现相同目标的方法,但似乎无法在过滤器内进行递归下降。