首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kubernetes中公开用于外部访问的入口?

如何在Kubernetes中公开用于外部访问的入口?
EN

Stack Overflow用户
提问于 2018-10-04 20:35:36
回答 5查看 13.2K关注 0票数 9

我在一个专用网络上有一个kubernetes集群(私有服务器,而不是aws或google云),我创建了一个服务以便能够访问,但是,我需要能够从集群外部访问,为此,我创建了一个in并在集群中添加了Ingress nginx。

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

代码语言:javascript
复制
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创建-f file.yaml

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

在尝试主服务器内外的命令时,会出现一条“连接拒绝”消息:$ curl http://172.16.0.18:80/ -H 'Host: k8s.local'

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

我的想法就是创建一个“你们好的世界”,并把它暴露在集群之外!

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

编辑的YAML文件:

代码语言:javascript
复制
    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
EN

回答 5

Stack Overflow用户

发布于 2018-10-05 01:32:07

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

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

当然,最好的解决方案是使用云提供者和负载均衡器。

票数 3
EN

Stack Overflow用户

发布于 2018-10-04 21:47:43

您可以让它使用普通的nginx,但推荐的方法是安装一个Kubernetes入口控制器,在您的例子中,您使用的是nginx,因此您可以安装一个nginx入口控制器

这里是关于如何安装它的一些信息。

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

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

选择器: app: nginx

票数 2
EN

Stack Overflow用户

发布于 2018-10-05 00:40:08

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52654769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档