如果这个问题太基本,我提前道歉,但我迷失了,无法找出最好的方法。
我有一个 Azure kubernetes 集群,运行一个带有集群 IP 的简单 DotNet 应用程序。 该应用程序现在只能在集群内部访问,这是完美的。我想向前迈出一步,让 Istio 网关通过端口 443 将外部流量路由到该容器并启用 mTLS。
所以我部署了以下资源:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: api-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "my-hostname"
tls:
mode: MUTUAL
credentialName: my-hostname-secret
入口服务:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: istio-gateway-ingress-service
namespace: default
annotations:
kubernetes.io/ingress.className: "nginx"
cert-manager.io/cluster-issuer: letsencrypt
spec:
ingressClassName: "nginx"
rules:
- host: my-hostname
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: istio-ingressgateway
port:
number: 80
tls:
- hosts:
- my-hostname
secretName: my-hostname-secret
虚拟服务:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: api-management
spec:
hosts:
- 'my-hostname'
gateways:
- api-gateway
http:
- match:
- uri:
prefix: '/'
route:
- destination:
host: internal-container-loadbalancer
port:
number: 8080
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: internal-container
spec:
host: internal-container-loadbalancer
subsets:
- name: internal-container
labels:
app: internal-container
最后:对等身份验证
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
入口服务正在使用 LetsEncrypt 生成 TLS 证书和密钥。我在 kubernetes 下有那些,一切都很好。但是当我尝试访问
secrets/tls
时,我得到了 my-hostname
。我的配置出了问题,我已经检查和调试了好几天了,但我看不出出了什么问题。我想要实现什么?
我希望网关能够根据不同内部容器的路径路由流量。目前我只使用一个容器,但将来我想将其扩展到多个内部容器。
非常感谢您提供的任何帮助或澄清
的建议符合使用 Istio 部署应用程序的最佳实践。使用 mTLS 配置 Istio 网关,以安全地将外部流量路由到 AKS 集群中托管的 .NET 应用程序。 首先,确保集群中安装了 Istio。您可以在 azure 中设置集群时启用它,方法是在 azure 门户中启用 istio 内部和外部入口复选框,或者使用
502 Bad Gateway
(Istio 的官方安装工具)。
下载 istioctlistioctl
安装
curl -L https://istio.io/downloadIstio | sh -
cd istio-*/
export PATH=$PWD/bin:$PATH
确保没有冲突的入口控制器,即如果不需要 Nginx,请考虑删除或禁用 Nginx 入口控制器以防止流量管理中出现任何重叠。
接下来,确保您的部署配置为 sidecar 注入,并部署您的 .NET 应用程序及其服务。
示例
部署
istioctl install --set profile=demo -y
apiVersion: apps/v1
kind: Deployment
metadata:
name: dotnet-app
namespace: default
spec:
selector:
matchLabels:
app: dotnet-app
replicas: 1
template:
metadata:
labels:
app: dotnet-app
spec:
containers:
- name: dotnet-app
image: mcr.microsoft.com/dotnet/samples:aspnetapp
ports:
- containerPort: 80
现在您的应用程序已部署,设置 Istio 的网关、VirtualService 和 DestinationRule 来处理流量,即配置Gateway
apiVersion: v1
kind: Service
metadata:
name: dotnet-service
namespace: default
spec:
selector:
app: dotnet-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: dotnet-gateway
namespace: default
spec:
selector:
istio: ingressgateway-external-asm-1-20 # Adjust the selector to target the specific Istio ingress gateway you have
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "my-hostname.example.com"
tls:
mode: MUTUAL
credentialName: my-hostname-secret # Make sure the secret exists and is valid
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: dotnet-virtualservice
namespace: default
spec:
hosts:
- "my-hostname.example.com"
gateways:
- dotnet-gateway
http:
- match:
- uri:
prefix: "/"
route:
- destination:
host: dotnet-service
port:
number: 8080
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: dotnet-destination
namespace: default
spec:
host: dotnet-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
使用
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
应用所有这些文件
您可以在网络浏览器中或使用
kubectl apply -f <filename.yaml>
导航至
https://<your-hostname.example.com>
。确保正确配置 DNS 以解析到 Istio Ingress Gateway 的外部 IP 地址。