在我们使用EKS集群的时候,Pod默认继承Node上绑定的角色的身份,这样会使得我们不同的pod都拥有相同的身份,不利于我们管理权限。现在我们可以将IAM Role指定给Pod,提供了更精细化的权限控制,加强了安全性
创建身份提供商
EKS创建好之后,在详细信息界面,有一个OpenID Connect 提供商 URL,复制此内容:
转到IAM界面,点击身份提供商
创建身份提供商,选择OpenID Connect,将复制的URL填写进去,点击验证指纹,受众填写sts.amazonaws.com
创建一个角色
点击创建角色,选择Web身份,身份提供商选择我们刚刚创建的,受众选择sts.amazonaws.com
策略可暂时不选,最后取个名称即可;点击信任关系,编辑信任关系。
将类似:
"oidc.eks.us-west-2.amazonaws.com/id/xxxxxxxxxxxx:aud": "sts.amazonaws.com"
修改为:
"oidc.eks.us-west-2.amazonaws.com/id/xxxxxxxxxxxx:sub": "system:serviceaccount: SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
上述图片配置内容代表该角色会讲权限映射到EKS集群的Default命令空间下的名为test-sa的ServiceAccount
创建ServiceAccount
ServiceAccount的yaml文件如下,在Annotations中指定我们上一步创建的角色的arn:
创建Pod
我们先创建一个没有使用ServiceAccount的Pod
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "4"
labels:
app: alpine
name: alpine-deployment
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: alpine
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: alpine
spec:
containers:
- args:
- apk update;apk add curl;apk add busybox-extras;apk add tcpdump;apk add aws-cli;apk
add py3-pip;pip install boto3;while true; do sleep 30; done;
command:
- /bin/sh
- -c
- --
image: alpine
imagePullPolicy: Always
name: alpine
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
terminationGracePeriodSeconds: 30
此时默认继承的是Node的role
复制此yaml文件,在其添加一行ServiceAccount,指定我们上一步创建的ServiceAccount
进入该容器,此时可以看到其身份已经为我们指定的Role