使用 Terraform 创建的 Kubernetes 服务帐户导致“文档丢失路径:“/spec/volumes/0””副本集错误

Awe*_*own 3 amazon-web-services kubernetes terraform amazon-eks

我正在尝试使用关联的 ServiceAccount 创建 Kubernetes 部署,该 ServiceAccount链接到 AWS IAM 角色。此 yaml 产生所需的结果,并且相关的部署(包含在底部)正确旋转:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: service-account
  namespace: example
  annotations:
    eks.amazonaws.com/role-arn: ROLE_ARN
Run Code Online (Sandbox Code Playgroud)

但是,我想改用 Terraform Kubernetes 提供程序来创建 ServiceAccount:

resource "kubernetes_service_account" "this" {
  metadata {
    name = "service-account2"
    namespace = "example"
    annotations = {
      "eks.amazonaws.com/role-arn" = "ROLE_ARN"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我以这种方式创建 ServiceAccount 时,我的部署的 ReplicaSet 失败并显示错误:

Error creating: Internal error occurred: Internal error occurred: jsonpatch add operation does not apply: doc is missing path: "/spec/volumes/0"
Run Code Online (Sandbox Code Playgroud)

我已经确认,部署是通过 Terraform 创建还是通过kubectl; 它不适用于 Terraform-created service-account2,但适用于kubectl-created service-account。在部署之间来回切换service-accountservice-account2相应地使其按预期工作或不工作。

我也确定eks.amazonaws.com/role-arn是相关的;创建/分配不尝试链接回 IAM 角色的 ServiceAccounts 有效,无论它们是通过 Terraform 还是kubectl.

使用kubectl来描述 Deployment、ReplicaSet、ServiceAccount 和相关的 Secret,我没有看到任何明显的区别,尽管我承认我不完全确定我可能在寻找什么。

这是一个展示问题的简单部署 yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: example
  namespace: example
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: example
    spec:
      serviceAccountName: service-account # or "service-account2"
      containers:
      - name: nginx
        image: nginx:1.7.8
Run Code Online (Sandbox Code Playgroud)

小智 7

添加automountServiceAccountToken: true到部署中的 pod 规范应该可以修复此错误。这通常在服务帐户上默认启用,但 Terraform 将其默认为关闭。在将所需的环境变量添加到 pod 的 mutating web hook 上查看此问题:https : //github.com/aws/amazon-eks-pod-identity-webhook/issues/17