如何在 minikube 本地为 asp.net 核心应用程序的部署 yaml 文件配置 https?

How to configure https on deployment yaml file for asp.net core app locally in minikube?

我有一个 ASP.NET 核心应用程序,我想在我的本地 kubernetes clustur 中使用 minikube 配置 HTTPS。

部署yaml文件为:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-volume
  labels:
    app: kube-volume-app
spec:
  replicas: 1
  selector: 
    matchLabels:
      component: web
  template:
    metadata: 
      labels:
        component: web
    spec:
      containers:
        - name: ckubevolume
          image: kubevolume
          imagePullPolicy: Never
          ports:
            - containerPort: 80
            - containerPort: 443
          env:
            - name: ASPNETCORE_ENVIRONMENT
              value: Development
            - name: ASPNETCORE_URLS
              value: https://+:443;http://+:80
            - name: ASPNETCORE_HTTPS_PORT
              value: '443'
            - name: ASPNETCORE_Kestrel__Certificates__Default__Password
              value: mypass123
            - name: ASPNETCORE_Kestrel__Certificates__Default__Path
              value: /app/https/aspnetapp.pfx
          volumeMounts:
            - name: ssl
              mountPath: "/app/https"
      volumes:
        - name: ssl
          configMap:
            name: game-config

你可以看到我在yaml文件中为https添加了环境变量

我还为此部署创建了一个服务。服务的yaml文件为:

apiVersion: v1
kind: Service
metadata:
  name: service-1
spec:
  type: NodePort
  selector:
    component: web
  ports:
    - name: http
      protocol: TCP
      port: 100
      targetPort: 80
    - name: https
      protocol: TCP
      port: 200
      targetPort: 443

但不幸的是,当我 运行 minikube service service-1 命令时,应用程序没有被服务打开。

但是,当我删除 https 的 env 变量时,应用程序将由服务打开。这些是当我删除应用程序时打开的行:

- name: ASPNETCORE_URLS
  value: https://+:443;http://+:80
- name: ASPNETCORE_HTTPS_PORT
  value: '443'
- name: ASPNETCORE_Kestrel__Certificates__Default__Password
  value: mypass123
- name: ASPNETCORE_Kestrel__Certificates__Default__Path
  value: /app/https/aspnetapp.pfx

我还通过 shell 确认证书存在于 /app/https 文件夹中。

为什么我做错了?

我认为你的方法不太适合Kubernetes的架构。 TLS 证书(用于 https)与主机名耦合。

我会推荐两种不同方法中的一种:

  • 使用 type: LoadBalancer
  • 的服务公开您的应用
  • 使用 Ingress resource
  • 公开您的应用

使用 LoadBalancer 类型的服务公开您的应用程序

这通常称为网络负载均衡器,因为它直接为 TCP 或 UDP 公开您的应用程序。

请参阅 Minikube 文档中的 LoadBalancer access。但请注意,您的应用会从您的 LoadBalancer 获取外部地址,并且您的 TLS 证书可能必须匹配该地址。

使用 Ingress 资源公开您的应用程序

这是 Kubernetes 中最常见的微服务方法。除了 type: NodePort 的服务之外,您还需要为您的应用程序创建 Ingress resource

集群需要 Ingress 控制器,网关将处理您的 TLS 证书,而不是您的应用程序。

请参阅How to use custom TLS certificate with ingress addon了解如何在 Minikube 中配置 Ingress 和 TLS 证书。

我会推荐走这条路。