Docker Desktop + k8s plus https 在部署中将多个外部端口代理到 http 上的 pods?

Docker Desktop + k8s plus https proxy multiple external ports to pods on http in deployment?

我正在尝试做一件我认为很简单的事情。我需要在 docker 桌面的 k8s 环境中收听 https://localhost:44301, https://localhost:5002, https://localhost:5003,并使用我指定的 pfx file/password 进行代理,并通过端口将其转发到 [=25] =] 侦听特定地址(可以是端口 80,无关紧要)

文档看起来非常复杂,看起来应该是直截了当的。我可以获得 pods 运行,我可以使用 kubectl port-forward 并且它们工作正常,但我无法弄清楚如何使用 ha-proxy 或 nginx 或其他任何东西进入有意义的方式。

谁能做一个 ELI5 告诉我如何打开它?我在 Windows 10 2004 上使用 WSL2 和 Docker 实验,所以我应该可以访问他们在文档中引用的入口内容,并弄清楚。

谢谢!

正如评论中所讨论的,这是一个社区维基答案:


我已经在 Windows 的 Docker 上成功地在 Kubernetes 中创建了 Ingress 资源。

重现步骤

  • 启用 Hyper-V
  • 为 Windows 安装 Docker 并启用 Kubernetes
  • 连接 kubectl
  • 启用入口
  • 创建部署
  • 创建服务
  • 创建入口资源
  • 将主机添加到本地主机文件
  • 测试

启用Hyper-V

从具有管理员权限的 Powershell 运行 下面的命令:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

系统可能会要求您重新启动计算机。

为 Windows 安装 Docker 并启用 Kubernetes

使用所有默认选项安装 Docker 应用程序并启用 Kubernetes

连接 kubectl

安装kubectl

启用入口

运行 这个命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

编辑:确保没有其他服务正在使用端口 80

重启你的机器。从 cmd 提示 运行 以管理员身份执行: net stop http 使用 services.msc

停止列出的服务

使用:netstat -a -n -o -b 并检查侦听端口 80 的其他进程。

创建部署

下面是使用 pods 的简单部署,它将回复请求:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      version: 2.0.0
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        version: 2.0.0
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

通过运行ning命令应用它:

$ kubectl apply -f file_name.yaml

创建服务

为了 pods 能够让您与他们沟通,您需要创建一个服务。

示例如下:

apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello
    version: 2.0.0
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 50001

通过 运行ning 命令应用此服务定义:

$ kubectl apply -f file_name.yaml

创建 Ingress 资源

下面是使用上面创建的服务的简单 Ingress 资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-ingress 
spec:
  rules:
  - host: kubernetes.docker.internal
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service 
          servicePort: http

看看:

spec:
  rules:
  - host: hello-test.internal 

hello-test.internal 将用作 hostname 连接到您的 pods。

通过调用命令应用您的 Ingress 资源:

$ kubectl apply -f file_name.yaml

将主机添加到本地主机文件

我发现这个 Github link 可以让您通过 hostname 连接到您的 Ingress 资源。

要实现这一点,请在 C:\Windows\System32\drivers\etc\hosts 文件中添加一行 127.0.0.1 hello-test.internal 并保存。 您将需要管理员权限才能执行此操作。

编辑: Windows 的最新版本 Docker Desktop 已经添加了一个主机文件条目: 127.0.0.1 kubernetes.docker.internal

测试

调用命令显示Ingress资源信息: kubectl get ingress

它应该显示:

NAME            HOSTS                 ADDRESS     PORTS   AGE
hello-ingress   hello-test.internal   localhost   80      6m2s

现在您可以通过打开网络浏览器并输入

来访问您的 Ingress 资源

http://kubernetes.docker.internal/

浏览器应该输出:

Hello, world!
Version: 2.0.0
Hostname: hello-84d554cbdf-2lr76

Hostname: hello-84d554cbdf-2lr76 是回复的 pod 的名称。

如果此解决方案不起作用,请使用以下命令检查连接: netstat -a -n -o具有管理员权限)如果某些东西未使用端口 80。