Содержимое
- Предпосылка
Настройка базы данных MySQL — Amazon RDS
- Создайте VPC
- Создайте подсети
- Создать группу подсети DB
- Создать группу безопасности VPC
- Создайте экземпляр DB в VPC
- Диаграмма настройки Amazon RDS
- Настройка кластера EKS
Давайте построим мост!
- Создать и принять VPC Peering Connection
- Обновите таблицу маршрутов EKS Cluster VPC
- Обновите таблицу маршрутов RDS VPC
- Обновите группу безопасности экземпляра RDS
- Проверьте соединение
1. Предпосылка
При перемещении ваших услуг в экосистему Kubernetes впервые, это наилучшая практика для того, чтобы с самого начала переносить лишь хлавно.
Вот проблема, которую я должен был решить: наша служба использует Amazon RDS для MySQL Анкет И экземпляры RDS (ы), так и EK находятся в пределах своих собственных выделенных VPC . Как ресурсы, работающие в AWS EKS, общаются с базой данных?
Давайте погрузимся прямо в!
2. Настройка базы данных MySQL (Amazon RDS)
Мы будем использовать CLI AWS для настройки базы данных MySQL.
2.1 Создайте VPC
Сначала мы создадим VPC с блоком CIDR 10.0.0.0/24
которые вмещают 254 хоста в целом. Это Более чем достаточно для размещения нашего экземпляра RDS.
$ aws ec2 create-vpc --cidr-block 10.0.0.0/24 | jq '{VpcId:.Vpc.VpcId,CidrBlock:.Vpc.CidrBlock}' { "VpcId": "vpc-0cf40a5f6db5eb3cd", "CidrBlock": "10.0.0.0/24" } # Export the RDS VPC ID for easy reference in the subsequent commands $ export RDS_VPC_ID=vpc-0cf40a5f6db5eb3cd
2.2 Создайте подсети
У экземпляров RDS, запущенных в VPC, должны быть DB Subnet Group . Группы подсети DB представляют собой набор подсетей в VPC. Каждая группа подсети DB должна иметь Подсети
как минимум в двух Зоны доступности
в данном AWS Регион
Анкет
Мы разделим RDS VPC ( rds_vpc_id
) на две равные подсету: 10.0.0.0/25
и 10.0.0.128/25
Анкет
Итак, давайте создадим первую подсеть в зоне доступности AP-South-1B
:
$ aws ec2 create-subnet --availability-zone "ap-south-1b" --vpc-id ${RDS_VPC_ID} --cidr-block 10.0.0.0/25 | jq '{SubnetId:.Subnet.SubnetId,AvailabilityZone:.Subnet.AvailabilityZone,CidrBlock:.Subnet.CidrBlock,VpcId:.Subnet.VpcId}' # Response: { "SubnetId": "subnet-042a4bee8e92287e8", "AvailabilityZone": "ap-south-1b", "CidrBlock": "10.0.0.0/25", "VpcId": "vpc-0cf40a5f6db5eb3cd" }
а также Второй в зоне доступности AP-South-1A
$ aws ec2 create-subnet --availability-zone "ap-south-1a" --vpc-id ${RDS_VPC_ID} --cidr-block 10.0.0.128/25 | jq '{SubnetId:.Subnet.SubnetId,AvailabilityZone:.Subnet.AvailabilityZone,CidrBlock:.Subnet.CidrBlock,VpcId:.Subnet.VpcId}' # Response: { "SubnetId": "subnet-0c01a5ba480b930f4", "AvailabilityZone": "ap-south-1a", "CidrBlock": "10.0.0.128/25", "VpcId": "vpc-0cf40a5f6db5eb3cd" }
Каждый VPC имеет неявный маршрутизатор, который управляет тем, где направлен сетевой трафик. Каждая подсеть в VPC должна быть явно связана с таблицей маршрутов, которая управляет маршрутизацией для подсети.
Давайте продолжим и свяжем эти две подсети, которые мы создали, с таблицей маршрутов VPC:
# Fetch the route table information $ aws ec2 describe-route-tables --filters Name=vpc-id,Values=${RDS_VPC_ID} | jq '.RouteTables[0].RouteTableId' "rtb-0e680357de97595b1" # For easy reference $ export RDS_ROUTE_TABLE_ID=rtb-0e680357de97595b1 # Associate the first subnet with the route table $ aws ec2 associate-route-table --route-table-id rtb-0e680357de97595b1 --subnet-id subnet-042a4bee8e92287e8 { "AssociationId": "rtbassoc-02198db22b2d36c97" } # Associate the second subnet with the route table $ aws ec2 associate-route-table --route-table-id rtb-0e680357de97595b1 --subnet-id subnet-0c01a5ba480b930f4 { "AssociationId": "rtbassoc-0e5c3959d360c92ab" }
2.3 Создать группу подсети DB
Теперь, когда у нас есть две подсети, охватывающие две зоны доступности, мы можем пойти дальше и создать DB Subnt Group Анкет
$ aws rds create-db-subnet-group --db-subnet-group-name "DemoDBSubnetGroup" --db-subnet-group-description "Demo DB Subnet Group" --subnet-ids "subnet-042a4bee8e92287e8" "subnet-0c01a5ba480b930f4" | jq '{DBSubnetGroupName:.DBSubnetGroup.DBSubnetGroupName,VpcId:.DBSubnetGroup.VpcId,Subnets:.DBSubnetGroup.Subnets[].SubnetIdentifier}' # Response: { "DBSubnetGroupName": "demodbsubnetgroup", "VpcId": "vpc-0cf40a5f6db5eb3cd", "Subnets": "subnet-0c01a5ba480b930f4" } { "DBSubnetGroupName": "demodbsubnetgroup", "VpcId": "vpc-0cf40a5f6db5eb3cd", "Subnets": "subnet-042a4bee8e92287e8" }
2.4 Создайте группу безопасности VPC
предпоследний Шаг к созданию экземпляра DB — это создание группы безопасности VPC, виртуального брандмауэра уровня экземпляра с Правила контролировать входящий и исходящий трафик.
$ aws ec2 create-security-group --group-name DemoRDSSecurityGroup --description "Demo RDS security group" --vpc-id ${RDS_VPC_ID} { "GroupId": "sg-06800acf8d6279971" } # Export the RDS VPC Security Group ID for easy reference in the subsequent commands $ export RDS_VPC_SECURITY_GROUP_ID=sg-06800acf8d6279971
Мы будем использовать эту группу безопасности в более поздних точках, чтобы установить вход
Правило, чтобы разрешить весь трафик из кластера EKS в экземпляр RDS.
2.5 Создайте экземпляр DB в VPC
$ aws rds create-db-instance \ --db-name demordsmyqldb \ --db-instance-identifier demordsmyqldbinstance \ --allocated-storage 10 \ --db-instance-class db.t2.micro \ --engine mysql \ --engine-version "5.7.26" \ --master-username demoappuser \ --master-user-password demoappuserpassword \ --no-publicly-accessible \ --vpc-security-group-ids ${RDS_VPC_SECURITY_GROUP_ID} \ --db-subnet-group-name "demodbsubnetgroup" \ --availability-zone ap-south-1b \ --port 3306 | jq '{DBInstanceIdentifier:.DBInstance.DBInstanceIdentifier,Engine:.DBInstance.Engine,DBName:.DBInstance.DBName,VpcSecurityGroups:.DBInstance.VpcSecurityGroups,EngineVersion:.DBInstance.EngineVersion,PubliclyAccessible:.DBInstance.PubliclyAccessible}' # Respone: { "DBInstanceIdentifier": "demordsmyqldbinstance", "Engine": "mysql", "DBName": "demordsmyqldb", "VpcSecurityGroups": [ { "VpcSecurityGroupId": "sg-06800acf8d6279971", "Status": "active" } ], "EngineVersion": "5.7.26", "PubliclyAccessible": false }
Мы можем убедиться, что экземпляр DB был создан и в пользовательском интерфейсе:
2.6 Схема настройки Amazon RDS
3. Настройка кластера EKS
Раскрутить кластер EKS на AWS так же просто, как:
$ eksctl create cluster --name=demo-eks-cluster --nodes=2 --region=ap-south-1 [ℹ] using region ap-south-1 [ℹ] setting availability zones to [ap-south-1a ap-south-1c ap-south-1b] [ℹ] subnets for ap-south-1a - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ] subnets for ap-south-1c - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ] subnets for ap-south-1b - public:192.168.64.0/19 private:192.168.160.0/19 [ℹ] nodegroup "ng-ae09882f" will use "ami-09c3eb35bb3be46a4" [AmazonLinux2/1.12] [ℹ] creating EKS cluster "demo-eks-cluster" in "ap-south-1" region [ℹ] will create 2 separate CloudFormation stacks for cluster itself and the initial nodegroup [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-south-1 --name=demo-eks-cluster' [ℹ] 2 sequential tasks: { create cluster control plane "demo-eks-cluster", create nodegroup "ng-ae09882f" } [ℹ] building cluster stack "eksctl-demo-eks-cluster-cluster" [ℹ] deploying stack "eksctl-demo-eks-cluster-cluster" [ℹ] building nodegroup stack "eksctl-demo-eks-cluster-nodegroup-ng-ae09882f" [ℹ] --nodes-min=2 was set automatically for nodegroup ng-ae09882f [ℹ] --nodes-max=2 was set automatically for nodegroup ng-ae09882f [ℹ] deploying stack "eksctl-demo-eks-cluster-nodegroup-ng-ae09882f" [✔] all EKS cluster resource for "demo-eks-cluster" had been created [✔] saved kubeconfig as "/Users/Bensooraj/.kube/config" [ℹ] adding role "arn:aws:iam::account_number:role/eksctl-demo-eks-cluster-nodegroup-NodeInstanceRole-1631FNZJZTDSK" to auth ConfigMap [ℹ] nodegroup "ng-ae09882f" has 0 node(s) [ℹ] waiting for at least 2 node(s) to become ready in "ng-ae09882f" [ℹ] nodegroup "ng-ae09882f" has 2 node(s) [ℹ] node "ip-192-168-30-190.ap-south-1.compute.internal" is ready [ℹ] node "ip-192-168-92-207.ap-south-1.compute.internal" is ready [ℹ] kubectl command should work with "/Users/Bensooraj/.kube/config", try 'kubectl get nodes' [✔] EKS cluster "demo-eks-cluster" in "ap-south-1" region is ready
Мы создадим Kubernetes Сервис
названный Mysql-Service
типа Внешнее имя
псевдоним rds endpoint demordsmyqldbinstance.cimllxgykuy3.ap-south-1.rds.amazonaws.com
.
Запустить Kubectl Apply -f mysql -service.yaml
Чтобы создать сервис.
# mysql-service.yaml apiVersion: v1 kind: Service metadata: labels: app: mysql-service name: mysql-service spec: externalName: demordsmyqldbinstance.cimllxgykuy3.ap-south-1.rds.amazonaws.com selector: app: mysql-service type: ExternalName status: loadBalancer: {}
Теперь клиенты, работающие внутри стручков в кластере, могут подключаться к экземпляру RDS, используя Mysql-Service
Анкет
Давайте протестируем соединение, используя перебросы Busybox
Струк:
$ kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh If you don't see a command prompt, try pressing enter. / # nc mysql-service 3306 ^Cpunt!
Очевидно, что стручок не может пройти! Давайте решим проблему сейчас.
4. Давайте построим мост!
Мы собираемся создать VPC Peering Connection облегчить общение между ресурсами в двух VPC. Согласно документации:
A VPC Peering Connection это сетевое соединение между двумя VPC, которое позволяет направлять трафик между ними с помощью частных адресов IPv4 или адресов IPv6. Экземпляры в любом VPC могут общаться друг с другом, как будто они находятся в одной и той же сети. Вы можете создать подключение к VPC между вашими собственными VPC или с VPC в другой учетной записи AWS. VPC могут быть в разных областях (также известных как межрегионо-контактное соединение VPC).
4.1 Создать и принять подключение к VPC Peering Connection
Чтобы создать VPC Peering Connection, перейдите к:
- Консоль VPC: https://console.aws.amazon.com/vpc/
- Выберите
Peering Connections
и нажмите наСоздать Peering Connection
Анкет - Настройте подробности следующим образом (выберите VPC EKS как
Запросестр
и RDS VPC в качествеAcceping
): - Нажмите на
Создать пиринговое соединение
- Выберите
Peering Connection
что мы только что создали. Нажмите наДействия
=>Принять
Анкет Опять же, в диалоговом окне подтверждения нажмите наДа, принять
Анкет
Не забудьте экспортировать идентификатор VPC Peering Connection:
$ export VPC_PEERING_CONNECTION_ID=pcx-0cc408e65493fe197
4.2 Обновите таблицу маршрутов VPC Cluster EKS
# Fetch the route table associated with the 3 public subnets of the VPC created by `eksctl`: $ aws ec2 describe-route-tables --filters Name="tag:aws:cloudformation:logical-id",Values="PublicRouteTable" | jq '.RouteTables[0].RouteTableId' "rtb-06103bd0704b3a9ee" # For easy reference export EKS_ROUTE_TABLE_ID=rtb-06103bd0704b3a9ee # Add route: All traffic to (destination) the RDS VPC CIDR block is via the VPC Peering Connection (target) $ aws ec2 create-route --route-table-id ${EKS_ROUTE_TABLE_ID} --destination-cidr-block 10.0.0.0/24 --vpc-peering-connection-id ${VPC_PEERING_CONNECTION_ID} { "Return": true }
4.3 Обновите таблицу маршрутов RDS VPC
# Add route: All traffic to (destination) the EKS cluster CIDR block is via the VPC Peering Connection (target) $ aws ec2 create-route --route-table-id ${RDS_ROUTE_TABLE_ID} --destination-cidr-block 192.168.0.0/16 --vpc-peering-connection-id ${VPC_PEERING_CONNECTION_ID} { "Return": true }
4.4 Обновите группу безопасности экземпляра RDS
Разрешить весь проникновение трафика из кластера EKS в экземпляр RDS в порту 3306
:
$ aws ec2 authorize-security-group-ingress --group-id ${RDS_VPC_SECURITY_GROUP_ID} --protocol tcp --port 3306 --cidr 192.168.0.0/16
5. Проверьте соединение
$ kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh If you don't see a command prompt, try pressing enter. / # nc mysql-service 3306 N 5.7.26-logR&=lk`xTH???mj _5#K)>mysql_native_password
Мы можем видеть это Busybox
теперь может успешно поговорить с экземпляром RDS, используя службу Mysql-Service
Анкет
Тем не менее, это то, как выглядит наша последняя установка (много тяжелой работы, ребята):
Примечание : Эта настройка позволяет всем стручкам в кластере EKS для доступа к экземпляру RDS. В зависимости от вашего варианта использования, это может быть или не идеально подходит для вашей архитектуры. Для реализации более мелкозернистого контроля доступа, учитывая настройку Networkpolicy
ресурс.
Полезные ресурсы:
- Визуальный калькулятор подсети
- JQ — Командная линия JSON Процессор
- Ссылка на команду AWS CLI
- AWS VPC Peering
Оригинал: «https://dev.to/bensooraj/accessing-amazon-rds-from-aws-eks-2pc3»