Рубрики
Uncategorized

Создание полностью частной Amazon EKS на AWS Fargate Cluster

Регулируемые отрасли должны принять свои рабочие нагрузки Kubernetes наиболее безопасными способами и полностью частными … Теги от AWS, Kubernetes, Security, DevOps.

Регулируемые отрасли должны принять свои рабочие нагрузки Kubernetes наиболее безопасными способами, и полностью частные EKS на Fargate Cluster пытаются решить эту проблему. Каждый POD работает на Fargate, имеет свою собственную границу изоляции и не разделяет базовое ядро, ресурсы CPU, ресурсы памяти или эластичный сетевой интерфейс с другим POD, который делает его безопасным от точки зрения соответствия. С AWS Fargate вам больше не нужно обеспечивать, настраивать или масштабировать группы виртуальных машин для запуска контейнеров. Это удаляет необходимость выбора типов серверов, решить, когда масштабировать группы узлов или оптимизировать упаковку кластеров.

Первоначально опубликовано в моем блоге: https://k8s-dev.github.io.

Исходный код для этого поста размещен по адресу: https://github.com/k8s-dev/private-eks-fargate

Ограничения

  • Нет подключения к Интернету для Fargate Cluster, без публичных подсетей, кроме хоста Bastion
  • Полностью частный доступ для API-сервера API Cluster Place Cluster’s Kubernetes API Amazon EKS Cluster
  • Все услуги AWS связываются с этим кластером с помощью конечных точек VPC или шлюза, по сути, используя Private AWS Access

А VPC конечная точка Включает частные соединения между вашим VPC и поддерживаемым услугами AWS. Трафик между VPC и другим службой AWS не оставляет сеть Amazon. Таким образом, этот раствор не требует интернет-шлюза или устройства NAT, за исключением подсети Host Bastion.

Предварительно реквизит

  • Как минимум 2 частных подсети в VPC, потому что подводные средства, работающие на Фаргит, поддерживаются только на частных подсети
  • Хозяин бастиона в публичной подсети в том же VPC для подключения к Кластеру Eks Fargate через Kubectl
  • AWS CLI установлен и настроен с регионом и по умолчанию на этом хосте бастиона
  • Конечные точки VPC и конечная точка шлюза для AWS Services что ваш кластер использует

Дизайн

Эта диаграмма показывает дизайн высокого уровня для реализации. EKS на Fargate Cluster Spans 2 частных подсети и хост-бастионного хоста предоставляется в публичной подсети с подключением к Интернету. Все связи с кластером EKS будут инициированы с этого хоста бастиона. Кластер EKS полностью частной и общается с различными услугами AWS через конечные точки VPC и шлюза.

Этап реализации

Фаргейт

Создайте роль Fargate POD-исполнения Fargate, которая позволяет FARGATE инфраструктуру создавать вызовы AWS API от вашего имени, чтобы сделать такие вещи, как Pull Container Fights из Amazon Ecr или журналов маршрута в другие услуги AWS. Следуйте: https://docs.aws.amazon.com/eks/latest/userguide/fargate-getting-started.html#fargate-sg-pod-execution-role.

Создать AWS Services VPC Конечные точки

Поскольку мы выкатываем полностью частные экс на Фаргитском кластере, он должен иметь частный только доступ к различным услугам AWS, таких как ECR, CloudWatch, LoadBalancer, S3 и т. Д.

Этот шаг — Необходимо Для выполнения, чтобы PODS, работающие на Fargate Cluster, могут вытащить изображения контейнера, нажмите журналы в облачность и взаимодействовать с LoadBalancer.

Смотрите весь список здесь конечных точек, что ваш кластер может использовать: https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html#vpc-endpoints-private-clusters

Установите конечные точки VPC конечной точки и конечных точек шлюза в том же VPC для служб, которые вы планируете использовать в своих EKS на Fargate Cluster, следующие шаги по адресу: https://docs.aws.aMazon.com/vpc/latest/userguide/vpce-interface.html#Create-interface-endpoint.

Нам нужно обеспечить следующие конечные точки в минимуме:

  • Конечные точки интерфейса для ECR (как ECR.API и ECR.DKR), чтобы вытащить изображения контейнера
  • Конечная точка шлюза для S3, чтобы потянуть фактические слои изображения
  • Конечная точка интерфейса для EC2
  • Конечная точка интерфейса для STS для поддержки Fargate и IAM ролей для служб счетов
  • Конечная точка интерфейса для журнала CloudWatch (Logs), если требуется журнал CloudWatch

Создать кластер с личной конечной точкой API-сервера

Используйте AWS CLI для создания кластера EKS в обозначенном VPC. Измените с фактическим именем кластера, версией Kubernetes, роли выполнения POD ARN, имена частных подсетей и именем группы безопасности перед запуском команды. Пожалуйста, обратите внимание, что это может занять 10-15 минут, чтобы получить кластер в готовности.

aws eks create-cluster --name  --kubernetes-version 1.18 --role-arn arn:aws:iam::1234567890:role/private-fargate-pod-execution-role
--resources-vpc-config subnetIds=,securityGroupIds=,endpointPublicAccess=false,endpointPrivateAccess=true
--logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}

Вышеуказанная команда создает частный кластер EKS с частными конечными точками и обеспечивает журнал компонентов управления плоскостью Kubernetes, таких как для Apiserver, планировщика и т. Д. Настроить согласно вашему соблюдению потребностей.

Подключение к этому частным кластерам может быть достигнуто в 3 способах, через хост Bastion, Cloud9 или подключенной сети, как указано здесь: https://docs.aws.aMazon.com/eks/latest/userguide/Cluster-endpoint.html#private-access Отказ За легкость этого сделать, мы пойдем вперед с подходом Host Coving Bastion.

Пока вы ждете кластеров, чтобы быть в готовности, давайте настроим хост бастиона. Это необходимо, поскольку EKS на Fargate Cluster находится только в частных подсети, без подключения к Интернету и доступом сервера API устанавливается только для частного. Хозяин Bastion будет создан в публичной подсети в том же VPC и будет использоваться для доступа к/достичь EKS на Fargate Cluster. Единственный реквизит — установить kubectl и AWS CLI на нем. Kubectl можно скачать отсюда и AWS CLI V2 может быть загружен отсюда

Все последующие команды могут быть запущены с хоста Bastion.

Настройка доступа к Экс на Фаргейте Кластер

Kubectl на хосте бастиона необходимо поговорить с API-сервером, чтобы общаться с эксми на Fargate Cluster. Выполните следующие шаги для настройки этой связи. Убедитесь, что конфигурация AWS CLI сделана до выполнения этой команды.

aws eks --region  update-kubeconfig --name 

Это сохраняет файл KUBECONFIG в путь ~/.kube/Config, который позволяет запустить команды Kubectl к кластеру EKS.

Включить регистрацию (необязательно)

Регистрация может быть очень полезна для отладки проблем при выводе приложения. Настройка регистрации в Кластере Eks Fargate Via: https://docs.aws.amazon.com/eks/latest/userguide/fargate-logging.html.html.

Создать Fargate профиль

Чтобы запланировать POD, работающие на Fargate в вашем кластере, вы должны определить Fargate Profile, который указывает, какие PODS следует использовать Fargate, когда они запускаются. Фаргитные профили неизменяются по природе. Профиль по существу сочетается из пространства имен и необязательно меток. Стручки, которые соответствуют селектору (путем сопоставления пространства имен для селектора, и все этикетки, указанные в селекторе), запланированы на Fargate.

aws eks create-fargate-profile --fargate-profile-name fargate-custom-profile \
--cluster-name private-fargate-cluster --pod-execution-role-arn \
arn:aws:iam::01234567890:role/private-fargate-pod-execution-role \
--subnets subnet-01b3ae56696b33747 subnet-0e639397d1f12500a \
subnet-039f4170f8a820afc --selectors namespace=custom-space

Эта команда создает Fargate Profile в кластере и рассказывает EKS планировать PODS в «Custom-Space» на Fargate. Тем не менее, нам нужно сделать несколько изменений в нашем кластере, прежде чем мы сможем запустить приложения на нем.

Обновление Coredns.

Coredns настроен для работы на инфраструктуре Amazon EC2 на кластерах Amazon EKS. Поскольку в нашем кластере у нас нет узлов EC2, нам нужно обновить развертывание Coredns, чтобы удалить eks.amazonaws.com/compute-type : Аннотация EC2. И создайте фарстровый профиль, чтобы Coredns PODS можно использовать его для запуска. Обновите следующие Fargate Profile Json для вашего собственного имени кластера, имени учетной записи, роли ARN и сохраните в локальном файле.

{
    "fargateProfileName": "coredns",
    "clusterName": "private-fargate-cluster",
    "podExecutionRoleArn": "arn:aws:iam::1234567890:role/private-fargate-pod-execution-role",
    "subnets": [
        "subnet-01b3ae56696b33747",
        "subnet-0e639397d1f12500a",
        "subnet-039f4170f8a820afc"
    ],
    "selectors": [
        {
            "namespace": "kube-system",
            "labels": {
                "k8s-app": "kube-dns"
            }
        }
    ]
}

Примените это JSON со следующей командой

aws eks create-fargate-profile --cli-input-json file://updated-coredns.json

Следующим шагом является удаление аннотации от Coredns Pods, позволяя им планировать на фаржественную инфраструктуру:

kubectl patch deployment coredns -n kube-system --type json \
-p='[{"op": "remove", "path": "/spec/template/metadata/annotations/eks.amazonaws.com~1compute-type"}]'

Последний шаг для создания функции COREDNS правильно состоит в том, чтобы воссоздать эти стручки, мы будем использовать развертывание развертывания для этого:

kubectl rollout restart -n kube-system deployment.apps/coredns

Убедитесь, что через некоторое время выполните дважды, когда Pods Coredns находится в запущенном состоянии в пространстве пространства Kube-System, прежде чем продолжить дальше.

После этих шагов EKS на Fargate Private Cluster работает и работает. Поскольку этот кластер не имеет подключения к Интернету, PODS запланировано на этом не может вытащить контейнерные изображения из публичного реестра, как Dockerhub и т. Д. Решением Для этого является настройка ECR REPO, хост личных изображений в нем и обратитесь к этим изображениям в манифесте POD.

Настройка реестра ECR

Это включает в себя создание репозитория ECR, потянув изображение локально, помечив его соответствующим образом и нажав в реестр ECR. Образ контейнера может быть скопирован в ECR из хоста Bastion и может быть доступ к EKS на Fargate через конечную точку ECR VPC.

aws ecr create-repository --repository-name nginx
docker pull nginx:latest
docker tag nginx <1234567890>.dkr.ecr..amazonaws.com/nginx:v1
aws ecr get-login-password --region  | docker login --username AWS --password-stdin <1234567890>.dkr.ecr..amazonaws.com
docker push <1234567890>.dkr.ecr..amazonaws.com/nginx:v1

Запустите приложение в EKS на Fargate Cluster

Теперь, когда мы нажимали изображение Nginx в ECR, мы можем ссылаться на его развертывание YAML.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  namespace: custom-space
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: <124567890>.dkr.ecr..amazonaws.com/nginx:v1
          ports:
            - containerPort: 80

Cross-Check для обеспечения того, чтобы приложение NGINX через некоторое время выполняется приложение.

kubectl get pods -n custom-space
NAME                          READY   STATUS      RESTARTS   AGE
sample-app-578d67447d-fw6kp   1/1     Running     0          8m52s
sample-app-578d67447d-r68v2   1/1     Running     0          8m52s
sample-app-578d67447d-vbbfr   1/1     Running     0          8m52s

Опишите развертывание должно выглядеть так.

kubectl describe deployment -n custom-space
Name:                   sample-app
Namespace:              custom-space
CreationTimestamp:      Tue, 19 Dec 2020 23:43:04 +0000
Labels:                 
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        1234567890.dkr.ecr..amazonaws.com/nginx:v1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  
    Mounts:       
  Volumes:        
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  
NewReplicaSet:   sample-app-578d67447d (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  10m   deployment-controller  Scaled up replica set sample-app-578d67447d to 3

Обеспечение того, чтобы приложение NGINX фактически запущено на фаржественную инфраструктуру, установите страницу консоли EC2. Вы не найдете ни одного EC2, работающего там как часть кластера EKS, так как базовая инфраструктура полностью управляется AWS.

kubectl get nodes
NAME                                    STATUS   ROLES   AGE   VERSION
fargate-ip-10-172-36-16.ec2.internal    Ready      12m v1.18.8-eks-7c9bda
fargate-ip-10-172-10-28.ec2.internal    Ready      12m v1.18.8-eks-7c9bda
fargate-ip-10-172-62-216.ec2.internal   Ready      12m v1.18.8-eks-7c9bda

Другим экспериментом, чтобы попробовать, состоит в том, чтобы создать новое развертывание с изображением, которое не является частью ECR, и не считает, что POD будет в состоянии CrashBackoff, потому что являясь частным кластером, он не может добраться до DockerHub на публичном интернете, чтобы вытащить изображение.

Закрытие

  • В этом эксперименте — мы создали частные экс на Фаргитском кластере, с частными конечными точками API.
  • Это развертывание решает некоторые проблемы соответствия, с которыми сталкиваются BFSI и другие регулируемые сектора.

Пожалуйста, дайте знать, если вы сталкиваетесь с проблемами, реплицируя это в собственной среде. PRS для улучшения этой документации приветствуется. Счастливое обучение!

Оригинал: «https://dev.to/k8sdev/setup-a-fully-private-amazon-eks-on-aws-fargate-cluster-10cb»