首页 > 解决方案 > 如何在 minikube 本地为 asp.net 核心应用程序的部署 yaml 文件配置 https?

问题描述

我有一个 ASP.NET Core 应用程序,我想在本地 kubernetes 集群中使用 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 文件夹中。

为什么我做错了?

标签: asp.net-corekubernetesasp.net-core-mvckubectlminikube

解决方案


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

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

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

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

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

使用 Ingress 资源公开您的应用

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

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

有关如何在 Minikube 中配置 Ingress 和 TLS 证书,请参阅如何将自定义 TLS 证书与 ingress 插件一起使用。

我建议走这条路线。


推荐阅读