Kubernetes Nginx Ingress Controller 暴露 Nginx Webserver

Posted

技术标签:

【中文标题】Kubernetes Nginx Ingress Controller 暴露 Nginx Webserver【英文标题】:Kubernetes Nginx Ingress Controller expose Nginx Webserver 【发布时间】:2019-02-24 18:09:45 【问题描述】:

我基本上是想通过 URL 从外部访问 nginx-hello 页面。我已经为运行 kubernetes 和 Nginx 入口的 v-server 的子域创建了一个(工作)A 记录:vps.my-domain.com

我使用以下教程通过 kubeadm 在 CoreOS 上将 Kubernetes 安装为单节点集群:https://kubernetes.io/docs/setup/independent/install-kubeadm/、https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/ 和使用 https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal 的 nginx-ingress。

我还在 /etc/hosts 文件中添加了以下条目:

31.214.xxx.xxx vps.my-domain.com

(xxx被替换为服务器IP的后三位)

我使用以下文件来创建部署、服务和入口:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: http
  selector:
    run: my-nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "False"
spec:
  rules:
  - host: vps.my-domain.com
    http:
      paths:
      - backend:
          serviceName: my-nginx
          servicePort: 80

描述的输出:

core@vps ~/k8 $ kubectl describe ing
Name:             my-nginx
Namespace:        default
Address:
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host                  Path  Backends
  ----                  ----  --------
  vps.my-domain.com
                           my-nginx:80 (<none>)
Annotations:
  kubectl.kubernetes.io/last-applied-configuration:      
"apiVersion":"extensions/v1beta1",...

  kubernetes.io/ingress.class:         nginx
  ingress.kubernetes.io/ssl-redirect:  False
Events:
  Type    Reason  Age                From                      Message
  ----    ------  ----               ----                      -------
  Normal  UPDATE  49m (x2 over 56m)  nginx-ingress-controller  Ingress default/my-nginx

虽然我可以使用 nodeip 和端口 80 卷曲 Nginx hello 页面,但它在 VM 外部不起作用。 Failed to connect to vps.my-domain.com port 80: Connection refused

是我忘记了什么还是配置有误?任何帮助或提示将不胜感激!

谢谢

编辑:

访问“vps.my-domain.com:30519”给了我 nginx 欢迎页面。但在配置中我指定了端口:80。 我从 get services 的输出中得到了端口:

core@vps ~/k8 $ kubectl get services --all-namespaces | grep "my-nginx"
default         my-nginx               ClusterIP   10.107.5.14      <none>        80/TCP                       1h

我还通过添加使其在端口 :80 上工作

externalIPs:
  - 31.214.xxx.xxx

到 my-nginx 服务。但这不是它应该如何工作的,对吧?在 kubernetes 和 ingress-nginx 的教程和示例中,它总是在没有外部 IP 的情况下工作。此外,入口规则现在不起作用(例如,如果我将路径设置为 /test)。

【问题讨论】:

你检查过你的iptables中是否暴露了端口吗?外部 telnet 有什么作用? telnet ip port? 这给了我和 curl 一样的效果:Failed to connect to vps.my-domain.com port 80: Connection refused 我认为 kubernetes/ingress 负责端口? (至少对于使用 NodePort 的服务是这样) 【参考方案1】:

显然我遗漏了一个部分:负载平衡器。我不确定为什么这些说明中没有将其作为要求提及。但我遵循了本教程:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#a-pure-software-solution-metallb,现在一切正常。

由于 metallb 需要多个 IP 地址,您必须列出您的单个 IP 地址和子网 \32:31.214.xxx.xxx\32

【讨论】:

以上是关于Kubernetes Nginx Ingress Controller 暴露 Nginx Webserver的主要内容,如果未能解决你的问题,请参考以下文章

ingress-nginx部署

Nginx.ingress.kubernetes.io/proxy-body-size 不工作

Kubernetes Ingress Nginx 加载资源 404

Kubernetes集群 服务暴露 Nginx Ingress Controller

Kubernetes Ingress-nginx高级用法

Kubernetes Ingress-nginx高级用法