0

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

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

严格模仿示例,然后尝试阅读文档,我得到了一个看起来很有趣但不起作用的设置。也许某个好心人可以指出我的错误和/或给我指点如何调试它以及在哪里阅读更多关于它的信息。

我有 kubectl 应用了以下文件:

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

还有两项新服务。请注意,我还配置了 default-http-backend-service 类型:LoadBalancer,这仅用于调试。我已经包含了我的 web 前端,它被称为 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 仪表板并查看了负载均衡器及其规则,这对我(严重未经训练的)眼睛来说看起来不错。我没有碰这些,负载均衡器和规则是由系统创建的。这里有一个截图:

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

但不幸的是,它不起作用。我可以卷曲我的 webcms 服务:

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

(入口使用不同的 IP 给出相同的结果)

如果您读到这里:感谢您抽出宝贵时间,如果您能提供任何提示,我将不胜感激。

玛丽安

4

1 回答 1

3

有点微不足道,但它会为您节省一些钱:default-http-backend不是设计为面向外部的,因此不应该type: LoadBalancer- 它仅设计为 404,因此 Ingress 控制器可以普遍/dev/null地为 Pod-less 进行流量服务。


在琐碎的阶梯上稍微向上移动,为了非常清楚:我不认为你有什么,但我确实想为你提供一些东西来决定你是否想改变。通常,Pod 容器的合同是为映射到底层映像端口的端口(“http”、“https”、“prometheus”等)提供一个理想的自然语言名称。然后,targetPort:在 Service 中设置该名称,而不是为容器提供移动端口的能力而不会破坏 Service-to-Pod 合同的数字。nginx-ingress 部署的 container:ports:同意我的观点。


现在,让我们进入可能导致您的系统无法按您希望的方式运行的部分。

我现在无法证明这一点,但是如果没有hostNetwork: true , container:hostPort:的存在是可疑的。我真的很惊讶没有抱怨,因为这些配置组合有点奇怪。kubectl

我想故障排除步骤是进入Node(也就是说,集群中不是 Pod 的东西——Node如果你愿意,你也可以在与你的 相同的子网中使用单独的 VM 来完成它)然后 curl到运行 Pod 的端口Node31452 nginx-ingress-controller

kubectl get nodes将列出所有可用Node的 s,并且

kubectl get -o json pod nginx-ingress-controller-deployment-4106313651-v7p03 | jq -r '.items[0].status.hostIP'如果您还不知道,应该生成特定 VM 的 IP 地址。错误,我刚刚从您的提示中意识到您可能没有jq- 但我对 PowerShell 的了解不够深入,无法了解它的 JSON 查询语法。

然后,从任何Node:curl -v http://${that_host_IP_value}:31452看什么实现。它可能是某事,也可能是相同的“什么?!” LoadBalancer 给你的。


至于 Ingress 资源,同样,default-http-backend 不应该有 Ingress 资源——我不知道它是否会伤害任何东西,因为我从未尝试过,但我也打赌 $1 它不是帮助你的情况,要么。

既然您已经知道Service使用. 这样,您的 Ingress 控制器实际上将有一些不是默认后端的目标。default:webcmsdefaultwebcmsdefault-http-backend

如果您还没有看到它,添加 --v=2将导致 Pod 发出其 nginx 配置更改的实际差异,这对于追踪配置误解非常有帮助


很抱歉,您第一次接触 Kubernetes 时不得不与 Azure、Ingress 控制器和粗略的文档作斗争。当你正确设置所有东西时真的很神奇,但它肯定是一个非常复杂的机器。

于 2017-09-17T06:33:16.603 回答