问题描述
想要了解在EKS集群中,”eksctl create iamserviceaccount”命令在底层做了什么操作。用户不想使用该命令,而是希望使用terraform来声明基础设施。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
“eksctl create iamserviceaccount”命令不仅仅是创建一个服务账号,它还执行了以下三个操作:
1. 创建一个IAM角色。
2. 将所需的IAM策略(–attach-policy-arn )附加到创建的IAM角色上。
3. 创建一个新的Kubernetes服务账号,并在其注释中添加创建的IAM角色的ARN。
现在,你可以使用terraform中的kubernetes和aws提供程序来声明上述步骤。以下是一个示例:
resource "aws_iam_role" "eks_service_account_role" {
name = "<AUTOSCALER_NAME>"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041:sub": "system:serviceaccount:kube-system:<AUTOSCALER_NAME>"
}
}
}
]
}
EOF
}
resource "aws_iam_policy_attachment" "eks_service_account_policy_attachment" {
name = "<AUTOSCALER_NAME>-policy-attachment"
roles = [aws_iam_role.eks_service_account_role.name]
policy_arn = "<POLICY_ARN>"
}
resource "kubernetes_service_account" "eks_service_account" {
metadata {
name = "<AUTOSCALER_NAME>"
namespace = "kube-system"
annotations = {
"eks.amazonaws.com/role-arn" = aws_iam_role.eks_service_account_role.arn
}
}
}
在上面的示例中,我们使用了terraform的aws和kubernetes提供程序来声明IAM角色、IAM策略附加和Kubernetes服务账号。你可以根据自己的需求进行相应的修改。
请注意,以上示例仅供参考,具体的配置取决于你的实际需求和环境。你需要根据自己的情况进行适当的调整和配置。
方案2
如果你不想使用terraform,你也可以手动创建相应的IAM角色、IAM策略附加和Kubernetes服务账号。以下是手动创建的步骤:
1. 创建一个IAM角色,并将其与所需的IAM策略进行关联。
2. 创建一个Kubernetes服务账号,并在其注释中添加创建的IAM角色的ARN。
请注意,手动创建需要更多的操作和配置,并且容易出错。因此,建议使用terraform或其他自动化工具来管理基础设施。
以上是关于”eksctl create iamserviceaccount”命令在EKS集群中的底层操作的解决方案。根据你的需求和偏好,选择适合你的方法来声明基础设施。