如何在 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 证书。
我会推荐走这条路。
我有一个 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 证书。
我会推荐走这条路。