使用应用程序网关和 Istio 创建 AKS 专用集群

在现代应用程序架构中,安全性一直是一个非常关键的考虑因素。当我们谈论云原生应用程序架构时,人们往往会考虑很多安全性。这就是为什么所有的云提供商都有很多特性来让你的应用程序更加安全和健壮。例如,Azure 提供了各种网关,如网络安全组、应用程序网关、Azure 前门。这些 Azure 服务通过引入防火墙或验证 SSL 证书来提供安全连接。
人们说“安全是互联网上的一个神话
在应用程序部署策略的各种方式中,大多数组织已经采用或正在采用容器化他们的应用程序并在 Kubernetes 集群中运行。这种适应受到 Kubernetes 提供的特性和优势的影响。由于这种流行,所有云提供商也引入了托管 Kubernetes 集群。对于 Azure,它被称为 Azure Kubernetes 服务(又名 AKS)。
在本文中,我们将讨论如何使用 azure Kubernetes 服务和 azure 应用程序网关创建更安全的基础架构。它包含所有信息和详细说明,可让您的集群引导并开始为您的生产工作负载提供服务。让我们开始吧。
先决条件:
-
您应该在 Azure 中拥有有效的订阅和适当的访问权限才能创建 AKS 服务。从本质上讲,最好为 AKS 创建一个专用资源组,并且您应该拥有该资源组的所有者权限。
-
Azure私有DNS区的理解。
3、对Istio服务网格的理解。如果您不知道如何部署,请使用 Meshery (meshery.io),它将为您安装和配置服务网格。
-
应该了解 K8s 的各种概念,主要是 POD、Services、Deployment、Namespace、Ingress Controller 和 Ingress Gateway。应该安装 Helm 和 kubectl。
-
关于 CIDR 块的想法。
6.当然要安装azure-cli,并且有运行az命令的想法。
AKS 中的网络概念:
在进入配置之前,让我们了解 azure Kubernetes 集群中使用的网络概念,它可以简化我们设置私有集群的过程。 Azure 在 AKS 中提供了两种网络,即 kubenet 和 azure CNI。
Kubenet : 这是 AKS 集群使用的默认网络。默认情况下,这会处理幕后的所有网络。
笔记:
所有 AKS 节点都从 Azure 虚拟网络子网获取 IP 地址。 Pod 从逻辑上与节点的 Azure 虚拟网络子网不同的地址空间接收 IP 地址。然后配置网络地址转换 (NAT),以便 pod 可以访问 Azure 虚拟网络上的资源。
Azure CNI: 这也称为高级网络。如果您选择使用 CNI 路线,您必须做更多的功课,但美妙的是您可以按照自己的方式自定义网络。我们将在我们的上下文中使用 CNI。
笔记:
每个 pod 从子网中获取一个 IP 地址,并且可以直接访问。这些 IP 地址在您的网络空间中必须是唯一的,并且必须提前规划。每个节点都有一个配置参数,用于表示它支持的最大 pod 数。然后为该节点预先保留每个节点的同等数量的 IP 地址。您可以在集群创建时或创建新节点池时配置可部署到节点的最大 pod。如果您在创建新节点池时未指定 maxPods,则会收到 kubenet 的默认值 110。
知识产权规划
如前所述,Azure CNI 将所有真实 IP 分配给给定子网空间中的节点和 Pod,因此子网应该有足够的能力容纳这些 IP 范围
下面的计算解释了无 IP 的最低要求。
假设 :
-
我们正在创建一个 3 节点集群 - 意味着将从分配给 K8s 的子网中获取 3 个 IP。
-
默认情况下,每个节点最多可以有 30 个 Pod,即 30*3u003d90 个 IP 应该来自同一个子网。
-
从子网中,azure 保留 5 个 IP 地址供其内部使用。
-
滚动更新需要考虑一个额外的节点,它将占用 31 个 IP(默认情况下每个节点考虑 30 个 Pod)
注意:每个节点的最大 Pod 限制为 250
考虑到上述情况,我们要创建 K8s 集群的子网应该有 90+3+5+31u003d129 个 IP 因为我们的目的是创建 AKS 私有集群,让我们看看我们可以使用的私有地址空间.
提示: 下表显示了可供消费的私有地址范围

CIDR
让我们通过 Azure CNI 方法为 AKS 群集的各种网络要求设计我们的 CIDR。 Vnet CIDR:192.168.0.0/20 - 总共 4,096 个 IP(192.168.0.0 到 192.168.15.255) AKS 主子网 CIDR:192.168.0.0/21 - 总共 2043 个 IP (192.168.0.0 - 192.168.7.255)
Azure CNI 中使用的术语:
虚拟网络: 这是您要在其中创建 K8S 集群的虚拟网络。在这里,我将我的 Vnet 范围设为 192.168.0.0/20。
集群子网: 这是您的 K8S 集群将在其中创建的子网。请注意,您应该在创建 AKS 群集之前创建子网,并且它应该有足够的地址空间。本文档开头解释的地址空间要求。例如,我选择 192.168.0.0/21 范围作为集群的子网。
Kubernetes 服务地址范围: 这是 K8S 服务将使用的 CIDR 或 IP 范围。请注意,此 IP 范围不得属于您集群中的任何子网。简而言之,它应该与您的子网 IP 范围不同。请务必注意,此 IP 范围应在您的 VNET IP 范围内。例如,这个地址范围不能在 192.168.0.0/21 范围内,因为我的集群子网正在使用它,但它应该在 192.168.0.0/20 范围内。所以我选择 192.168.8.0/22(总共 1024 个 IP(192.168.8.0 - 192.168.11.255))
Kubernetes DNS 服务 IP 地址: 这是与您的 Kubernetes 服务地址范围不同的 IP 地址。请注意,这应该是您的 Kubernetes 服务地址范围的第一个和最后一个 IP 地址。例如,在 Kubernetes 服务地址范围是 192.168.8.0/22。 Kubernetes DNS 服务 IP 地址不能为 192.168.8.0 或 192.168.11.255。所以我选择192.168.8.8。
Docker Bridge 地址: 这是将用于 docker bridge 网络的地址范围。
要记住的几件事:
1、这个范围不应该在Kubernetes服务地址范围的范围内。在本例中为 192.168.8.0/22。
-
...0 或 ...255 格式匹配的地址被保留,不能使用。
-
前缀必须在 1 到 29 之间。
-
IP地址不能是其CIDR块中的第一个或最后一个地址在我的场景中,我选择192.168.12.2/28(总共16个IP(192.168.12.0 - 192.168.12.15)),满足上述所有条件。
DNS 名称前缀: 这是将为 Kubernetes 集群的 API 服务器解析的 DNS 名称。托管 AKS 群集和应用程序后,你将使用此 FQDN 访问 API 服务器。
什么是 Azure 应用程序网关?
Azure 应用程序网关是一个 Web 流量负载均衡器,使你能够管理 Web 应用程序的流量。这也提供了防火墙功能来保护您的应用程序的流量。下图来自 Microsoft 文档。

我们的解决方案架构图:

解释:
当用户请求网站时,它会到达您购买 DNS 的名称服务器(它可以是 azure 或任何第 3 方)。从名称服务器中,它找到 A 记录并定向到 Azure 应用程序网关的公共 IP。当请求到达应用程序网关时,它会验证 SSL 证书并运行防火墙规则。然后应用程序网关中的规则将其重定向到正确的后端。应用程序网关的后端池是 istio 入口网关。当我们正在构建一个完全私有的集群(意味着 AKS 集群中的所有 IP 都是私有 IP)时,我们使用 DNS 私有区域在我们的 VNET 中的所有 azure 服务之间实现可信连接。
付诸行动:
步骤 1. 在 centralindia 位置创建资源组名称 k8s-rg(确保先设置订阅(这里我使用的是名为 Azure 的订阅)
az account set --subscription “Azure”
az group create -l centralindia -n k8s-rg
步骤 2. 在上面创建的资源组中创建 vnet 和子网。
az network vnet create -g k8s-rg -n k8s-vnet --address-prefix 192.168.0.0/20 \
--subnet-name k8s-subnet --subnet-prefix 192.168.0.0/21
Note: I have used the CIDR that is discussed above. Please refer earlier section.
步骤 3. 现在让我们获取我们之前创建的子网的 ID
az network vnet subnet list \
--resource-group k8s-rg \
--vnet-name k8s-vnet \
--query "[0].id" --output tsv
您将获得以下输出,将其保存以供下一步使用
/subscriptions/<subscriptionID>/resourceGroups/rg-k8s/providers/Microsoft.Network/virtualNetworks/k8s-vnet/subnets/k8s-subnet
第 4 步。让我们创建我们的 AKS 集群:
az aks create \
--resource-group k8s-rg \
--name k8s-private \
--network-plugin azure \
--vnet-subnet-id /subscriptions/<subscriptionID>/resourceGroups/rg-k8s/providers/Microsoft.Network/virtualNetworks/k8s-vnet/subnets/k8s-subnet \
--docker-bridge-address 192.168.12.2/28 \
--dns-service-ip 192.168.8.8 \
--service-cidr 192.168.8.0/22 \
--generate-ssh-keys
步骤 5. 将节点池添加到 AKS 群集:
az aks nodepool add \
--cluster-name k8s-private \
--resource-group \
--name k8s-pool \
--vnet-subnet-id /subscriptions/<subscriptionID>/resourceGroups/rg-k8s/providers/Microsoft.Network/virtualNetworks/k8s-vnet/subnets/k8s-subnet
步骤 6. 连接到您的集群:
az aks get-credentials --resource-group k8s-rg --name k8s-private \
kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-k8s-pool-63828758-vmss000002 Ready agent 6d11h v1.19.11
现在 AKS 群集已准备就绪。
步骤 7. 通过 Meshery 安装 Istio。
Meshery is an open-source, service mesh management plane that enables the adoption, operation, and management of any service mesh and its workloads.
通过 Helm 安装 Meshery:meshery.io/#getting-started(点击 Helm 图标查看通过 helm 安装 meshery 的说明)
通过 meshey UI 安装 Istio:docs.meshery.io/service-meshes/adapters/istio
第 8 步:将入口网关设置为内部默认情况下,入口网关(在此上下文中为 Istio Ingress 网关)是面向互联网的,这意味着它们获得一个公共 IP。在这种情况下,我们正在创建一个私有集群,这意味着该集群只能在内部从 VNET 访问。为此,我们必须将 Ingress 网关 IP 设为私有 IP。这可以通过向我们的入口服务清单添加注释来完成。注释如下:
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
应用上述注释后,检查您的入口网关 IP 现在它是私有 IP:
kubectl get svc -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 192.168.9.186 192.168.3.193 15021:30305/TCP,80:32107/TCP,443:32436/TCP 6d10h
第 9 步:现在让我们创建一个 azure 私有 DNS 区域并为我们的 Istio Ingress 网关创建一个 CNAME。这样入口网关就可以通过天蓝色网络访问。有关 Azure 私有 DNS 的更多信息 (docs.microsoft.com/en-us/azure/dns/private-..)
az network private-dns zone create -g k8s-rg -n privatelink.centralindia.azmk8s.io
上面的私有 DNS 名称是 k8s 服务的天蓝色定义名称更多信息(docs.microsoft.com/en-us/azure/private-link..)
现在让我们为我们的 istio 入口网关添加一个A记录,以便它可以被 Azure 网络中的应用程序网关发现。
转到已创建的privatelink.centralindia.azmk8s.io私有 DNS 资源,然后单击记录集并添加A记录,如下所示并保存。

有了这个,我们已经成功地创建了一个集群并且它是私有的。现在它无法接收来自网络的任何请求。但这在天蓝色的内部网络中是可以发现的,因为我们已经设置了一个私有 DNS 区域。要启用来自 Internet 的请求,让我们创建一个应用程序网关。
步骤 10. 要创建应用程序网关,您需要先创建一个公共 IP:
az network public-ip create -g k8s-rg -n k8s-gw-pub-ip --allocation-method Static
第 11 步。让我们现在创建应用程序网关,并将后端池作为 Istio 入口网关。
az network application-gateway create \
--name k8s-app-gateway \
--location centralindia \
--resource-group k8s-rg \
--capacity 2 \
--sku Standard_v2 \
--public-ip-address k8s-gw-pub-ip \
--vnet-name k8s-vnet \
--subnet k8s-vnet \
--servers sdistiogw.privatelink.centralindia.azmk8s.io
有了这个,我们已经成功地创建了我们的 azure 应用程序网关,并且后端设置为 istio 入口网关。现在应用程序网关将能够将流量转发到 istio 入口网关,并从 Istio 网关获得响应。
学分:
-
Azure 文档
-
给他
-
网眼
-
里拉
我希望你喜欢这篇博文。请让我知道您对此的想法,并建议您是否希望我就特定主题进行写作。
干杯!!!
更多推荐
所有评论(0)