Provisionamento
O Kubernetes requer um conjunto de máquinas para hospedar o plano de controle do Kubernetes e os nós de trabalho onde os contêineres são executados. , vamos provisionar os recursos de computação para executar o cluster Kubernetes seguro e altamente disponível.
Rede
O modelo de rede do Kubernetes propõe uma rede em que contêineres e nós podem se comunicar uns com os outros. Nos casos em que isso não é desejado, as políticas de rede podem limitar como os grupos de contêineres podem se comunicar uns com os outros e com a rede externa.
VPC
Uma rede Virtual Private Cloud (VPC) dedicada será configurada para hospedar o cluster Kubernetes. com o nome kubernetes-the-hard-way e Uma sub-rede será provisionada com um intervalo de endereços IP grande o suficiente para atribuir um endereço IP privado a cada nó no cluster Kubernetes
VPC_ID=$(aws ec2 create-vpc --cidr-block 10.0.0.0/16 --output text --query 'Vpc.VpcId') echo "$VPC_ID" aws ec2 create-tags --resources ${VPC_ID} --tags Key=Name,Value=kubernetes-the-hard-way aws ec2 modify-vpc-attribute --vpc-id ${VPC_ID} --enable-dns-support '{"Value": true}' aws ec2 modify-vpc-attribute --vpc-id ${VPC_ID} --enable-dns-hostnames '{"Value": true}'
Sub Rede
SUBNET_ID=$(aws ec2 create-subnet \ --vpc-id ${VPC_ID} \ --cidr-block 10.0.1.0/24 \ --output text --query 'Subnet.SubnetId') echo "$SUBNET_ID" aws ec2 create-tags --resources ${SUBNET_ID} --tags Key=Name,Value=kubernetes
Gateway
INTERNET_GATEWAY_ID=$(aws ec2 create-internet-gateway --output text --query 'InternetGateway.InternetGatewayId') echo "$INTERNET_GATEWAY_ID" aws ec2 create-tags --resources ${INTERNET_GATEWAY_ID} --tags Key=Name,Value=kubernetes aws ec2 attach-internet-gateway --internet-gateway-id ${INTERNET_GATEWAY_ID} --vpc-id ${VPC_ID}
Rotas
ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id ${VPC_ID} --output text --query 'RouteTable.RouteTableId') echo "$ROUTE_TABLE_ID" aws ec2 create-tags --resources ${ROUTE_TABLE_ID} --tags Key=Name,Value=kubernetes aws ec2 associate-route-table --route-table-id ${ROUTE_TABLE_ID} --subnet-id ${SUBNET_ID} aws ec2 create-route --route-table-id ${ROUTE_TABLE_ID} --destination-cidr-block 0.0.0.0/0 --gateway-id ${INTERNET_GATEWAY_ID}
Regras de Segurança(AKA FIREWALL RULES)
Criaremos uma regra de firewall que permita a comunicação interna em todos os protocolos.
SECURITY_GROUP_ID=$(aws ec2 create-security-group \ --group-name kubernetes \ --description "Kubernetes security group" \ --vpc-id ${VPC_ID} \ --output text --query 'GroupId') echo "$SECURITY_GROUP_ID" aws ec2 create-tags --resources ${SECURITY_GROUP_ID} --tags Key=Name,Value=kubernetes aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol all --cidr 10.0.0.0/16 aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol all --cidr 10.200.0.0/16 aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol tcp --port 22 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol tcp --port 6443 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol tcp --port 443 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id ${SECURITY_GROUP_ID} --protocol icmp --port -1 --cidr 0.0.0.0/0
Balanceador de carga
LOAD_BALANCER_ARN=$(aws elbv2 create-load-balancer \ --name kubernetes \ --subnets ${SUBNET_ID} \ --scheme internet-facing \ --type network \ --output text --query 'LoadBalancers[].LoadBalancerArn') echo "$LOAD_BALANCER_ARN" TARGET_GROUP_ARN=$(aws elbv2 create-target-group \ --name kubernetes \ --protocol TCP \ --port 6443 \ --vpc-id ${VPC_ID} \ --target-type ip \ --output text --query 'TargetGroups[].TargetGroupArn') aws elbv2 register-targets --target-group-arn ${TARGET_GROUP_ARN} --targets Id=10.0.1.1{0,1,2} echo "$TARGET_GROUP_ARN" aws elbv2 create-listener \ --load-balancer-arn ${LOAD_BALANCER_ARN} \ --protocol TCP \ --port 443 \ --default-actions Type=forward,TargetGroupArn=${TARGET_GROUP_ARN} \ --output text --query 'Listeners[].ListenerArn'
Acesso Público - Balanceador de carga
Alocaremos um endereço IP estático que será anexado ao balanceador de carga externo voltado para os servidores da API Kubernetes:
KUBERNETES_PUBLIC_ADDRESS=$(aws elbv2 describe-load-balancers \ --load-balancer-arns ${LOAD_BALANCER_ARN} \ --output text --query 'LoadBalancers[].DNSName') echo "$KUBERNETES_PUBLIC_ADDRESS"
Imagem Padrão
As instâncias criadas usando o Ubuntu Server 20.04, que tem bom suporte para o tempo de execução do contêiner containerd.
IMAGE_ID=$(aws ec2 describe-images --owners 099720109477 \ --filters \ 'Name=root-device-type,Values=ebs' \ 'Name=architecture,Values=x86_64' \ 'Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*' \ | jq -r '.Images|sort_by(.Name)[-1]|.ImageId') echo "$IMAGE_ID"
Chaves SSH
Vamos gerar chaves ssh para acessar as máquinas.
aws ec2 create-key-pair --key-name kubernetes --output text --query 'KeyMaterial' > kubernetes.id_rsa ls kubernetes.id_rsa chmod 600 kubernetes.id_rsa
Criação das Instâncias (Máquinas)
Cada instância de computação será provisionada com um endereço IP privado fixo para simplificar o processo de inicialização do Kubernetes.
Controllers (controller-0, controller-1, controller-2)
for i in 0 1 2; do instance_id=$(aws ec2 run-instances \ --associate-public-ip-address \ --image-id ${IMAGE_ID} \ --count 1 \ --key-name kubernetes \ --security-group-ids ${SECURITY_GROUP_ID} \ --instance-type t2.micro \ --private-ip-address 10.0.1.1${i} \ --user-data "name=controller-${i}" \ --subnet-id ${SUBNET_ID} \ --block-device-mappings='{"DeviceName": "/dev/sda1", "Ebs": { "VolumeSize": 50 }, "NoDevice": "" }' \ --output text --query 'Instances[].InstanceId') aws ec2 modify-instance-attribute --instance-id ${instance_id} --no-source-dest-check aws ec2 create-tags --resources ${instance_id} --tags "Key=Name,Value=controller-${i}" echo "controller-${i} created " done
Workers (worker-0, worker-1, worker-2)
Cada worker requer uma alocação de sub-rede de pod do intervalo definido CIDR do cluster Kubernetes. A alocação de sub-rede do pod será usada para configurar a rede do contêiner.
O intervalo CIDR é definido pela sinalização --cluster-cidr do Controller Manager. que será definido como 10.200.0.0/16, que oferece suporte a 254 sub-redes.
for i in 0 1 2; do instance_id=$(aws ec2 run-instances \ --associate-public-ip-address \ --image-id ${IMAGE_ID} \ --count 1 \ --key-name kubernetes \ --security-group-ids ${SECURITY_GROUP_ID} \ --instance-type t2.micro \ --private-ip-address 10.0.1.2${i} \ --user-data "name=worker-${i}|pod-cidr=10.200.${i}.0/24" \ --subnet-id ${SUBNET_ID} \ --block-device-mappings='{"DeviceName": "/dev/sda1", "Ebs": { "VolumeSize": 50 }, "NoDevice": "" }' \ --output text --query 'Instances[].InstanceId') aws ec2 modify-instance-attribute --instance-id ${instance_id} --no-source-dest-check aws ec2 create-tags --resources ${instance_id} --tags "Key=Name,Value=worker-${i}" echo "worker-${i} created" done