Я создал кластер Kubernetes в Azure, используя следующий Terraform. Как вы ясно видите, я передал идентификатор AppGateway в ingress_application_gateway.
# Create the Azure Kubernetes Service (AKS) Cluster
resource "azurerm_kubernetes_cluster" "kubernetes_cluster" {
count = var.enable_kubernetes == true ? 1 : 0
name = "aks-prjx-${var.subscription_type}-${var.environment}-${var.location}-${var.instance_number}"
location = var.location
resource_group_name = module.resource_group_kubernetes_cluster[0].name # "rg-aks-spoke-dev-westus3-001"
dns_prefix = "dns-aks-prjx-${var.subscription_type}-${var.environment}-${var.location}-${var.instance_number}" #"dns-prjxcluster"
private_cluster_enabled = false
local_account_disabled = true
default_node_pool {
name = "npprjx${var.subscription_type}" #"prjxsyspool" # NOTE: "name must start with a lowercase letter, have max length of 12, and only have characters a-z0-9."
vm_size = "Standard_B8ms"
vnet_subnet_id = data.azurerm_subnet.aks-subnet.id
# zones = ["1", "2", "3"]
enable_auto_scaling = true
max_count = 3
min_count = 1
# node_count = 3
os_disk_size_gb = 50
type = "VirtualMachineScaleSets"
enable_node_public_ip = false
enable_host_encryption = false
node_labels = {
"node_pool_type" = "npprjx${var.subscription_type}"
"node_pool_os" = "linux"
"environment" = "${var.environment}"
"app" = "prjx_${var.subscription_type}_app"
}
tags = var.tags
}
ingress_application_gateway {
gateway_id = azurerm_application_gateway.network.id
}
# Enabled the cluster configuration to the Azure kubernets with RBAC
azure_active_directory_role_based_access_control {
managed = true
admin_group_object_ids = var.active_directory_role_based_access_control_admin_group_object_ids
azure_rbac_enabled = true #false
}
network_profile {
network_plugin = "azure"
network_policy = "azure"
outbound_type = "userDefinedRouting"
}
identity {
type = "SystemAssigned"
}
oms_agent {
log_analytics_workspace_id = module.log_analytics_workspace[0].id
}
timeouts {
create = "20m"
delete = "20m"
}
depends_on = [
azurerm_application_gateway.network
]
}
Я думал, что AppGateway будет использоваться как Ingress Gateway. Однако AKS создает балансировщик нагрузки Azure при попытке развернуть службу, как указано ниже.
apiVersion: v1
kind: Service
metadata:
name: aks-helloworld
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: aks-helloworld-two
Есть ли причина, по которой этот Load Balancer и AppGateway не используются? Я бы предположил, что балансировщик нагрузки используется для типа LoadBalancer, а App Gateway — для Ingress.
Я попытался воспроизвести то же самое в своей среде, чтобы создать службу с контроллером входа шлюза приложений:
Поскольку вы упомянули тип службы: балансировщик нагрузки в файле yaml, он создает службу балансировки нагрузки, Чтобы создать службу с контроллером входящего трафика Шлюза приложений без связанного балансировщика нагрузки, выполните следующие действия.
1. Во-первых, вам нужно создать развертывание для вашего приложения с нужными репликами и нужным образом.
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-app
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: test-app
labels:
app: nginx
spec:
containers:
- name: nginx
image: "nginx:latest"
ports:
- containerPort: 80
cmd для проверки развернутого приложения kubectl get deploy
2 Затем вы можете создать службу для своего приложения с типом: ClusterIP.
Примечание: если вы создаете тип сервиса:LoadBalancer для своего приложения. Эта служба будет создана с помощью Load Balancer.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
protocol: TCP
Служба создана с типом: ClusterIP.
cmd для проверки сервиса: kubectl get svc
.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginxapp
annotations:
kubernetes.io/ingress.class: azure/application-gateway
spec:
rules:
- http:
paths:
- pathType: Exact
path: /
backend:
service:
name: nginx-service
port:
number: 80
Вход успешно создан.
Приложение успешно работает с общедоступным IP-адресом шлюза приложений.