Para conectar sua aplicação conteinerizada a um banco de dados, como uma instância ApsaraDB RDS for MySQL, configure a lista de permissões da instância ApsaraDB RDS e forneça as informações de conexão com o banco de dados ao criar um pod ECI. Este tópico descreve como conectar ao ApsaraDB RDS ao criar um pod ECI em um ACK Serverless cluster.
Contexto
O ApsaraDB RDS é um service de banco de dados online estável, confiável e escalável da Alibaba Cloud. Construído sobre o sistema de arquivos distribuído da Alibaba Cloud e drives de estado sólido (SSDs) de alto desempenho, o ApsaraDB RDS suporta múltiplos mecanismos de banco de dados, como MySQL, SQL Server e PostgreSQL. Este tópico utiliza uma instância ApsaraDB RDS for MySQL como exemplo. Selecione um mecanismo de banco de dados de acordo com os requisitos do seu negócio. Para mais informações, consulte Database engines.
Pré-requisitos
Uma instância ApsaraDB RDS for MySQL foi criada e uma conta de banco de dados foi configurada para a instância. Para mais informações, consulte Create an ApsaraDB RDS for MySQL instance e Create a database and an account.
-
Um ACK Serverless cluster foi criado. Para mais informações, consulte Create an ACK Serverless cluster.
NotaEste tópico usa um ACK Serverless cluster como exemplo. Caso utilize outro tipo de cluster Kubernetes, verifique se um nó virtual está implantado no cluster para conectar ao ECI.
-
A instância ApsaraDB RDS e o cluster Kubernetes conseguem se comunicar entre si.
Para desempenho e segurança ideais, implante a instância ApsaraDB RDS e o cluster Kubernetes no mesmo Virtual Private Cloud (VPC). Isso permite a comunicação pela rede interna. Caso estejam em VPCs diferentes, configure o acesso pela rede pública.
Configurar a lista de permissões do RDS e obter o endpoint
Acessar o RDS pela rede interna
Se o cluster Kubernetes e a instância ApsaraDB RDS estiverem no mesmo VPC, a aplicação poderá acessar a instância pela rede interna. Configure a lista de permissões do ApsaraDB RDS e obtenha o endpoint interno.
-
Configure a lista de permissões do ApsaraDB RDS.
Ao conectar pela rede interna, adicione um endereço ip ou um grupo de segurança à lista de permissões:
-
Endereço ip
Adicione o bloco CIDR do VPC ou vSwitch à lista de permissões do ApsaraDB RDS. Isso permite que todas as instâncias ECI no bloco CIDR acessem a instância ApsaraDB RDS. Para mais informações, consulte Configure an IP address whitelist.
-
Grupo de segurança
Adicione o grupo de segurança das suas instâncias ECI à lista de permissões do ApsaraDB RDS. Isso permite que todas as instâncias ECI no grupo de segurança acessem a instância ApsaraDB RDS. Para mais informações, consulte Configure a security group.
-
Na página Database Connection da instância ApsaraDB RDS, localize e registre o endpoint interno.
Acessar o RDS pela rede pública
Se o cluster Kubernetes e a instância ApsaraDB RDS estiverem em VPCs diferentes, a aplicação deverá conectar pela rede pública. Configure a lista de permissões do ApsaraDB RDS e solicite um endpoint público.
O uso de um endpoint público expõe sua instância a riscos de segurança. Utilize esta opção com cautela.
Para transferência de dados mais rápida e maior segurança, recomendamos migrar sua aplicação para uma instância ECI na mesma região e rede da instância ApsaraDB RDS e, em seguida, utilizar o endpoint interno.
-
Configure a lista de permissões do ApsaraDB RDS.
Ao conectar pela rede pública, configure uma lista de permissões de endereços ip. Para mais informações, consulte Configure an IP address whitelist.
Se a instância ECI utilizar um NAT gateway para acessar a rede pública, adicione o Elastic ip address (EIP) do NAT gateway à lista de permissões de endereços ip.
Se a instância ECI utilizar um EIP para acessar a rede pública, adicione o EIP da instância ECI à lista de permissões de endereços ip.
Solicite e registre o endpoint público do banco de dados. Para mais informações, consulte Apply for or release a public endpoint.
Configurar uma aplicação para conectar ao RDS
Este procedimento mostra como conectar um ACK Serverless cluster a uma instância ApsaraDB RDS pela rede interna.
Faça login no ACK console.
Na página Cluster, localize o cluster desejado e clique em seu nome para abrir a página de detalhes do cluster.
-
Crie um ConfigMap para armazenar as informações de conexão do ApsaraDB RDS.
NotaUm ConfigMap desacopla a configuração do ambiente da imagem do contêiner, simplificando as atualizações de configuração da aplicação.
No painel de navegação à esquerda, escolha Configuration > ConfigMaps.
Clique em Create.
-
Preencha os detalhes do ConfigMap e clique em OK.
Defina o nome como
rds-confige adicione os seguintes pares de chave-valor:Parâmetro
Exemplo
Descrição
host
rm-2zem97a62s9.mysql.rds.aliyuncs.com
O endpoint do banco de dados. Disponível na página Database Connection da instância ApsaraDB RDS.
port
3306
A porta do banco de dados. Disponível na página Database Connection da instância ApsaraDB RDS.
database
test-db
O nome do banco de dados. Disponível na página Databases da instância ApsaraDB RDS.
-
Crie um Secret para armazenar o nome de usuário e a senha do banco de dados.
NotaUsar um Secret é uma prática recomendada para gerenciar informações confidenciais com segurança, como credenciais de banco de dados da sua aplicação.
No painel de navegação à esquerda, escolha Configuration > Secrets.
Clique em Create.
-
Preencha os detalhes do Secret e clique em OK.
Defina o nome como
rds-secrete adicione os seguintes pares de chave-valor:Parâmetro
Exemplo
Descrição
username
test
O nome de usuário do banco de dados. Disponível na página Accounts da instância ApsaraDB RDS.
password
pwd
A senha do banco de dados. Caso tenha esquecido a senha, redefina-a na página Accounts da instância ApsaraDB RDS.
-
Crie um pod ECI para testar a conexão.
No painel de navegação à esquerda, escolha Workloads > Pods.
Clique em Create from YAML.
-
Insira a configuração yaml e clique em Create.
O ApsaraDB RDS é totalmente compatível com services de banco de dados nativos. É possível usar qualquer cliente de banco de dados padrão para conectar à instância ApsaraDB RDS. O arquivo yaml a seguir é um exemplo:
NotaPara usar este exemplo, primeiro crie uma tabela chamada
usernamecom uma coluna chamadauserna instância ApsaraDB RDS.A configuração yaml a seguir utiliza variáveis de ambiente para fornecer os detalhes de conexão com o banco de dados: endpoint, porta, nome, nome de usuário e senha. A imagem do contêiner inclui um script Python que conecta ao banco de dados e insira dados.
apiVersion: v1 kind: Pod metadata: labels: name: rds-test name: rds-test spec: containers: - name: test-rds image: registry.cn-hangzhou.aliyuncs.com/eci_open/sqlclient:1.0.1 # A container image that contains a Python script to connect to the database. imagePullPolicy: IfNotPresent command: ["/bin/bash","-c","python3 /testapp/mysqlclient.py"] env: - name: MYSQL_HOST valueFrom: configMapKeyRef: name: rds-config # The name of the ConfigMap. key: host # The key in the ConfigMap. - name: MYSQL_PORT valueFrom: configMapKeyRef: name: rds-config # The name of the ConfigMap. key: port # The key in the ConfigMap. - name: MYSQL_DB valueFrom: configMapKeyRef: name: rds-config # The name of the ConfigMap. key: database # The key in the ConfigMap. - name: MYSQL_USERNAME valueFrom: secretKeyRef: name: rds-secret # The name of the Secret. key: username # The key in the Secret. - name: MYSQL_PWD valueFrom: secretKeyRef: name: rds-secret # The name of the Secret. key: password # The key in the Secret. restartPolicy: NeverA imagem do exemplo anterior contém um script Python (
mysqlclient.py) que insira uma linha na colunauserda tabelausername. O script é o seguinte:import pymysql import os import time config = { 'host': str(os.getenv('MYSQL_HOST')), 'port': int(os.getenv('MYSQL_PORT')), 'user': str(os.getenv('MYSQL_USERNAME')), 'password': str(os.getenv('MYSQL_PWD')), 'database': str(os.getenv('MYSQL_DB')), } def mysqlClient(): print("Connecting to the database...") db = pymysql.connect(**config) try: cursor = db.cursor() cursor.execute("INSERT INTO username(user) VALUES('Mrs')") cursor.close() db.commit() cursor = db.cursor() cursor.execute("SELECT user FROM username") result = cursor.fetchall() cursor.close() if result != None: print(result) time.sleep(99999) except Exception as e: print('System Error: ', e) finally: db.close() if __name__ == '__main__': mysqlClient()
-
Faça login no banco de dados e verifique o resultado.
Faça login no ApsaraDB RDS console.
No painel de navegação à esquerda, clique em Instances. Na barra de navegação superior, selecione a região onde sua instância está localizada e clique no ID da instância.
No painel de navegação à esquerda, clique em Databases.
Localize o banco de dados desejado e clique em SQL Query na coluna de ações.
Na caixa de diálogo exibida, insira o nome de usuário e a senha do banco de dados e clique em Log In.
-
Execute um comando SQL para verificar o resultado.
Execute o comando
SELECT * FROM. A saída exibe uma nova linha na coluna user da tabela username.
Perguntas frequentes
As causas mais comuns de falhas na conexão com o banco de dados incluem:
Tipos de rede diferentes
VPCs diferentes
Falha ou erro na resolução de nome de domínio
Regiões diferentes
Configuração incorreta da lista de permissões de endereços ip
Lista de permissões não configurada para uma instância somente leitura
Uso incorreto de endpoints internos ou públicos
Limite de conexões atingido
Nome de usuário ou senha incorretos
Impossibilidade de resolver o endpoint
Solucione o problema de acordo com seu ambiente de rede (rede interna ou rede pública). Para mais informações, consulte Troubleshoot ApsaraDB RDS connection failures.