【问题标题】:How to configure https on deployment yaml file for asp.net core app locally in minikube?如何在 minikube 本地为 asp.net 核心应用程序的部署 yaml 文件配置 https?
【发布时间】:2021-06-24 15:16:31
【问题描述】:

我有一个 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-core kubernetes asp.net-core-mvc kubectl minikube


    【解决方案1】:

    我认为您的方法不适合 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 证书。

    我建议走这条路。

    【讨论】:

    • 感谢您的精彩回答。我有一个问题,即使在使用 Ingress 时,我仍然必须使用环境变量来配置我的应用程序上的 HTTPS 端口。但就我而言,它们似乎不起作用。您认为这里可能存在什么问题?
    • 不,当使用 Ingress 时,HTTPS 连接在网关中终止。从网关到集群内的应用程序,仅使用 HTTP,因此该应用程序不需要任何证书 - 只需要网关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-10-19
    • 2018-02-12
    相关资源
    最近更新 更多