Аутентификатор AWS / Heptio из экземпляра EC2 - PullRequest
0 голосов
/ 28 августа 2018

Итак, я следовал статье AWS Развертывание аутентификатора Heptio до копий , и я смог успешно запустить его. На моем ноутбуке, который имеет полностью настроенную настройку AWSCLI, я могу запустить любую команду kubectl, так как я администратор. Токен получен с помощью следующей команды в моем ~/.kube/config файле:

users:
- name: mycluster-exec
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - token
      - --cluster-id
      - mycluster
      - --role
      - arn:aws:iam::<account-number>:role/KubernetesAdministrator
      command: aws-iam-authenticator
      env: null

Теперь то, что я хотел бы сделать, в основном описано в выпуске GitHub EKS heptio аутентификация с использованием IAM без AWSCLI . Я не пользуюсь EKS, но принцип тот же. У меня есть экземпляры EC2, на которых работают агенты сборки моей системы CI, и я хотел бы, чтобы у этих агентов компоновки NOT были статические, жестко закодированные учетные данные (то есть статический идентификатор AWS и секретный ключ). Я бы предпочел, чтобы эти узлы также использовали двоичный файл aws-iam-authenticator для временного получения учетных данных, необходимых для развертывания / внесения изменений в мои кластеры Kubernetes.

Я создал профиль роли / экземпляра с именем KubernetesCIRole и прикрепил эту роль IAM к моим узлам агента сборки EC2. Затем я добавил следующее к ConfigMap:

apiVersion: v1
data:
  config.yaml: |
    clusterID: mycluster
    server:
      mapRoles:
      - roleARN: arn:aws:iam::<account-number>:role/KubernetesAdministrator
        username: kubernetes-admin
        groups:
        - system:masters
      - roleARN: arn:aws:iam::<account-number>:role/KubernetesCIRole
        username: kubernetes-admin
        groups:
        - system:masters
kind: ConfigMap
metadata:
  labels:
    k8s-app: heptio-authenticator-aws
  name: heptio-authenticator-aws
  namespace: kube-system

Однако, когда я настраиваю ~/.kube/config на этом компьютере агента сборки EC2, а затем запускаю что-то простое, например kubectl --v=10 get pods, я получаю следующее:

I0828 10:16:30.605964    5196 loader.go:359] Config loaded from file /home/ubuntu/.kube/config
I0828 10:16:30.606744    5196 loader.go:359] Config loaded from file /home/ubuntu/.kube/config
I0828 10:16:30.607704    5196 loader.go:359] Config loaded from file /home/ubuntu/.kube/config
...
I0828 10:16:33.092683    5196 round_trippers.go:386] curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.11.2 (linux/amd64) kubernetes/bb9ffb1" 'https://api.mycluster.k8s.mycompany.com/api?timeout=32s'
I0828 10:16:33.605698    5196 round_trippers.go:405] GET https://api.mycluster.k8s.mycompany.com/api?timeout=32s 401 Unauthorized in 512 milliseconds
I0828 10:16:33.605727    5196 round_trippers.go:411] Response Headers:
I0828 10:16:33.605734    5196 round_trippers.go:414]     Content-Type: application/json
I0828 10:16:33.605749    5196 round_trippers.go:414]     Www-Authenticate: Basic realm="kubernetes-master"
I0828 10:16:33.605758    5196 round_trippers.go:414]     Content-Length: 129
I0828 10:16:33.605767    5196 round_trippers.go:414]     Date: Tue, 28 Aug 2018 10:16:33 GMT
I0828 10:16:33.608443    5196 request.go:897] Response Body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"Unauthorized","reason":"Unauthorized","code":401}
I0828 10:16:33.610858    5196 cached_discovery.go:111] skipped caching discovery info due to Unauthorized
F0828 10:16:33.610901    5196 helpers.go:119] error: the server doesn't have a resource type "pods"

Почему это не работает? Если я указал в Heptio / AWS IAM Authenticator ConfigMap, что данная роль имеет доступ администратора кластера (или что-то еще, в этом отношении), разве я не смогу пройти проверку подлинности?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 29 августа 2018

Наконец-то разобрался. Документация AWS Управление пользователями или ролями IAM для вашего кластера содержит необходимую часть:

Сначала вам нужно создать роль IAM (и соответствующий профиль экземпляра), которая имеет следующие основные разрешения, и прикрепить ее к вашему экземпляру EC2:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Затем вам нужно обновить ConfigMap примерно так:

apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: <ARN of instance role (not instance profile)>
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:masters

Ключевой частью является имя пользователя system:node:{{EC2PrivateDNSName}}. Я думаю, {{EC2PrivateDNSName}} служит заполнителем для любого экземпляра EC2 с соответствующим rolearn, прикрепленным к нему.

...