配置 Azure DevOps 代理的 Kubernetes 网络策略

在 Azure DevOps 中运行的自托管代理通常需要访问 Kubernetes 集群以执行构建、部署等任务。为确保安全,可以通过网络策略限制代理的访问权限。

确认 Azure DevOps 代理的 IP 或 Pod 标签

确保 Kubernetes 集群已启用网络策略支持(如 Calico、Cilium 或其他 CNI 插件)。识别 Azure DevOps 代理的以下信息:

  • Pod 标签(如果代理运行在 Kubernetes 集群内)
  • 外部 IP(如果代理运行在集群外)

示例 YAML 片段,用于代理 Pod 标签识别:

metadata:
  labels:
    app: azure-devops-agent

创建 NetworkPolicy 限制入口流量

允许特定代理访问 Kubernetes API 或特定服务。以下策略示例仅允许带有 app: azure-devops-agent 标签的 Pod 访问特定命名空间内服务:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-devops-agent
  namespace: target-namespace
spec:
  podSelector:
    matchLabels: {}  # 目标 Pod(空表示所有 Pod)
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: azure-devops-agent
    ports:
    - protocol: TCP
      port: 80
    - protocol: TCP
      port: 443

允许出口流量到关键服务

确保代理可以访问 Azure DevOps 服务和依赖的容器仓库(如 ACR、Docker Hub)。以下策略允许代理访问外部 HTTPS 服务:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-devops-agent-egress
spec:
  podSelector:
    matchLabels:
      app: azure-devops-agent
  egress:
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: TCP
      port: 443
    - protocol: TCP
      port: 80

验证策略生效

使用 kubectl 检查策略状态并测试代理连接:

kubectl get networkpolicy -n target-namespace
kubectl describe networkpolicy allow-devops-agent -n target-namespace

在代理 Pod 内执行测试:

kubectl exec -it <agent-pod> -- curl -v http://<target-service>

高级策略:限制访问特定命名空间

若需进一步隔离,限制代理仅能访问特定命名空间:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-devops-agent-namespace
spec:
  podSelector:
    matchLabels:
      app: azure-devops-agent
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: allowed-namespace

通过以上步骤,可以确保 Azure DevOps 代理在 Kubernetes 环境中仅具备必要的网络访问权限,同时满足安全合规要求。

更多推荐