Автор оригинала: Vyacheslav.
AWS предоставляет комплексное руководство для начала с EKS по ссылке https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html
Следующие шаги обычно следуют за этим руководством, разница в том, что Provisioning Play (может быть) реализована исключительно с облачными шаблонами Terraform W/O.
У него есть преимущество таким образом, как мы делаем развертывание, но в ваших сценариях облачных шаблонов может иметь преимущество. Терраформ проекта можно найти в HTTPS://github.com/voronenko/devops-tf-eks
Первый шаг создает VPC с публичными и частными подсетью для вашего кластера Amazon EKS
Самые простые VPC будут все подсети публичными, как видно на облачных шаблонах (https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc -sample.yaml)
Но если ваша цель — повторно использовать это в производстве, разумный будет VPC с частными и общественными частями, такими как https://docs.aws.amazon.com/eks/latest/userguide/create-public-private-vpc. HTML
На данный момент есть ограничения: https://docs.aws.amazon.com/eks/latest/userguide/network_reqs.html
Давайте приступим к рекомендуемой сетевой архитектуре, которая использует частные подсети для ваших рабочих узлов и общественных подсетей для Kubernetes для создания балансировщиков нагрузки на Интернет внутри
Шаг 1.1: Создайте упругий IP-адрес для вашего NAT Gateway (ы)
Узлы рабочих в частных подсетях требуют шлюза Nat для исходящего доступа в Интернет. Шлюз NAT требует упругого IP-адреса в вашей публичной подсети, но мастер VPC не создает для вас. Создайте упругий IP-адрес перед запуском мастера VPC.
Создать упругий IP-адрес
Откройте консоль Amazon VPC в https://console.aws.amazon.com/vpc/.
На левой панели навигации выберите упругих IPS. Выберите выделить новый адрес, выделить, закрыть. Обратите внимание на идентификатор распределения для вашего вновь созданного упругого IP-адреса; Вы вводите это позже в мастере VPC.
// reserve elastic ip for nat gateway resource "aws_eip" "nat_eip" { vpc = true tags { Environment = "${local.env}" } } resource "aws_eip" "nat_eip_2" { vpc = true tags { Environment = "${local.env}" } }
Шаг 1.2: Запустите волшебник VPC
Мастер VPC автоматически создает и настраивает большинство ваших ресурсов VPC для вас.
Для запуска мастера VPC
В левой панели навигации выберите панель VPC. Выберите Пуск WPC Wizard, VPC с публичными и частными подсетью, выберите. Для имени VPC предоставьте свое VPC уникальное имя. Для идентификатора упругого IP-адреса выберите идентификатор эластичного IP-адреса, который вы создали ранее. Выберите Создать VPC. Когда волшебник закончен, выберите ОК. Обратите внимание на зона доступности, в которой были созданы ваши подсети VPC. Ваши дополнительные подсети должны быть созданы в другой зоне доступности. Соответствующая часть террафора будет
// create vpc //Base VPC Networking //EKS requires the usage of Virtual Private Cloud to provide the base for its networking configuration. resource "aws_vpc" "cluster" { cidr_block = "${var.vpc_cidr}" enable_dns_hostnames = true tags = "${merge( local.common_tags, map( "Name", "${local.env}-eks-vpc" ) )}" } //The below will create a ${var.public_subnet_cidr} VPC, //two ${var.public_subnet_cidr} public subnets, //two ${var.private_subnet_cidr} private subnets with nat instances, //an internet gateway, //and setup the subnet routing to route external traffic through the internet gateway: // public subnets resource "aws_subnet" "eks-public" { vpc_id = "${aws_vpc.cluster.id}" cidr_block = "${var.public_subnet_cidr}" availability_zone = "${local.availabilityzone}" tags = "${merge( local.common_tags, map( "Name", "${local.env}-eks-public" ) )}" } resource "aws_subnet" "eks-public-2" { vpc_id = "${aws_vpc.cluster.id}" cidr_block = "${var.public_subnet_cidr2}" availability_zone = "${local.availabilityzone2}" tags = "${merge( local.common_tags, map( "Name", "${local.env}-eks-public-2" ) )}" } // private subnet resource "aws_subnet" "eks-private" { vpc_id = "${aws_vpc.cluster.id}" cidr_block = "${var.private_subnet_cidr}" availability_zone = "${local.availabilityzone}" tags = "${merge( local.common_tags, map( "Name", "${local.env}-eks-private" ) )}" } resource "aws_subnet" "eks-private-2" { vpc_id = "${aws_vpc.cluster.id}" cidr_block = "${var.private_subnet_cidr2}" availability_zone = "${local.availabilityzone2}" tags = "${merge( local.common_tags, map( "Name", "${local.env}-eks-private-2" ) )}" } // internet gateway, note: creation takes a while resource "aws_internet_gateway" "igw" { vpc_id = "${aws_vpc.cluster.id}" tags { Environment = "${local.env}" } } // reserve elastic ip for nat gateway resource "aws_eip" "nat_eip" { vpc = true tags { Environment = "${local.env}" } } resource "aws_eip" "nat_eip_2" { vpc = true tags { Environment = "${local.env}" } } // create nat once internet gateway created resource "aws_nat_gateway" "nat_gateway" { allocation_id = "${aws_eip.nat_eip.id}" subnet_id = "${aws_subnet.eks-public.id}" depends_on = ["aws_internet_gateway.igw"] tags { Environment = "${local.env}" } } resource "aws_nat_gateway" "nat_gateway_2" { allocation_id = "${aws_eip.nat_eip_2.id}" subnet_id = "${aws_subnet.eks-public-2.id}" depends_on = ["aws_internet_gateway.igw"] tags { Environment = "${local.env}" } } //Create private route table and the route to the internet //This will allow all traffics from the private subnets to the internet through the NAT Gateway (Network Address Translation) resource "aws_route_table" "private_route_table" { vpc_id = "${aws_vpc.cluster.id}" tags { Environment = "${local.env}" Name = "${local.env}-private-route-table" } } resource "aws_route_table" "private_route_table_2" { vpc_id = "${aws_vpc.cluster.id}" tags { Environment = "${local.env}" Name = "${local.env}-private-route-table-2" } } resource "aws_route" "private_route" { route_table_id = "${aws_route_table.private_route_table.id}" destination_cidr_block = "0.0.0.0/0" nat_gateway_id = "${aws_nat_gateway.nat_gateway.id}" } resource "aws_route" "private_route_2" { route_table_id = "${aws_route_table.private_route_table_2.id}" destination_cidr_block = "0.0.0.0/0" nat_gateway_id = "${aws_nat_gateway.nat_gateway_2.id}" } resource "aws_route_table" "eks-public" { vpc_id = "${aws_vpc.cluster.id}" route { cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.igw.id}" } tags { Environment = "${local.env}" Name = "${local.env}-eks-public" } } resource "aws_route_table" "eks-public-2" { vpc_id = "${aws_vpc.cluster.id}" route { cidr_block = "0.0.0.0/0" gateway_id = "${aws_internet_gateway.igw.id}" } tags { Environment = "${local.env}" Name = "${local.env}-eks-public-2" } } // associate route tables resource "aws_route_table_association" "eks-public" { subnet_id = "${aws_subnet.eks-public.id}" route_table_id = "${aws_route_table.eks-public.id}" } resource "aws_route_table_association" "eks-public-2" { subnet_id = "${aws_subnet.eks-public-2.id}" route_table_id = "${aws_route_table.eks-public-2.id}" } resource "aws_route_table_association" "eks-private" { subnet_id = "${aws_subnet.eks-private.id}" route_table_id = "${aws_route_table.private_route_table.id}" } resource "aws_route_table_association" "eks-private-2" { subnet_id = "${aws_subnet.eks-private-2.id}" route_table_id = "${aws_route_table.private_route_table_2.id}" }
Шаг 2 Создайте свою сервисную роль Amazon EKS
Откройте консоль IAM в https://console.aws.amazon.com/iam/.
Выберите роли, затем создайте роль.
Выберите «Экс» из списка услуг, затем позволяет Amazon EKS управлять своими кластерами от вашего имени в случае использования вашего использования, а затем: разрешения.
Выберите Далее: Обзор.
Для имени роли введите уникальное имя для вашей роли, например, Эксервицерола, то выберите «Создать роль».
Определение террафора для роли идет ниже.
//Kubernetes Masters //This is where the EKS service comes into play. //It requires a few operator managed resources beforehand so that Kubernetes can properly manage //other AWS services as well as allow inbound networking communication from your local workstation //(if desired) and worker nodes. //EKS Master Cluster IAM Role // //IAM role and policy to allow the EKS service to manage or retrieve data from other AWS services. //For the latest required policy, see the EKS User Guide. resource "aws_iam_role" "EKSClusterRole" { name = "EKSClusterRole-${local.env}", description = "Allows EKS to manage clusters on your behalf.", assume_role_policy = <
Шаг 3: Создайте группу безопасности управления плоскостью управления
Когда вы создаете кластер EKS Amazon, ваша кластерная плоскость управления создает эластичные сетевые интерфейсы в ваших подсети, чтобы включить связь с рабочими узлами. Вы должны создать группу безопасности, которая посвящена вашей плоскости управления кластером Amazon EKS, так что вы можете применить входящие и исходящие правила, регулирующие то, что трафик разрешено в этом соединении. Когда вы создаете кластер, вы указываете эту группу безопасности, и это применяется к эластичным сетевым интерфейсам, которые создаются в ваших подсети.
Чтобы создать группу безопасности плоскости управления
На левой панели навигации для фильтра VPC выберите свой VPC и выберите «Группы безопасности», создайте группу безопасности.
Примечание
Если вы не видите свой новый VPC здесь, обновите страницу, чтобы забрать его. Заполните следующие поля и выберите Да, создайте:
Для тега имени, предоставьте имя для вашей группы безопасности. Например,
//EKS Master Cluster Security Group //This security group controls networking access to the Kubernetes masters. //Needs to be configured also with an ingress rule to allow traffic from the worker nodes. resource "aws_security_group" "eks-control-plane-sg" { name = "${local.env}-control-plane" description = "Cluster communication with worker nodes [${local.env}]" vpc_id = "${aws_vpc.cluster.id}" egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } # OPTIONAL: Allow inbound traffic from your local workstation external IP # to the Kubernetes. You will need to replace A.B.C.D below with # your real IP. Services like icanhazip.com can help you find this. //resource "aws_security_group_rule" "eks-ingress-workstation-https" { // cidr_blocks = ["A.B.C.D/32"] // description = "Allow workstation to communicate with the cluster API Server" // from_port = 443 // protocol = "tcp" // security_group_id = "${aws_security_group.eks-control-plane-sg.id}" // to_port = 443 // type = "ingress" //}
Скачать AWS Authenticator, вид
install-k8s-heptio-authenticator-aws: curl -o ~/dotfiles/docker/heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/linux/amd64/heptio-authenticator-aws curl -o ~/dotfiles/docker/heptio-authenticator-aws.md5 https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/linux/amd64/heptio-authenticator-aws.md5 chmod +x ~/dotfiles/docker/heptio-authenticator-aws
Проверяйте бегом
heptio-authenticator-aws help
Проверьте, если у вас есть последние установленные AWSCLI, вы должны получить вывод похожи на один ниже
aws eks describe-cluster --name test-cluster { "cluster": { "status": "ACTIVE", "endpoint": "https://1F3D31820046A120545D3A2FC1422C04.sk1.us-east-1.eks.amazonaws.com", "name": "test-cluster", "certificateAuthority": { "data": "CENSORED" }, "roleArn": "arn:aws:iam::CENSORED:role/EKSClusterRole", "resourcesVpcConfig": { "subnetIds": [ "subnet-065058abfee2adfca", "subnet-0eb04ec6e3f359b5c", "subnet-0fd73ea9b4a7dab35", "subnet-0ca730350e571154b" ], "vpcId": "vpc-0daf88b515eac80ab", "securityGroupIds": [ "sg-09de76fce3a132c15" ] }, "version": "1.10", "arn": "arn:aws:eks:us-east-1:CENSORED:cluster/test-cluster", "createdAt": 1530892117.396 } }
Шаг 4: Создать кластер EKS
Теперь пришло время запустить кластер, либо через UI, либо с помощью инструмента обеспечения вашего выбора
Создание кластера в ECS может показаться немного сложно, так как по умолчанию AWS предлагает удерживать Информация кластера в отдельных файлах, таких как ~/.kube/eksconfig
и использовать среду Переменные для переключения контекста Экспорт kubeconfig = ~/.kube/eksconfig
Если у вас настроены несколько кластеров, это точно не будет удобным для вас.
apiVersion: v1 clusters: - cluster: server: ${aws_eks_cluster.demo.endpoint} certificate-authority-data: ${aws_eks_cluster.demo.certificate_authority.0.data} name: kubernetes contexts: - context: cluster: kubernetes user: aws name: aws current-context: aws kind: Config preferences: {} users: - name: aws user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: heptio-authenticator-aws args: - "token" - "-i" - "${var.cluster-name}" # - "-r" # - "" # env: # - name: AWS_PROFILE # value: " "
Например выше, вы можете подтвердить, если вы настроили свой кластер и kubectl вправо.
kubectx aws kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.20.0.1443/TCP 4d
Часть террафора для создания кластерных действий было бы
// //EKS Master Cluster //This resource is the actual Kubernetes master cluster. It can take a few minutes to provision in AWS. resource "aws_eks_cluster" "eks-cluster" { name = "${local.cluster_name}" role_arn = "${aws_iam_role.EKSClusterRole.arn}" vpc_config { security_group_ids = ["${aws_security_group.eks-control-plane-sg.id}"] subnet_ids = [ "${aws_subnet.eks-private.id}", "${aws_subnet.eks-private-2.id}" ] } depends_on = [ "aws_iam_role_policy_attachment.eks-policy-AmazonEKSClusterPolicy", "aws_iam_role_policy_attachment.eks-policy-AmazonEKSServicePolicy", ] } locals { kubeconfig = <
Обратите внимание, что вместо исправления Cubelet Config, согласно оригинальному руководству Вы можете просто получить готовый к использованию содержимого файла из Террафом Выход Kubeconfig.
.
Шаг 5,6: Теперь пришло время запустить рабочие узлы
В то время как AWS рекомендует запустить стек, используя, например, после шаблона пласта облака https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml
То, что вам понадобится от результатов, записывает NodeInstanceRole для создаваемой группы узлов. Вам нужно это, когда вы настраиваете свои рабочие узлы Amazon EKS.
На панели вывода вы увидите вывод
arn:aws:iam::CENSORED:role/test-cluster-worker-nodes-NodeInstanceRole-XF8G1BPXC56B
Последний шаг будет обеспечивать, чтобы рабочие узлы могли присоединиться к вашему кластеру.
Вам понадобится шаблон для карты конфигурации Kubernetes
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml
curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml cat aws-auth-cm.yaml apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn:username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
Изменить роль ARN и применять изменения с
kubectl apply -f aws-auth-cm.yaml configmap "aws-auth" created
Через несколько минут ваш флот должен быть готов
kubectl get nodes NAME STATUS ROLES AGE VERSION ip-10-11-1-210.ec2.internal NotReady11s v1.10.3 ip-10-11-3-36.ec2.internal NotReady 14s v1.10.3 ip-10-11-3-4.ec2.internal NotReady 9s v1.10.3 ~~~~~~~~~~~~ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-10-11-1-210.ec2.internal Ready 1m v1.10.3 ip-10-11-3-36.ec2.internal Ready 1m v1.10.3 ip-10-11-3-4.ec2.internal Ready 1m v1.10.3
Если вы хотите опустить полагаться на шаблон облачного формирования по URL, и вместо этого придерживаться полностью сценаривной инфраструктуры:
Шаг 5: На этом мы готовим рабочие узлы и группы безопасности
//Kubernetes Worker Nodes //The EKS service does not currently provide managed resources for running worker nodes. //Here we will create a few operator managed resources so that Kubernetes can properly manage //other AWS services, networking access, and finally a configuration that allows //automatic scaling of worker nodes. //Worker Node IAM Role and Instance Profile //IAM role and policy to allow the worker nodes to manage or retrieve data from other AWS services. //It is used by Kubernetes to allow worker nodes to join the cluster. // //For the latest required policy, see the EKS User Guide. resource "aws_iam_role" "EKSNodeRole" { name = "eks-${local.cluster_name}-node-role" assume_role_policy = <
Шаг 5: На этом шаге мы создаем автоскализацию группы
//Worker Node AutoScaling Group //Now we have everything in place to create and manage EC2 instances that will serve as our worker nodes //in the Kubernetes cluster. This setup utilizes an EC2 AutoScaling Group (ASG) rather than manually working with //EC2 instances. This offers flexibility to scale up and down the worker nodes on demand when used in conjunction //with AutoScaling policies (not implemented here). // //First, let us create a data source to fetch the latest Amazon Machine Image (AMI) that Amazon provides with an //EKS compatible Kubernetes baked in. data "aws_ami" "eks-worker" { filter { name = "name" values = ["eks-worker-*"] } most_recent = true owners = ["602401143452"] # Amazon Account ID } # EKS currently documents this required userdata for EKS worker nodes to # properly configure Kubernetes applications on the EC2 instance. # We utilize a Terraform local here to simplify Base64 encoding this # information into the AutoScaling Launch Configuration. # More information: https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml locals { eks-node-userdata = <$CA_CERTIFICATE_FILE_PATH INTERNAL_IP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4) sed -i s,MASTER_ENDPOINT,${aws_eks_cluster.eks-cluster.endpoint},g /var/lib/kubelet/kubeconfig sed -i s,CLUSTER_NAME,${local.cluster_name},g /var/lib/kubelet/kubeconfig sed -i s,REGION,${var.AWS_REGION},g /etc/systemd/system/kubelet.service sed -i s,MAX_PODS,20,g /etc/systemd/system/kubelet.service sed -i s,MASTER_ENDPOINT,${aws_eks_cluster.eks-cluster.endpoint},g /etc/systemd/system/kubelet.service sed -i s,INTERNAL_IP,$INTERNAL_IP,g /etc/systemd/system/kubelet.service DNS_CLUSTER_IP=10.100.0.10 if [[ $INTERNAL_IP == 10.* ]] ; then DNS_CLUSTER_IP=172.20.0.10; fi sed -i s,DNS_CLUSTER_IP,$DNS_CLUSTER_IP,g /etc/systemd/system/kubelet.service sed -i s,CERTIFICATE_AUTHORITY_FILE,$CA_CERTIFICATE_FILE_PATH,g /var/lib/kubelet/kubeconfig sed -i s,CLIENT_CA_FILE,$CA_CERTIFICATE_FILE_PATH,g /etc/systemd/system/kubelet.service systemctl daemon-reload systemctl restart kubelet USERDATA } resource "aws_launch_configuration" "eks-launch-configuration" { associate_public_ip_address = true iam_instance_profile = "${aws_iam_instance_profile.eks-node-instance-profile.name}" image_id = "${data.aws_ami.eks-worker.id}" instance_type = "t2.small" name_prefix = "eks-${local.cluster_name}" security_groups = ["${aws_security_group.eks-nodes-sg.id}"] user_data_base64 = "${base64encode(local.eks-node-userdata)}" key_name = "${var.ec2_keyname}" lifecycle { create_before_destroy = true } } //Finally, we create an AutoScaling Group that actually launches EC2 instances based on the //AutoScaling Launch Configuration. //NOTE: The usage of the specific kubernetes.io/cluster/* resource tag below is required for EKS //and Kubernetes to discover and manage compute resources. resource "aws_autoscaling_group" "eks-autoscaling-group" { desired_capacity = 2 launch_configuration = "${aws_launch_configuration.eks-launch-configuration.id}" max_size = 2 min_size = 1 name = "eks-${local.cluster_name}" vpc_zone_identifier = ["${aws_subnet.eks-private.id}", "${aws_subnet.eks-private-2.id}"] tag { key = "Environment" value = "${local.env}" propagate_at_launch = true } tag { key = "Name" value = "eks-${local.cluster_name}" propagate_at_launch = true } tag { key = "kubernetes.io/cluster/${local.cluster_name}" value = "owned" propagate_at_launch = true } } //NOTE: At this point, your Kubernetes cluster will have running masters and worker nodes, however, the worker nodes will //not be able to join the Kubernetes cluster quite yet. The next section has the required Kubernetes configuration to //enable the worker nodes to join the cluster. //Required Kubernetes Configuration to Join Worker Nodes //The EKS service does not provide a cluster-level API parameter or resource to automatically configure the underlying //Kubernetes cluster to allow worker nodes to join the cluster via AWS IAM role authentication. //To output an IAM Role authentication ConfigMap from your Terraform configuration: locals { config-map-aws-auth = <
На этом этапе вы также должны иметь полностью работать кластер EKS. На Террафом применяется
бежать, вы должны увидеть Smth, как
Apply complete! Resources: 36 added, 0 changed, 0 destroyed. Outputs:
Сделать кластер полностью работать, после предоставления вам следует:
- Получить Cluster Kublet Config через
make kubelet-config terraform output kubeconfig > kubeconfig export KUBECONFIG=/home/slavko/kubernetes/tf/kubeconfig
После этого вы должны быть в состоянии выполнить команды над вашим кластером EKS
kubectl get nodes No resources found.
- Чтобы позволить узлам присоединиться, вам нужно предоставить кластер с дополнительной картой конфигурации
make config-map-aws-auth terraform output config-map-aws-auth > config-map-aws-auth.yaml kubectl apply -f config-map-aws-auth.yaml configmap "aws-auth" created kubectl get nodes --watch NAME STATUS ROLES AGE VERSION ip-10-11-1-21.ec2.internal NotReady1s v1.10.3 ip-10-11-3-220.ec2.internal NotReady 0s v1.10.3 ... ip-10-11-1-21.ec2.internal Ready 31s v1.10.3 ip-10-11-3-220.ec2.internal Ready 31s v1.10.3
- Вы должны быть в состоянии запустить PODS и услуги
kubectl run --image busybox pod-test --restart=Never pod "pod-test" created ┌[tf]> └──➜ kubectl get pods NAME READY STATUS RESTARTS AGE pod-test 0/1 Completed 0 8s
Вопросов?
Исправление проблем …
Теперь давайте Начните SMTH
kubectl run -i --tty --image busybox dns-test --restart=Never --rm /bin/sh
Если вы видите государство в ожидании
NAME READY STATUS RESTARTS AGE dns-test 0/1 Pending 0 1m
Вы можете захотеть немедленно проверить
kubectl get events
Вы можете увидеть Smth, как
LAST SEEN FIRST SEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE 34s 5m 22 dns-test.15404a7104cc67cf Pod Warning FailedScheduling default-scheduler no nodes available to schedule pods
где в сообщении вы будете подсказнуться к проблеме
Устранение неполадок подсказки от AWS можно найти на
https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html
Оригинал: «https://www.codementor.io/@slavko/kubernetes-cluster-on-aws-eks-lecygk6rl»