6

我在私有网络(私有服务器,不是 aws 或谷歌云)上有一个 kubernetes 集群,我创建了一个能够访问的服务,但是,我需要能够从集群外部访问,为此我创建了一个入口并在集群中添加了ingress-nginx。

这是我多次尝试后使用的 YAML:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - host: k8s.local
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: ClusterIP
  selector:
    name: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  # selector:
    # app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: echoserver
        image: nginx
        ports:
        - containerPort: 80

我这样运行 yaml:kubectl create -f file.yaml

在 /etc/hosts 文件中,我将k8s.local添加到主服务器的 ip 中。

当尝试输入或输出主服务器的命令时,会出现“连接被拒绝”消息: $ curl http://172.16.0.18:80/ -H 'Host: k8s.local'

我不知道它是否重要,但我在集群中使用 Flannel。

我的想法只是创建一个“hello world”并将其暴露在集群之外!

我是否需要更改配置中的任何内容以允许此访问?


YAML 文件编辑:

    apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    # nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: k8s.local
    http:
      paths:
      - path: /teste
        backend:
          serviceName: nginx
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer # NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: echoserver
        image: nginx
        ports:
        - containerPort: 80
4

5 回答 5

3

您可以将入口控制器部署为具有主机端口 80 的守护程序集。此时控制器的服务将无关紧要。您可以将域指向集群中的每个节点

您可以执行 NodePort 类型的服务,但这将迫使您使用 30k 附近的某个端口,您将无法使用端口 80

当然最好的解决方案是使用带有负载均衡器的云提供商

于 2018-10-05T01:32:07.397 回答
1

如果你运行你的集群裸机,你需要告诉 nginx-ingress 控制器使用 hostNetwork: true,添加到mandatory.yml 的模板/规范部分这样运行入口控制器的 pod 将监听端口 80 和 443主机节点。

于 2019-04-10T23:40:11.687 回答
1

在这种情况下,NodePort 可以工作。它将在每个节点中打开一个高端口号(每个节点中的相同端口),因此您可以使用这些节点中的任何一个。如果需要,放置一个负载均衡器,并将后端池指向您正在运行的那些实例。请勿使用 ClusterIP,它仅供内部使用。

于 2018-10-05T00:40:08.913 回答
1

https://github.com/alexellis/inlets 是做你想做的最简单的方法。
注意:加密需要 wss:// 这需要 TLS 证书,如果你想要完全自动化的加密 + 使用 Inlets 作为第 4 层 LB 的能力,你应该使用 Inlets Pro,与其他云替代方案相比它非常便宜。

我还能够使用 Inlets 的开源版本作为第 7 层 LB 设置 oss /non-kubernetes-operator 版本的 Inlets 加密/wss(网络套接字安全)。(它只是需要一些手动配置/不像专业版那样完全自动化)

https://blog.alexellis.io/https-inlets-local-endpoints/ 我能够获得公共互联网 HTTPS + nginx 入口控制器到 minikube + 测试了使用入口对象路由的 2 个站点。在大约 3-4 小时内,没有很好的指导/是 Caddy/Websockets 的新手,但是 Kubernetes Ingress 方面的专家。
基本上:
第 1 步。)使用公共 IP 在 Digital Ocean 上创建 0.007 美元/小时或 5 美元/月的 VPS
第 2 步。)将 mysite1.com、*.mysite1.com、mysite2.com、*.mysite2.com 指向公众VPS 的 IP。
步骤 3.) SSH 进入机器并安装 Inlets + Caddy v1.0.3 + Caddyfile 这是我的:

mysite1.com, *.mysite1.com, mysite2.com, *.mysite2.com

proxy / 127.0.0.1:8080 {
  transparent
}

proxy /tunnel 127.0.0.1:8080 {
  transparent
  websocket
}

tls {
    max_certs 10
}


步骤 4.) 在 kubernetes 集群上部署 1 个入口部署,使用 wss 到您的 VPS,并将入口部署指向集群 IP 类型的入口控制器服务。


发生的基本情况是:
1.) Caddy 利用 Lets Encrypt Free 为您指向 Caddy 服务器的每个网站自动获取 HTTPS 证书。
2.) 您的入口部署使用具有公共 IP 的 VPS 使用 websockets 启动双向 VPN 隧道。(警告 VPN 隧道只有在您指定 wss 时才会被加密,并且这要求服务器具有从“LEF”获取的 TLS 证书)
3.) Caddy 现在是终止 HTTPS 的公共 L7 LB/反向代理,并且通过加密的 websockets VPN 隧道转发到您的入口控制器。然后是正常的入口。
4.) 流量:DNS -(解析 IP)-> (HTTPS)VPS/L7 ReverseProxy - 加密的 VPNtunnel-> Inlets pod from Inlets Deployment -L7 集群网络中的明文重定向到 -> Ingress Controller Service -> Ingress Controller Pod - L7 重定向到 -> 由入口对象定义的集群 IP 服务/站点。

于 2019-10-14T07:46:12.727 回答
1

您可以使用普通的 nginx pod 使其工作,但推荐的方法是安装 Kubernetes 入口控制器,在您使用 nginx 的情况下,您可以安装nginx 入口控制器

以下是有关如何安装它的一些信息。

如果您想允许外部访问,您还可以将 nginx 入口控制器公开为LoadBalancer服务。您也可以使用NodePort,但您必须手动将负载均衡器指向 Kubernetes 节点上的端口。

是的,“服务”上的选择器必须是:

选择器:应用程序:nginx

于 2018-10-04T21:47:43.373 回答