Рубрики
Uncategorized

Простой прокси -сервер для EKS

Как легко дать доступ к кластеру EKS, используя прокси аутентификацию с PSK. Tagged с AWS, Kubernetes, DevOps, OpenSource.

AWS EKS это отличный вариант для размещенного кластера Kubernetes.

В частности, это легко использовать для демонстраций и тренировочных сессий.

Тем не менее, аутентификация EKS основана на AWS IAM, что означает, что пользователям нужна учетная запись AWS. Аутентификация к EKS обычно включает в себя вызов aws eks get-token командовать в вашем .kube/config чтобы получить токен аутентификации.

Когда мы настраивали EKS для обучения Kubernetes, нам нужен был простой способ для пользователей без учетной записи AWS, чтобы получить доступ к кластеру, поэтому мы создали базовую прокси -сервис для EKS Get-Token действие.

Camptocamp/AWS-IAM-Authenticator-Proxy

Простая http -прокси для обмена аутентификацией AWS IAM

Услуги Amazon требуют использования действительных учетных записей. Этот прокси позволяет внешним пользователям получить доступ к кластеру AWS EKS, не требуя доступа к учетным данным AWS.

Отказ от ответственности : Прокси не реализует какую -либо форму аутентификации. Вы несете ответственность за реализацию любой меры безопасности, которую вы хотите применять перед ней.

Пример использования

Чтобы предоставить доступ к кластеру AWS без учетных данных, вы можете запустить прокси с необходимыми учетными данными, а также идентификатор кластера. Например, используя Docker:

$ docker run --rm -p 8080:8080 \
             -e AWS_ACCESS_KEY_ID= \
             -e AWS_SECRET_ACCESS_KEY= \
             -e EKS_CLUSTER_ID= \
             -e PSK="mysecretstring" \
    camptocamp/aws-iam-authenticator-proxy:latest

Затем вы должны иметь возможность получить токены аутентификации для вашего пользователя в http://localhost: 8080 Анкет

Если PSK пройден, вам нужно будет пройти его ценность в…

Развертывание с Docker

Прокси можно развернуть с помощью Docker, с учетными данными AWS, например:

docker run --rm -p 8080:8080 \
             -e AWS_ACCESS_KEY_ID= \
             -e AWS_SECRET_ACCESS_KEY= \
             -e EKS_CLUSTER_ID= \
             -e PSK="mysecretstring" \
    camptocamp/aws-iam-authenticator-proxy:latest

Права на кластер будут зависеть от пользователя, которого вы выбрали для создания ключа доступа.

PSK не является обязательным и позволяет немного закрепить прокси.

После того, как прокси запускается, вы можете получить к нему доступ к ним по адресу http://localhost: 8080? PSK = MySecRetString , так что вы можете просто установить свой ~/.kube/config использовать скручивание вместо AWS :

users:
- name: 
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: curl
      args:
        - -s
        - "http://:8080/?psk=mysecretstring"

Развертывание в EKS

Поскольку у вас есть кластер EKS, в первую очередь вы могли бы также развернуть прокси.

Репозиторий предоставляет для этого диаграмму руководителя в K8s каталог проекта GitHub.

Вы можете просто создать карту со следующими значениями:

eks_cluster_id: ""
psk: "mysecretstring"
aws:
  access_key_id: ""
  secret_access_key: ""

Учетные данные AWS будут храниться в секрете Kubernetes и переданы в контейнер.

С использованием

Однако, поскольку мы находимся в AWS, мы также можем использовать IAM Роли для счетов обслуживания и вообще обойти клавиши доступа. Это гораздо более чистый подход.

Вот как это сделать, используя Terraform для создания роли и развертывания прокси.

Во -первых, создайте роль, связанную с OIDC:

module "iam_assumable_role_aws_iam_authenticator_proxy" {
  source                        = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
  version                       = "3.3.0"
  create_role                   = true
  number_of_role_policy_arns    = 0
  role_name                     = "aws-iam-authenticator-proxy"
  provider_url                  = replace(module.cluster.cluster_oidc_issuer_url, "https://", "")
  oidc_fully_qualified_subjects = ["system:serviceaccount:yournamespace:aws-iam-authenticator-proxy"]
}

Замена yournamespace с пространством имен Kubernetes, где вы будете развертывать прокси.

Теперь мы можем настроить кластер для использования карты этой роли для роли Kubernetes, которую мы хотим (например, System:: Masters , чтобы сделать его кластер администратор).

Мы создадим случайный PSK и генерируем файл KubeConfig для использования Curl с прокси:

data "aws_vpc" "this" {
  id = var.vpc_id
}

data "aws_subnet_ids" "private" {
  vpc_id = data.aws_vpc.this.id

  tags = {
    "kubernetes.io/role/internal-elb" = "1"
  }
}

module "cluster" {
  source  = "terraform-aws-modules/eks/aws"
  version = "13.1.0"

  cluster_name    = var.cluster_name
  cluster_version = "1.18"

  subnets          = data.aws_subnet_ids.private.ids
  vpc_id           = var.vpc_id
  enable_irsa      = true
  map_roles        = [
    {
      rolearn  = module.iam_assumable_role_aws_iam_authenticator_proxy.this_iam_role_arn,
      username = module.iam_assumable_role_aws_iam_authenticator_proxy.this_iam_role_name,
      groups   = ["system:masters"]
    },
  ]

  worker_groups = [
    {
      instance_type        = "m5a.large"
      asg_desired_capacity = 2
      asg_max_size         = 3
    }
  ]

  kubeconfig_aws_authenticator_command = "curl"
  kubeconfig_aws_authenticator_command_args = [
    "-s",
    "https://${var.auth_url}/?psk=${random_password.auth_proxy_psk.result}",
  ]
}

resource "random_password" "auth_proxy_psk" {
  length  = 16
  special = false
}

Наконец, мы можем развернуть прокси в Kubernetes, используя Helm:


resource "helm_release" "aws-iam-authenticator-proxy" {
  name              = "aws-iam-authenticator-proxy"
  chart             = "https://github.com/camptocamp/aws-iam-authenticator-proxy/tree/master/k8s"
  namespace         = "aws-iam-authenticator-proxy"
  dependency_update = true
  create_namespace  = tr

  values = [
    << EOT
eks_cluster_id: "${var.cluster_name}"
psk: "${random_password.auth_proxy_psk.result}"
serviceAccount:
  name: "aws-iam-authenticator-proxy"
  annotations:
    eks.amazonaws.com/role-arn: ${module.iam_assumable_role_aws_iam_authenticator_proxy.this_iam_role_arn}
EOT
  ]

  depends_on = [
    module.cluster,
  ]
}

Вы можете добавить Вход или настроить Сервис использовать L4 LoadBalancer Настройка значений руля.

Оригинал: «https://dev.to/camptocamp-ops/a-simple-auth-proxy-for-eks-24dh»