在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级别提供细粒度网络安全控制。通过此架构,您可以强制执行应用程序级别的网络策略,即使在同一基础设施上运行,集群中的不同微服务也可以具有完全不同的网络访问模式。