kubernates通过某个端口上的入口公开服务

时间:2020-09-09 14:19:42

标签: kubernetes

嗨,我有一个使用nginx的react docker 这项服务

apiVersion: v1
kind: Service
metadata:
  labels:
    appcluster: ethernial
    app: clientweb
    visibility: external
  name: clientweb-service-ext
spec:
  ports:
  - port: 80
    name: http
  selector:
    app: clientweb
  type: ClusterIp

我想公开它,我只有1个节点作为主节点,但是端口80已被在主节点上运行的apache使用(无法将其关闭) 我想公开我的React应用,以便例如可以通过http://:30000访问 (我还需要在内部和外部公开其他REST api,其中一个托管在pod上,每个api使用端口80)

那我如何设置入口?

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clientweb-ingress
spec:
  defaultBackend:
    service:
      name: clientweb
      port:
        number: 8080

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用端口30000上的NodePort服务公开入口控制器。完成此操作后,您可以使用30000端口访问通过入口资源公开的后端Pod。如果您使用的是nginx入口控制器,请遵循此doc,NodePort服务(取自nginx安装文档)看起来像下面所示,其中包含所需的端口3000030001

apiVersion: v1
kind: Service
metadata:
  labels:
    helm.sh/chart: ingress-nginx-2.13.0
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.35.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
      nodePort: 30000 # Specified nodeport
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
      nodePort: 30001 # Specified nodeport
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

在这种情况下,您仍然可以继续在主机系统的端口80上使用apache。

curl http://NODEIP:30000/<path-in-ingress>
curl https://NODEIP:30001/<path-in-ingress>

答案 1 :(得分:0)

首先,您需要了解Ingress和Ingress Controller之间的关系。入口只是一种资源,除了声明入口规则外,它什么也不会做。所有Ingress规则都需要一个特定的Ingress Controller来实现其规则。

然后,您需要部署一个Ingress Controller,通常是一个部署(用于某些pod)和一个服务(用于外部访问)。您可以在https://kubernetes.github.io/ingress-nginx/处查看Nginx Ingress Controller并使用kubectl或helm进行部署。不要忘记注释入口类,因为它将在以后使用。

此后,您可以通过向自己的Ingress添加kubernetes.io/ingress.class: "nginx"批注,将任何Ingress应用于该Ingress Controller。并且Ingress控制器(nginx服务器)会将您的规则添加到其配置中,这意味着您的Ingress规则已被应用。

最后,由于您的Ingress-controller-service公开了它自己(来自端口30000的LoadBalanceIp或NodePort),因此,到此终结点的所有流量都将通过您的Ingress规则并重定向到所需的服务。