我需要托管在 AKS 中的 API 在端口 80 和 443 中响应。在端口 80 中,因为我当前的一些客户端正在使用“硬编码”端口 80,并且他们的 HttpClient 不遵循重定向...
我的第一次尝试是:
apiVersion: v1
kind: Service
metadata:
name: myApp-service
namespace: myAppe-main
labels:
app: myApp-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: myApp-deploy
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myApp-ingress
namespace: myApp-main
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: H2C
nginx.ingress.kubernetes.io/secure-backends: 'true'
nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
spec:
rules:
- host: myApp.MyInternalDns.net
http:
paths:
- backend:
service:
name: myApp-service
port:
number: 80
path: /
pathType: Prefix
https:
paths:
- backend:
service:
name: myApp-service
port:
number: 443
path: /
pathType: Prefix
虽然 AKS 接受这个 yaml,但它会砍掉其中的
https
部分...
如何让入口打开两个端口并使其在 http 和 https 上运行?
要在 AKS 中设置在 HTTP(端口 80)和 HTTPS(端口 443)上响应的 Nginx Ingress 控制器,并将流量正确路由到您的服务,您需要配置 Ingress 资源和关联的服务。您的 YAML 中可能存在错误或配置错误,尤其是 Ingress 规范下的
https
规则,这不是直接位于 rules
下的有效字段。
确保 AKS 集群中安装了 Nginx Ingress Controller。如果尚未安装
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace ingress-basic --create-namespace
配置您的部署和服务
示例(替换为您自己的部署文件)-
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
selector:
matchLabels:
app: myapp
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginxdemos/hello
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: default
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 80
name: http
现在设置 Ingress 来处理 HTTP 和 HTTPS。 相应地配置您的 Ingress 资源,即您需要定义 TLS 设置以支持 HTTPS。如果您的服务需要直接支持 HTTPS(而不仅仅是在入口处终止),请确保 Pod 内的应用程序配置为 HTTPS 并侦听端口 443。在大多数情况下,您将在入口处终止 SSL 并将流量作为 HTTP 转发到你的 pod。 示例-
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
namespace: default
spec:
ingressClassName: "nginx"
tls:
- hosts:
- "myapp.example.com"
secretName: myapp-tls
rules:
- host: "myapp.example.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
如果您尚未创建 TLS 密钥并使用自签名证书进行测试,那么
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout myapp.key -out myapp.crt -subj "/CN=myapp.example.com/O=myapp"
kubectl create secret tls myapp-tls --key myapp.key --cert myapp.crt -n default
完毕。您可以按以下方式验证
kubectl get ingress -n default
参考资料: