kubernetes 如何使用k3 d通过唯一端口公开两个应用程序/服务?

jhkqcmku  于 4个月前  发布在  Kubernetes
关注(0)|答案(2)|浏览(57)

**来自k3 d GitHub讨论:https://github.com/rancher/k3d/discussions/690 *

我试图通过两个端口暴露两个服务。作为替代方案,我也想知道如何通过相同的端口暴露它们并使用不同的路由。我已经尝试了几篇文章和很多配置。让我知道我在k3 d + k3 s/ kubernetes + traefik(+ klipper?)的网络连接中出错的地方.
我发布了一个例子:https://github.com/ericis/k3d-networking

目标:

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

步骤

**参见:files in repo *

1.配置k3d群集并向负载均衡器公开应用端口

ports:
  # map localhost to loadbalancer
  - port: 8080:80
    nodeFilters:
      - loadbalancer
  # map localhost to loadbalancer
  - port: 8091:80
    nodeFilters:
      - loadbalancer

字符串
1.在Kubernetes中使用“deployment.yaml”部署应用并公开容器端口

ports:
  - containerPort: 80

  • 在kubernetes中公开服务。在这里,我尝试了两种方法。
  • 使用CLI
$ 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

  • 使用“ingress.yaml”将服务暴露在kubernetes之外
backend:
  service:
    name: app-1
    port:
      # expose from kubernetes
      number: 8080

cdmah0mi

cdmah0mi1#

你要么必须使用一个入口,要么必须在每个节点上打开端口(k3 d运行在docker上,所以你必须公开docker端口)

  • 在创建k3 d集群 * 期间不打开端口 *,节点端口服务将不会暴露您的应用 *

第一个月
例如,这将打开一个“外部”端口(在您的本地主机上)8080并将其Map到节点上的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出现在特定节点上,(假设您在代理[0]上打开了某个端口,并将.yaml文件设置为使用该端口),由于某些原因,本地路径Rancher存储类只是中断,不会为您的声明创建持久卷。让你的pod在你需要的地方得到调度。(如果你找到了一种在特定节点上调度pod而不破坏存储供应的方法,让我知道)
你也可以Map一系列的端口,比如:k3d cluster create mycluster --servers 1 --agents 1 -p "30000-30100:30000-30100@server[0]",但是要小心你打开的端口数量,如果你打开太多,k3 d会崩溃。

  • 使用负载均衡器 * -这是类似的,你只需要打开一个端口并Map到负载均衡器。

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


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

sczxawaw

sczxawaw2#

这对我来说很完美。

3个快速步骤和它的排序!

1.第一个月

  1. kubectl create service clsuterip.....targetPort
  2. kubectl expose deploy my-app-deployment --name=my-app-deployment-lb --type=LoadBalancer
    背景/解释
    我也有它的工作很好,然后我猜与版本的变化.它只是停止,但设置是类似的只有一个神奇的命令修复它,在最后。
    在我的ubuntu(VPS - nginx):它只处理80:433(正常)我只是代理(ssl wss什么)
    https://dev.domain.com:443 --> http://127.0.0.1:3000 or http://localhost:3000 any:port in the cluster I want to point to - so i run:
k3d cluster create mycluster --registry-use registry  --servers 1 --agents 1 --port '3000:3000@loadbalancer' --port '8080:80@loadbalancer' --port '9443:433@loadbalancer' --port '8082:8082@loadbalancer' --port '8081:80@loadbalancer'

字符串
上面的命令为我设置了一个典型的集群名为myclsuter,重要的部分是8080:80@loadbalancer(x80)
所以在设置这个之后它仍然不会工作,到目前为止我们所做的一切都告诉运行的k3 d集群,有**“可能是”“期望”**一个kubenetes负载均衡器在里面等待。
所以这里我指向3000到3000,8080到80和9443到433等等(在集群内部)
现在.

kubectl create service clsuterip.....targetPort

kubectl expose deploy my-app-deployment --name=my-app-deployment-lb --type=LoadBalancer


就是这样!您的kubernetes部署在它使用的任何端口上暴露给托管机器。

相关问题