带有 Istio 网关的 Azure Kubernetes 集群

问题描述 投票:0回答:1

如果这个问题太基本,我提前道歉,但我迷失了,无法找出最好的方法。

我有一个 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
。我的配置出了问题,我已经检查和调试了好几天了,但我看不出出了什么问题。
我想要实现什么?

我希望网关能够根据不同内部容器的路径路由流量。目前我只使用一个容器,但将来我想将其扩展到多个内部容器。

非常感谢您提供的任何帮助或澄清

azure-aks istio-gateway
1个回答
0
投票
kira1kira

的建议符合使用 Istio 部署应用程序的最佳实践。使用 mTLS 配置 Istio 网关,以安全地将外部流量路由到 AKS 集群中托管的 .NET 应用程序。 首先,确保集群中安装了 Istio。您可以在 azure 中设置集群时启用它,方法是在 azure 门户中启用 istio 内部和外部入口复选框,或者使用

502 Bad Gateway

(Istio 的官方安装工具)。

下载 istioctl 

istioctl

安装

curl -L https://istio.io/downloadIstio | sh - cd istio-*/ export PATH=$PWD/bin:$PATH

enter image description here确保没有冲突的入口控制器,即如果不需要 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

使用 PeerAuthentication 设置 mTLS

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

 应用所有这些文件

enter image description here您可以在网络浏览器中或使用

kubectl apply -f <filename.yaml>

导航至

https://<your-hostname.example.com>
。确保正确配置 DNS 以解析到 Istio Ingress Gateway 的外部 IP 地址。
    

© www.soinside.com 2019 - 2024. All rights reserved.