Рубрики
Uncategorized

Доступ к Amazon RDS от AWS EKS

Содержимое Настройка предпосылки базы данных MySQL — Amazon RDS Создайте VPC Create the … Помечено AWS, Kubernetes, Database, DevOps.

Содержимое

  1. Предпосылка
  2. Настройка базы данных MySQL — Amazon RDS

    1. Создайте VPC
    2. Создайте подсети
    3. Создать группу подсети DB
    4. Создать группу безопасности VPC
    5. Создайте экземпляр DB в VPC
    6. Диаграмма настройки Amazon RDS
  3. Настройка кластера EKS
  4. Давайте построим мост!

    1. Создать и принять VPC Peering Connection
    2. Обновите таблицу маршрутов EKS Cluster VPC
    3. Обновите таблицу маршрутов RDS VPC
    4. Обновите группу безопасности экземпляра RDS
  5. Проверьте соединение

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, перейдите к:

  1. Консоль VPC: https://console.aws.amazon.com/vpc/
  2. Выберите Peering Connections и нажмите на Создать Peering Connection Анкет
  3. Настройте подробности следующим образом (выберите VPC EKS как Запросестр и RDS VPC в качестве Acceping ):
  4. Нажмите на Создать пиринговое соединение
  5. Выберите 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 ресурс.

Полезные ресурсы:

  1. Визуальный калькулятор подсети
  2. JQ — Командная линия JSON Процессор
  3. Ссылка на команду AWS CLI
  4. AWS VPC Peering

Оригинал: «https://dev.to/bensooraj/accessing-amazon-rds-from-aws-eks-2pc3»