0

*交叉发布自 k3d GitHub 讨论:https ://github.com/rancher/k3d/discussions/690

我试图通过两个端口公开两个服务。作为替代方案,我也很想知道如何在同一个端口上公开它们并使用不同的路由。我尝试了几篇文章和很多配置。让我知道k3d + k3s / kubernetes + traefik(+ klipper?)的网络哪里出了问题......

我发布了一个例子: https ://github.com/ericis/k3d-networking

目标:

  • 通过端口 8080 到达主机上的“app-1”
  • 通过端口 8091 到达主机上的“app-2”

脚步

*参见:repo 中的文件

  1. 配置k3d集群并将应用程序端口公开给负载均衡器

    ports:
      # map localhost to loadbalancer
      - port: 8080:80
        nodeFilters:
          - loadbalancer
      # map localhost to loadbalancer
      - port: 8091:80
        nodeFilters:
          - loadbalancer
    
  2. 在 Kubernetes 中使用“deployment.yaml”部署应用并公开容器端口

    ports:
      - containerPort: 80
    
  3. 在 Kubernetes 中公开服务。在这里,我尝试了两种方法。

    • 使用命令行

      $ kubectl create service clusterip app-1 --tcp=8080:80
      $ kubectl create service clusterip app-2 --tcp=8091:80
      
    • 使用“service.yaml”

      spec:
        ports:
        - protocol: TCP
          # expose internally
          port: 8080
          # map to app
          targetPort: 80
        selector:
          run: app-1
      
  4. 使用“ingress.yaml”在 kubernetes 之外公开服务

    backend:
      service:
        name: app-1
        port:
          # expose from kubernetes
          number: 8080
    
4

1 回答 1

1

您要么必须使用入口,要么必须在每个单独的节点上打开端口(k3d 在 docker 上运行,因此您必须公开 docker 端口)

在创建 k3d 集群期间不打开端口,nodeport 服务不会暴露您的应用程序

k3d cluster create mycluster -p 8080:30080@agent[0]

例如,这将打开一个“外部”端口(在您的本地主机上)8080 并将其映射到节点上的 30080 - 然后您可以使用 NodePort 服务将该端口的流量实际连接到您的应用程序:

apiVersion: v1
kind: Service
metadata:
 name: some-service
spec:
 ports:
 - protocol: TCP
   port: 80
   targetPort: some-port
   nodePort: 30080
 selector:
   app: pgadmin
 type: NodePort

您还可以在服务器节点上打开端口,例如: k3d cluster create mycluster -p 8080:30080@server[0]

您的应用程序可以安排在任何节点上运行,并且如果您强制 pod 出现在特定节点上(假设您在 agent[0] 上打开某个端口并设置您的 .yaml 文件以使用该特定端口) ,由于某种原因,本地路径牧场主存储类刚刚中断并且不会为您的声明创建持久卷。您必须走运,并将您的 pod 安排在您需要的地方。(如果您找到一种方法可以在特定节点上安排 pod 而不会破坏存储配置程序,请告诉我)

您还可以映射一系列端口,例如: k3d cluster create mycluster --servers 1 --agents 1 -p "30000-30100:30000-30100@server[0]" 但要注意打开的端口数量,如果打开太多,k3d 会崩溃。

使用负载均衡器- 类似,您只需打开一个端口并映射到负载均衡器。

k3d cluster create my-cluster --port 8080:80@loadbalancer

然后您必须使用入口,(否则流量将无法到达)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: hello
            port:
              number: 80

我还认为入口只会路由 http 和 https 流量,https 应该在端口上完成443,据说你可以映射端口80和端口443,但我无法让它工作(我认为证书需要也设置好了)。

于 2021-07-30T13:56:50.720 回答