Содержимое
- Предпосылка
Настройка базы данных 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»