Azure上的Kubernetes nginx入口控制器无法访问

时间:2017-09-11 15:07:53

标签: azure kubernetes azure-container-service

我对Azure,Kubernetes,甚至是Docker本身都很陌生,并且正在使用该系统来学习和评估以后可能的部署。到目前为止,我已经将我的服务停靠并成功部署它们,并使用类型为LoadBalancer的服务公开显示Web前端。

现在我想添加TLS终端并且已经了解到,为此我应该配置一个入口控制器,其中最常提到的是nginx-ingress-controller。

严格修改示例,然后尝试阅读文档,我已经到达了一个看似有趣但不起作用的设置。也许某种灵魂可以指出我的错误和/或指出如何调试这个以及在哪里阅读更多关于它的信息。

我有kubectl申请' d以下文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: default-http-backend-deployment
  namespace: kube-system
spec:
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: default-http-backend
          image: gcr.io/google_containers/defaultbackend:1.0
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend-service
  namespace: kube-system
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80  
  selector:
    app: default-http-backend
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-controller-conf
  namespace: kube-system
data:
  # enable-vts-status: 'true'
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller-deployment
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-ingress-controller
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.13
          name: nginx-ingress-controller
          ports:
            - containerPort: 80
              hostPort: 80
            - containerPort: 443
              hostPort: 443
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          args:
            - /nginx-ingress-controller
            - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
            - --configmap=$(POD_NAMESPACE)/nginx-ingress-controller-conf
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress-controller-service
  namespace: kube-system
spec:
  ports:
    - name: https
      port: 443
      protocol: TCP
      targetPort: 443
    - name: http
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx-ingress-controller
  sessionAffinity: None
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: 
      http:
        paths:
          - path: /
            backend:
              serviceName: default-http-backend-service
              servicePort: 80

这给了我两个豆荚:

c:\Projects\Release-Management\Azure>kubectl get pods --all-namespaces

NAMESPACE     NAME                                                   READY     STATUS    RESTARTS   AGE
<some lines removed>
kube-system   default-http-backend-deployment-3108185104-68xnk       1/1       Running   0          39m
<some lines removed>
kube-system   nginx-ingress-controller-deployment-4106313651-v7p03   1/1       Running   0          24s

还有两项新服务。请注意,我还使用类型:LoadBalancer配置了default-http-backend-service,这仅用于调试。我已经包含了我的网络前端,名为webcms:

c:\Projects\Release-Management\Azure>kubectl get services --all-namespaces

NAMESPACE     NAME                               CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
<some lines removed>
default       webcms                             10.0.105.59    13.94.250.173   80:31400/TCP                 23h
<some lines removed>
kube-system   default-http-backend-service       10.0.106.233   13.80.68.38     80:31639/TCP                 41m
kube-system   nginx-ingress-controller-service   10.0.33.80     13.95.30.39     443:31444/TCP,80:31452/TCP   37m

最后是一个入口:

c:\Projects\Release-Management\Azure>kubectl get ingress --all-namespaces

NAMESPACE     NAME            HOSTS     ADDRESS      PORTS     AGE
kube-system   nginx-ingress   *         10.240.0.5   80        39m

没有我能立即发现的错误。然后我去了Azure Dashboard并查看了负载均衡器及其规则,这对我(严重未经训练的)眼睛看起来很好。我没有触及这些,负载均衡器和规则是由系统创建的。这里有一个截图:

https://qvwx.de/tmp/azure-loadbalancer.png

但遗憾的是它不起作用。我可以卷曲我的网络摄像头服务:

c:\Projects\Release-Management\Azure>curl -v http://13.94.250.173
* Rebuilt URL to: http://13.94.250.173/
*   Trying 13.94.250.173...
* TCP_NODELAY set
* Connected to 13.94.250.173 (13.94.250.173) port 80 (#0)
<more lines removed, success>

但是default-http-backend和ingress都没有工作:

c:\Projects\Release-Management\Azure>curl -v http://13.80.68.38
* Rebuilt URL to: http://13.80.68.38/
*   Trying 13.80.68.38...
* TCP_NODELAY set
* connect to 13.80.68.38 port 80 failed: Timed out
* Failed to connect to 13.80.68.38 port 80: Timed out
* Closing connection 0
curl: (7) Failed to connect to 13.80.68.38 port 80: Timed out

(ingress使用不同的IP提供相同的内容)

如果你读到这里:感谢你的时间,我将不胜感激。

玛丽安

1 个答案:

答案 0 :(得分:3)

有点琐碎的事情,但它会为你节省一些时间:default-http-backend并非设计为面向外面,因此不应该type: LoadBalancer - 它是{{ 3}}因此,Ingress控制器可以为无Pod服务提供普遍的/dev/null流量。

略微提升平凡的阶梯,并且极其清晰:我不认为你拥有的是错误,但我确实想要为你提供一些决定你是否愿意改变的东西。通常,Pod的容器的合同是为端口(“http”,“https”,“prometheus”等)提供理想的自然语言名称,这些名称映射到底层图像的端口。然后,将服务中的targetPort:设置为名称,而不是数字,它使容器能够移动端口号而不会破坏服务到 - 合同。 merely designed to 404同意我的意见。

现在,让我们进入可能导致您的系统无法按照您的意愿行事的部分。

我现在无法证明这一点,但The nginx-ingress Deployment's container:ports:的存在在没有containers:hostPort:的情况下是可疑的。我真的很惊讶kubectl并没有抱怨,因为那些配置组合有点奇怪。

我想故障排除步骤是启用Node(即群集中不是Pod的东西 - 您可以使用与{{在同一子网内的单独VM)来执行此操作1}},如果你愿意,然后卷曲到Node Pod正在运行的Node的端口31452。

nginx-ingress-controller会列出所有可用的kubectl get nodes

如果您还不知道,

Node应生成特定VM的IP地址。呃,我刚从你的提示中意识到你可能没有kubectl get -o json pod nginx-ingress-controller-deployment-4106313651-v7p03 | jq -r '.items[0].status.hostIP' - 但我不太了解PowerShell,知道它的JSON查询语法。

然后,从任何jqNode,看看实现了什么。它可能是某种东西,或者它可能是相同的“wha?!” LoadBalancer给你的。

至于Ingress资源,再次默认-http-backend不应该有Ingress资源 - 我不知道它是否有任何伤害,因为我从未尝试过,但我也打赌$ 1它也不是帮助你的情况。

由于您已经知道curl -v http://${that_host_IP_value}:31452已知Service default:webcms,我建议在default命名空间中创建一个Ingress资源,几乎与您当前的Ingress资源完全相同,但是指出在webcms而不是default-http-backend。这样你的Ingress控制器实际上会有一些目标,而不是默认的后端。

如果您还没有看到它,hostNetwork: true将导致Pod发出其nginx配置更改的实际差异,这可能令人难以置信地有助于跟踪配置误解< / p>

我很抱歉,您必须与Azure,Ingress控制器以及与Kubernetes首次接触的粗略文档进行战斗。当你正确设置所有东西时真的很神奇,但肯定是一个相当复杂的机器。