如何通过Agent IP暴露容器并配置至Azure应用网关后端池
我之前刚好处理过几乎一模一样的场景,下面是我亲测有效的实现步骤,分为容器定向部署到指定Agent节点和Azure应用网关后端池配置两大部分:
要把容器精准部署到IP为10.0.0.4和10.0.0.5的Agent节点,我们可以通过Kubernetes的节点亲和性(nodeAffinity)来实现,这比nodeSelector更灵活,支持多节点匹配。
步骤1:给目标Agent节点添加自定义标签
首先给两个Agent节点打上便于识别的标签(也可以直接用节点原有标签,比如kubernetes.io/hostname,但自定义标签更直观):
# 给第一个Agent节点打标签 kubectl label nodes k8s-agentpool-75930632-0 custom-agent=10.0.0.4 # 给第二个Agent节点打标签 kubectl label nodes k8s-agentpool-75930632-1 custom-agent=10.0.0.5
步骤2:编写Deployment YAML并部署
创建一个app-deployment.yaml文件,通过nodeAffinity指定只部署到带有上述标签的节点:
apiVersion: apps/v1 kind: Deployment metadata: name: targeted-app-deployment spec: replicas: 2 # 对应两个Agent节点各部署一个实例 selector: matchLabels: app: my-targeted-app template: metadata: labels: app: my-targeted-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: custom-agent operator: In values: - 10.0.0.4 - 10.0.0.5 containers: - name: my-app-container image: your-docker-image:latest # 替换成你的容器镜像 ports: - containerPort: 80 # 替换成你的容器服务端口
执行部署命令:
kubectl apply -f app-deployment.yaml
验证部署结果
确认Pod是否运行在目标节点上:
kubectl get pods -o wide
查看输出的NODE列,应该显示两个Pod分别对应k8s-agentpool-75930632-0和k8s-agentpool-75930632-1。
要让应用网关能访问到Agent节点上的容器,我们需要先把容器端口暴露到节点层面,再把节点IP和端口添加到网关后端池。
方法1:用HostPort直接映射容器端口到节点
修改Deployment的容器配置,添加hostPort,直接把容器端口映射到Agent节点的端口:
containers: - name: my-app-container image: your-docker-image:latest ports: - containerPort: 80 hostPort: 8080 # 节点上的映射端口,可自定义
更新Deployment:
kubectl apply -f app-deployment.yaml
此时,你可以通过10.0.0.4:8080和10.0.0.5:8080直接访问节点上的容器。
方法2:用NodePort Service暴露容器(更推荐)
创建一个NodePort Service来暴露容器,这种方式更符合Kubernetes的最佳实践:
创建app-service.yaml:
apiVersion: v1 kind: Service metadata: name: my-app-nodeport-service spec: type: NodePort selector: app: my-targeted-app # 和Deployment的标签匹配 ports: - port: 80 # Service内部端口 targetPort: 80 # 容器端口 nodePort: 30000 # 可选:指定节点端口,不指定的话K8s会自动分配30000-32767之间的端口
部署Service:
kubectl apply -f app-service.yaml
查看分配的NodePort(如果没指定的话):
kubectl get service my-app-nodeport-service
输出中的PORT(S)列会显示80:xxxx/TCP,其中xxxx就是节点端口。
配置Azure应用网关后端池
- 登录Azure门户,找到你的应用网关资源。
- 进入后端池页面,点击添加。
- 在“添加后端池”界面:
- 输入后端池名称(比如
k8s-agent-backend-pool) - 选择“添加目标”,分别添加两个Agent节点的私有IP:
10.0.0.4和10.0.0.5 - 针对每个IP,设置对应的端口(方法1用8080,方法2用NodePort的端口)
- 输入后端池名称(比如
- 点击“保存”,等待应用网关配置同步完成。
额外:用Azure应用网关Ingress Controller(AGIC)自动化配置
如果你已经部署了AGIC,那么可以直接通过Ingress资源让AGIC自动配置网关后端池,无需手动操作门户:
创建app-ingress.yaml:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress annotations: kubernetes.io/ingress.class: azure/application-gateway spec: rules: - http: paths: - path: /my-app pathType: Prefix backend: service: name: my-app-nodeport-service port: number: 80
部署Ingress:
kubectl apply -f app-ingress.yaml
AGIC会自动识别Service对应的Agent节点IP和端口,同步到应用网关的后端池。
- 测试节点IP访问容器:
curl 10.0.0.4:8080 # 替换成你的端口 curl 10.0.0.5:8080
- 测试应用网关转发:
访问应用网关的公共IP或自定义域名,确认请求能正常转发到容器服务。
内容的提问来源于stack exchange,提问作者Navlesh

