如何在Kubernetes中公开Ingress以进行外部访问?

时间:2018-10-04 20:35:37

标签: kubernetes kubernetes-ingress nginx-ingress

我在私有网络(私有服务器,而不是AWS或Google Cloud)上有一个kubernetes集群,并且我创建了一个可以访问的服务,但是,我需要能够从集群外部进行访问,为此,我创建了一个Ingress并在集群中添加了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'主机: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

5 个答案:

答案 0 :(得分:1)

您可以使其与普通的nginx pod一起使用,但是建议的方法是安装Kubernetes入口控制器(在您使用的是nginx的情况下),因此可以安装nginx ingress controller

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

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

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

选择器:     应用:nginx

答案 1 :(得分:1)

您可以将入口控制器部署为主机端口为80的守护程序。然后,控制器的服务将不再重要。您可以将域指向群集中的每个节点

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

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

答案 2 :(得分:1)

如果您运行集群裸机,则需要告诉Nginx-ingress控制器使用hostNetwork:true,将其添加到required.yml的template / spec部分中 这样,运行入口控制器的Pod将侦听主机节点的端口80和443。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

https://github.com/alexellis/inlets 是您想要做的最简单的方法。 不要使用Inlets-operator,因为它是alpha /未成熟/不加密的,而且手动方式是快速/微小的配置+与入口控制器的混合足够灵活,您只需要执行一次即可。手动方式=进气口部署,但部署效果很好。 (对于Dev Envs,因为公共LB不会是HA。)

https://blog.alexellis.io/https-inlets-local-endpoints/ 我能够获得公共互联网HTTPS + nginx入口控制器到minikube +测试了使用入口对象路由的2个站点。在大约3-4个小时内,没有做任何好的指南/只是Caddy / Websockets的新手,而是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,然后将入口部署指向类型为Cluster IP的入口控制器服务。


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