Регулируемые отрасли должны принять свои рабочие нагрузки 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 --regionupdate-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 Ready12m 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»