asp.net-core - 如何在 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 文件夹中。
为什么我做错了?
解决方案
我认为您的方法不适合 Kubernetes 的架构。TLS 证书(用于 https)与主机名耦合。
我会推荐两种不同的方法之一:
- 使用 Service 公开您的应用程序
type: LoadBalancer
- 使用Ingress 资源公开您的应用
使用 LoadBalancer 类型的服务公开您的应用程序
这通常称为网络负载平衡器,因为它直接向 TCP 或 UDP 公开您的应用程序。
请参阅Minikube 文档中的LoadBalancer 访问。但请注意,您的应用会从您的 LoadBalancer 获取外部地址,并且您的 TLS 证书可能必须与之匹配。
使用 Ingress 资源公开您的应用
这是 Kubernetes 中微服务最常用的方法。除了您的 Service 之外,type: NodePort
您还需要为您的应用程序创建一个Ingress 资源。
集群需要一个 Ingress 控制器,网关将处理您的 TLS 证书,而不是您的应用程序。
有关如何在 Minikube 中配置 Ingress 和 TLS 证书,请参阅如何将自定义 TLS 证书与 ingress 插件一起使用。
我建议走这条路线。