我尝试在EKS集群上启动的Fargate pod上设置安全组
首先
据下述链接所述,似乎已经可以对Fargate pod进行安全组配置。
https://docs.aws.amazon.com/eks/latest/userguide/security-groups-for-pods.html
我已经实际设置并确认了其运行。
验证方法
我在EKS集群上启动了两个Nginx的Pod,并对在应用安全组之前和之后的通信进行了比较。
-
- AWSのセキュリティグループについて
インバウンド:設定なし(全通信遮断)
アウトバウンド:すべて許可
豆荚信息
用于启动 Pod 的 manifest 文件的信息如下。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
labels:
name: nginx1
app: nginx1
spec:
replicas: 1
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx
image: nginx:1.19.2
ports:
- containerPort: 80
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
labels:
name: nginx2
app: nginx2
spec:
replicas: 1
selector:
matchLabels:
app: nginx2
template:
metadata:
labels:
app: nginx2
spec:
containers:
- name: nginx
image: nginx:1.19.2
ports:
- containerPort: 80
使用上述的manifest文件来启动pod。
$ kubectl apply -f nginx1.yaml -f nginx2.yaml
deployment.apps/nginx1 created
deployment.apps/nginx2 created
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1-6b86d9bbbf-2q67v 1/1 Running 0 117s 10.2.45.218 fargate-ip-10-2-45-218.ap-northeast-1.compute.internal <none> <none>
nginx2-6775f69cc6-fvxpd 1/1 Running 0 117s 10.2.62.78 fargate-ip-10-2-62-78.ap-northeast-1.compute.internal <none> <none>
你启动了。
为了确认通信,将使用curl通过nginx1向nginx2发送请求。
$ kubectl exec -it nginx1-6b86d9bbbf-2q67v -- curl 10.2.62.78
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
我也会检查nginx1。
$ kubectl exec -it nginx2-6775f69cc6-fvxpd -- curl 10.2.45.218
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
将安全组设置应用于 Pod
接下来,我们将应用以下清单来为Pod设置安全组。
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: security-policy-test
namespace: default
spec:
podSelector:
matchLabels:
role: nginx2 ★label名は例なのでroleである必要はないです。
securityGroups:
groupIds:
- sg-xxxxxxxx
在.spec.template.metadata.labels中添加role: nginx2,并重新执行apply操作。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
labels:
name: nginx2
app: nginx2
spec:
replicas: 1
selector:
matchLabels:
app: nginx2
template:
metadata:
labels:
app: nginx2
role: ngin2 ★追記
spec:
containers:
- name: nginx
image: nginx:1.19.2
ports:
- containerPort: 80
申请。
$ kubectl apply -f sg-policy.yaml
securitygrouppolicy.vpcresources.k8s.aws/security-policy-test created
$ kubectl get sgp
NAME SECURITY-GROUP-IDS
security-policy-test ["sg-xxxxxxxx"]
$ kubectl apply -f nginx2.yaml
deployment.apps/nginx2 created
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1-6b86d9bbbf-2q67v 1/1 Running 0 117s 10.2.45.218 fargate-ip-10-2-45-218.ap-northeast-1.compute.internal <none> <none>
nginx2-7d68c8456-4lbmr 1/1 Running 0 117s 10.2.36.251 fargate-ip-10-2-36-251.ap-northeast-1.compute.internal <none> <none>
确认动作
再次对nginx1执行curl命令,将其转发至nginx2。
kubectl exec -it nginx1-6b86d9bbbf-2q67v -- curl 10.2.36.251
curl: (7) Failed to connect to 10.2.36.251 port 80: Connection timed out
在带有标签nginx2的nginx2 pod上应用了安全组,这样会出现安全组的设置。安全组的入站规则未进行任何设置,拒绝所有通信,因此通信超时!
修改nginx2的manifest标签。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx2
labels:
name: nginx2
app: nginx2
spec:
replicas: 1
selector:
matchLabels:
app: nginx2
template:
metadata:
labels:
app: nginx2
role: nginx ★修正
spec:
containers:
- name: nginx
image: nginx:1.19.2
ports:
- containerPort: 80
再次申请并执行curl命令,从nginx1切换至nginx2。
$ kubectl apply -f nginx2.yaml
deployment.apps/nginx2 created
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1-6b86d9bbbf-2q67v 1/1 Running 0 125m 10.2.45.218 fargate-ip-10-2-45-218.ap-northeast-1.compute.internal <none> <none>
nginx2-7d68c8456-t72zn 1/1 Running 0 4m11s 10.2.63.222 fargate-ip-10-2-63-222.ap-northeast-1.compute.internal <none> <none>
$ kubectl exec -it nginx1-6b86d9bbbf-2q67v -- curl 10.2.63.222
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
通过修改标签名称,导致nginx2的Pod不再应用安全组规则,从而使通信重新变得可行!