如何查看 kubernetes 的入口端点?

How can I see the ingress endpoints of kubernetes?

我想知道,哪些是为特定入口正确配置的端点。

例如我有以下入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dictionary
spec:
  tls:
  - hosts:
    - dictionary.juan.com
    secretName: microsyn-secret
  backend:
    serviceName: microsyn
    servicePort: 8080
  rules:
    - host: dictionary.juan.com
      http:
        paths:
        - path: /synonyms/*
          backend:
            serviceName: microsyn
            servicePort: 8080

正在运行以下服务:

apiVersion: v1
kind: Service
metadata:
  name: microsyn
spec:
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: microsyn

此服务正在公开此部署:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: microsyn
spec:
  replicas: 1
  selector:
    matchLabels:
      app: microsyn
  template:
    metadata:
      labels:
        app: microsyn
    spec:
      containers:
      - name: microsyn
        image: microsynonyms
        imagePullPolicy: Never
        ports:
        - containerPort: 8080

该应用程序是一个侦听端口 8080 的 nodejs 应用程序,在我刚刚在本地创建的 docker 图像中为路径 '/' 打招呼,这就是它具有 imagePullPolicy 的原因:从不,它是仅用于测试目的并学习如何创建入口。

所以我从 nginx-ingress 创建了 ingress 并且它已经启动 运行 一个用于本地环境测试的节点端口,稍后我将把它带到带有负载均衡器的部署中:

https://github.com/nginxinc/kubernetes-ingress/tree/master/examples/complete-example

所以我执行以下操作:

minikube service list

|---------------|----------------------|--------------------------------| | NAMESPACE | NAME | URL | |---------------|----------------------|--------------------------------| | default | kubernetes | No node port | | default | microsyn | No node port | | kube-system | default-http-backend | http://192.168.99.100:30001 | | kube-system | kube-dns | No node port | | kube-system | kubernetes-dashboard | http://192.168.99.100:30000 | | nginx-ingress | nginx-ingress | http://192.168.99.100:31253 | | | | http://192.168.99.100:31229 | |---------------|----------------------|--------------------------------|

太棒了我能做到:

curl http://192.168.99.100:31253/synonyms

但后来我得到一个:

<html>
  <head><title>404 Not Found</title></head>
  <body bgcolor="white">
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx/1.15.2</center>
  </body>
</html>

所以我唯一的 nginx 是来自这个 minikube 的,它运行良好。但是我看不到为此入口配置的端点...

我看到日志说:

2018/08/11 16:07:05 [notice] 117#117: signal process started
I0811 16:07:05.313037       1 event.go:218] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"dictionary", UID:"9728e826-9d80-11e8-9caa-0800270091d8", APIVersion:"extensions", ResourceVersion:"57014", FieldPath:""}): type: 'Normal' reason: 'AddedOrUpdated' Configuration for default/dictionary was added or updated
W0811 16:15:05.826537       1 reflector.go:341] github.com/nginxinc/kubernetes-ingress/nginx-controller/controller/controller.go:413: watch of *v1.ConfigMap ended with: too old resource version: 56348 (56655)

这意味着字典入口已被正确处理。

但是为什么我得到 404?

在哪里可以看到为此入口配置的端点?

我想要 运行 一个说 nginx 的命令 --> 你在听哪些端点?

But then Why I get a 404?

入口资源——或者您在问题中展示的资源——使用 virtual-host 路由,因此在与 [=48] 交互时必须设置 host: header =]:

curl -H 'host: dictionary.juan.com' http://192.168.99.100:31253/synonyms/something

我必须查找 path: 语法才能知道 /synonyms/* 是否匹配 /synonyms,这就是我在 curl 中包含斜线和额外内容的原因。

要以非 curl 方式与其交互,您可以将 Ingress 中的 host: 暂时更改为 192.168.99.100 或使用 dnsmasq创建一个本地名称服务器,您可以在其中将 dictionary.juan.com 覆盖为始终 return 192.168.99.100,然后 Chrome 将自行发送正确的 host: header .

Where can I see the endpoints that are configured for this ingress??

这个问题有点不准确,因为 Endpoint 是正式资源,与 Ingress 无关,但答案是:

kubectl get endpoints microsyn

I would like to run a command that says nginx --> which endpoints are you listening to?

首先,查找 nginx-ingress Pod 的名称(如果有多个,其中任何一个都应该这样做),然后查看 Pod 中的 nginx.conf 以确切知道是什么规则它已将 Ingress 资源转换为:

kubectl exec $ingress_pod cat /etc/nginx/nginx.conf