AWS EKS terraform 教程(带 assumeRole)- k8s 仪表板错误

AWS EKS terraform tutorial (with assumeRole) - k8s dashboard error

我遵循了 https://learn.hashicorp.com/tutorials/terraform/eks 上的教程。 对于具有 https://github.com/terraform-aws-modules/terraform-aws-eks/blob/master/docs/iam-permissions.md

中指定的所需权限的单个 IAM 用户,一切 工作正常

但是当我尝试 assumeRolecross AWSAccount 情景 I 运行 进入 errors/failures.

我按照第 5 步开始 kubectl proxy

但是,当我尝试在 http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问 k8s 仪表板时(完成步骤 1-5 后),我收到如下错误消息 -

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "no endpoints available for service \"kubernetes-dashboard\"",
  "reason": "ServiceUnavailable",
  "code": 503
}

我还在 第 3 步中得到了 zero pods 处于 READY 状态的度量服务器部署 教程 -

$ kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
metrics-server   0/1     1            0           21m

我的 kube dns 也有 zero pods 处于 READY 状态,状态为 -

kubectl -n kube-system -l=k8s-app=kube-dns get pod
NAME                       READY   STATUS    RESTARTS   AGE
coredns-55cbf8d6c5-5h8md   0/1     Pending   0          10m
coredns-55cbf8d6c5-n7wp8   0/1     Pending   0          10m

我的terraform version信息如下-

$ terraform version
2021/03/06 21:18:18 [WARN] Log levels other than TRACE are currently unreliable, and are supported only for backward compatibility.
  Use TF_LOG=TRACE to see Terraform's internal logs.
  ----
2021/03/06 21:18:18 [INFO] Terraform version: 0.14.7  
2021/03/06 21:18:18 [INFO] Go runtime version: go1.15.6
2021/03/06 21:18:18 [INFO] CLI args: []string{"/usr/local/bin/terraform", "version"}
2021/03/06 21:18:18 [DEBUG] Attempting to open CLI config file: /Users/user1/.terraformrc
2021/03/06 21:18:18 [DEBUG] File doesn't exist, but doesn't need to. Ignoring.
2021/03/06 21:18:18 [DEBUG] ignoring non-existing provider search directory terraform.d/plugins
2021/03/06 21:18:18 [DEBUG] ignoring non-existing provider search directory /Users/user1/.terraform.d/plugins
2021/03/06 21:18:18 [DEBUG] ignoring non-existing provider search directory /Users/user1/Library/Application Support/io.terraform/plugins
2021/03/06 21:18:18 [DEBUG] ignoring non-existing provider search directory /Library/Application Support/io.terraform/plugins
2021/03/06 21:18:18 [INFO] CLI command args: []string{"version"}
Terraform v0.14.7
+ provider registry.terraform.io/hashicorp/aws v3.31.0
+ provider registry.terraform.io/hashicorp/kubernetes v2.0.2
+ provider registry.terraform.io/hashicorp/local v2.0.0
+ provider registry.terraform.io/hashicorp/null v3.0.0
+ provider registry.terraform.io/hashicorp/random v3.0.0
+ provider registry.terraform.io/hashicorp/template v2.2.0

kube-system ns 的 describe pods 的输出是 -

$ kubectl describe pods -n kube-system
Name:               coredns-7dcf49c5dd-kffzw
Namespace:          kube-system
Priority:           2000000000
PriorityClassName:  system-cluster-critical
Node:               <none>
Labels:             eks.amazonaws.com/component=coredns
                    k8s-app=kube-dns
                    pod-template-hash=7dcf49c5dd
Annotations:        eks.amazonaws.com/compute-type: ec2
                    kubernetes.io/psp: eks.privileged
Status:             Pending
IP:                 
Controlled By:      ReplicaSet/coredns-7dcf49c5dd
Containers:
  coredns:
    Image:       602401143452.dkr.ecr.ca-central-1.amazonaws.com/eks/coredns:v1.8.0-eksbuild.1
    Ports:       53/UDP, 53/TCP, 9153/TCP
    Host Ports:  0/UDP, 0/TCP, 0/TCP
    Args:
      -conf
      /etc/coredns/Corefile
    Limits:
      memory:  170Mi
    Requests:
      cpu:        100m
      memory:     70Mi
    Liveness:     http-get http://:8080/health delay=60s timeout=5s period=10s #success=1 #failure=5
    Readiness:    http-get http://:8080/health delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /etc/coredns from config-volume (ro)
      /tmp from tmp (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from coredns-token-sqv8j (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  tmp:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  config-volume:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      coredns
    Optional:  false
  coredns-token-sqv8j:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  coredns-token-sqv8j
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     CriticalAddonsOnly
                 node-role.kubernetes.io/master:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  34s (x16 over 15m)  default-scheduler  no nodes available to schedule pods


Name:               coredns-7dcf49c5dd-rdw94
Namespace:          kube-system
Priority:           2000000000
PriorityClassName:  system-cluster-critical
Node:               <none>
Labels:             eks.amazonaws.com/component=coredns
                    k8s-app=kube-dns
                    pod-template-hash=7dcf49c5dd
Annotations:        eks.amazonaws.com/compute-type: ec2
                    kubernetes.io/psp: eks.privileged
Status:             Pending
IP:                 
Controlled By:      ReplicaSet/coredns-7dcf49c5dd
Containers:
  coredns:
    Image:       602401143452.dkr.ecr.ca-central-1.amazonaws.com/eks/coredns:v1.8.0-eksbuild.1
    Ports:       53/UDP, 53/TCP, 9153/TCP
    Host Ports:  0/UDP, 0/TCP, 0/TCP
    Args:
      -conf
      /etc/coredns/Corefile
    Limits:
      memory:  170Mi
    Requests:
      cpu:        100m
      memory:     70Mi
    Liveness:     http-get http://:8080/health delay=60s timeout=5s period=10s #success=1 #failure=5
    Readiness:    http-get http://:8080/health delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /etc/coredns from config-volume (ro)
      /tmp from tmp (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from coredns-token-sqv8j (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  tmp:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  config-volume:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      coredns
    Optional:  false
  coredns-token-sqv8j:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  coredns-token-sqv8j
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     CriticalAddonsOnly
                 node-role.kubernetes.io/master:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  35s (x16 over 15m)  default-scheduler  no nodes available to schedule pods


Name:               metrics-server-5889d4b758-2bmc4
Namespace:          kube-system
Priority:           0
PriorityClassName:  <none>
Node:               <none>
Labels:             k8s-app=metrics-server
                    pod-template-hash=5889d4b758
Annotations:        kubernetes.io/psp: eks.privileged
Status:             Pending
IP:                 
Controlled By:      ReplicaSet/metrics-server-5889d4b758
Containers:
  metrics-server:
    Image:        k8s.gcr.io/metrics-server-amd64:v0.3.6
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:
      /tmp from tmp-dir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from metrics-server-token-wsqkn (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  tmp-dir:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  metrics-server-token-wsqkn:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  metrics-server-token-wsqkn
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  6s (x9 over 6m56s)  default-scheduler  no nodes available to schedule pods

此外,

$ kubectl get nodes
No resources found.

而且,

$ kubectl describe nodes

returns没什么

有人可以帮我解决这个问题吗?

TIA。

自我记录我的解决方案

鉴于我的 AWS 设置如下 account1:user1:role1 account2:user2:role2

角色设置如下- arn:aws:iam::account2:role/role2 <<信任关系>>

eks.amazonaws.com
ec2.amazonaws.com
arn:aws:iam::account1:user/user1
arn:aws:sts::account2:assumed-role/role2/user11

更新 eks-cluster.tf 如下 -

map_roles = [ 
    {
      "groups": [ "system:masters" ], 
      "rolearn": "arn:aws:iam::account2:role/role2", 
      "username": "role2"
    }
  ]
  map_users = [ 
    { 
      "groups": [ "system:masters" ], 
      "userarn": "arn:aws:iam::account1:user/user1", 
      "username": "user1"
    }, 
   { 
      "groups": [ "system:masters" ], 
      "userarn": "arn:aws:sts::account2:assumed-role/role2/user11", 
      "username": "user1"
    } 
  ]

p.s.: Yes "user11" is a generated username suffixed with a "1" to the account1 user with a username of "user1"

一切正常!