AWS Kubernetes集群与Pod安全组完全配置指南

本指南详细讲解如何在AWS EKS中实现Pod级别的安全组配置,涵盖集群创建、网络架构设计、CNI插件配置及安全策略实施,实现细粒度网络访问控制。

在AWS中创建Kubernetes集群并为Pod配置安全组[完整手册]

Amazon Elastic Kubernetes Service (EKS) Pod安全组是一项强大功能,可在Pod级别实现细粒度网络安全控制。本指南将引导您从初始集群设置到测试Pod级别安全组分配的完整实现过程。

传统EKS网络与Pod安全组架构

传统EKS网络

在标准EKS网络设置中,安全发生在节点级别而非Pod级别。每个EC2工作节点被分配一个安全组,该节点上运行的所有Pod都继承相同安全组设置。这意味着在同一节点上运行的十个不同应用程序共享相同的网络安全规则。

Pod安全组架构

此网络模型完全改变了这种范式。启用Pod安全组后,您可以根据Pod的特定需求为其分配专用安全组。某些Pod可以获得具有自定义安全组分配的自有弹性网络接口(ENI),而不是所有Pod都继承节点的安全组。

ENI本质上是AWS中的虚拟网卡。当我们将ENI分配给Pod时,该Pod获得与其运行节点分离的专用网络身份。

工作原理

当您通过SecurityGroupPolicy标记需要特殊安全组处理的Pod时,系统会自动为该Pod配置专用ENI。此ENI分配通过AWS VPC CNI的分支网络功能实现,该功能允许多个网络接口附加到单个EC2实例。

基础设施基础

IAM角色和策略设置

EKS集群服务角色

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
aws iam create-role \
  --role-name EKSClusterRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "eks.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

EKS集群附加角色策略

1
2
3
4
5
6
7
aws iam attach-role-policy \
  --role-name EKSClusterRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy

aws iam attach-role-policy \
  --role-name EKSClusterRole \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController

EKS节点组角色

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
aws iam create-role \
  --role-name EKSNodeGroupRole \
  --assume-role-policy-document '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "ec2.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }'

VPC和网络基础设施

VPC创建和配置

1
2
3
4
5
export VPC_ID=$(aws ec2 create-vpc \
  --cidr-block 10.0.0.0/16 \
  --name 'eks-security-demo'
  --query 'Vpc.VpcId' \
  --output text)

子网架构策略

创建四个子网 - 两个公共子网和两个私有子网,分布在两个不同的可用区:

1
2
3
4
5
6
7
# 公共子网用于NAT网关和负载均衡器
export PUBLIC_SUBNET_1=$(aws ec2 create-subnet \
  --vpc-id $VPC_ID \
  --cidr-block 10.0.1.0/24 \
  --availability-zone eu-west-1a \
  --query 'Subnet.SubnetId' \
  --output text)

EKS子网标记

1
2
3
4
aws ec2 create-tags \
  --resources $PUBLIC_SUBNET_1 $PUBLIC_SUBNET_2 \
  --tags Key=kubernetes.io/cluster/pod-security-cluster-demo,Value=shared \
         Key=kubernetes.io/role/elb,Value=1

EKS集群配置

EKS集群创建

1
2
3
4
5
6
aws eks create-cluster \
  --name pod-security-cluster-demo \
  --kubernetes-version 1.33 \
  --role-arn $CLUSTER_ROLE_ARN \
  --access-config authenticationMode=API_AND_CONFIG_MAP \
  --resources-vpc-config subnetIds=$PUBLIC_SUBNET_1,$PUBLIC_SUBNET_2,$PRIVATE_SUBNET_1,$PRIVATE_SUBNET_2

托管节点组设置

1
2
3
4
5
6
7
aws eks create-nodegroup \
  --cluster-name pod-security-cluster-demo \
  --nodegroup-name workers \
  --subnets $PRIVATE_SUBNET_1 $PRIVATE_SUBNET_2 \
  --node-role $NODE_ROLE_ARN \
  --instance-types m5.large \
  --scaling-config minSize=1,maxSize=3,desiredSize=2

安全组配置

Pod级别安全组创建

1
2
3
4
aws ec2 create-security-group \
   --description 'Pod Security Group - Database Access' \
   --group-name 'POD_SG' \
   --vpc-id ${VPC_ID}

数据库安全组配置

1
2
3
4
aws ec2 create-security-group \
   --description 'RDS Security Group - PostgreSQL Database' \
   --group-name 'RDS_SG' \
   --vpc-id ${VPC_ID}

服务间通信规则

1
2
3
4
5
6
# 允许具有POD_SG的Pod通过节点组解析DNS
aws ec2 authorize-security-group-ingress \
   --group-id ${NODE_GROUP_SG} \
   --protocol tcp \
   --port 53 \
   --source-group ${POD_SG}

CNI插件配置

启用Pod ENI支持

1
2
kubectl -n kube-system set env daemonset aws-node ENABLE_POD_ENI=true
kubectl -n kube-system rollout restart daemonset aws-node

安全策略实施

SecurityGroupPolicy资源创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
  name: allow-rds-access
  namespace: networking
spec:
  podSelector:
    matchLabels:
      app: green-pod
  securityGroups:
    groupIds:
      - ${POD_SG}

测试和验证

绿色Pod(授权数据库访问)

创建具有匹配标签的Pod,应成功连接到数据库:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: apps/v1
kind: Deployment
metadata:
  name: green-pod
  namespace: networking
  labels:
    app: green-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: green-pod
  template:
    metadata:
      labels:
        app: green-pod

红色Pod(未授权数据库访问)

创建没有匹配标签的Pod,应被阻止访问数据库:

1
2
3
4
5
6
7
apiVersion: apps/v1
kind: Deployment
metadata:
  name: red-pod
  namespace: networking
  labels:
    app: red-pod

清理和维护

Kubernetes资源清理

1
2
3
4
kubectl delete -f green-pod.yaml
kubectl delete -f red-pod.yaml
kubectl delete -f sg-per-pod-policy.yaml
kubectl delete namespace networking

EKS集群删除

1
2
3
4
5
aws eks delete-nodegroup \
  --cluster-name pod-security-cluster-demo \
  --nodegroup-name workers

aws eks delete-cluster --name pod-security-cluster-demo

本综合指南演示了如何在Amazon EKS中实现Pod安全组,在Pod级别提供细粒度网络安全控制。通过此架构,您可以强制执行应用程序级别的网络策略,即使在同一基础设施上运行,集群中的不同微服务也可以具有完全不同的网络访问模式。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计