Docker 桌面 + k8s 加上 https 代理多个外部端口到部署中的 http 上的 pod?

Jam*_*ock 1 kubernetes kubernetes-ingress docker-desktop

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

该文档令人麻木地复杂,因为它看起来应该是直截了当的。我可以让 pod 运行,我可以使用 kubectl port-forward 并且它们工作正常,但是我无法弄清楚如何以有意义的方式使用 ha-proxy 或 nginx 或其他任何东西来使用 ingress。

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

谢谢!

OhH*_*ark 6

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


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

重现步骤

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

启用Hyper-V

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

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

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

安装 Docker for Windows 并启用 Kubernetes

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

连接 kubectl

安装kubectl

启用入口

运行此命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
Run Code Online (Sandbox Code Playgroud)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml
Run Code Online (Sandbox Code Playgroud)

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

重新启动您的机器。从cmd以管理员身份运行的提示中,执行: net stop http 停止列出的服务使用services.msc

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

创建部署

下面是使用 pod 进行简单部署,这些 pod 将回复请求:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
Run Code Online (Sandbox Code Playgroud)

通过运行命令应用它:

$ kubectl apply -f file_name.yaml

创建服务

为了让 Pod 能够与它们通信,您需要创建一个服务。

下面的例子:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml
Run Code Online (Sandbox Code Playgroud)

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

$ kubectl apply -f file_name.yaml

创建入口资源

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

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"
Run Code Online (Sandbox Code Playgroud)

看一眼:

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
Run Code Online (Sandbox Code Playgroud)

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

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

$ kubectl apply -f file_name.yaml

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

我找到了这个Github 链接,它允许您通过hostname.

为此,127.0.0.1 hello-test.internalC:\Windows\System32\drivers\etc\hosts文件中添加一行并保存。您将需要管理员权限才能执行此操作。

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

测试

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

它应该显示:

NAME            HOSTS                 ADDRESS     PORTS   AGE
hello-ingress   hello-test.internal   localhost   80      6m2s
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过打开 Web 浏览器并键入来访问您的 Ingress 资源

http://kubernetes.docker.internal/

浏览器应该输出:

Hello, world!
Version: 2.0.0
Hostname: hello-84d554cbdf-2lr76
Run Code Online (Sandbox Code Playgroud)

Hostname: hello-84d554cbdf-2lr76 是响应的 pod 的名称。

:如果此解决方案不工作与命令请检查连接 netstat -a -n -o使用管理员权限,如果事情没有使用端口80)。