如果您的容器應用需要連接數據庫(以RDS MySQL實例為例),您需要設置RDS白名單,并在創建ECI Pod時傳入數據庫連接信息。本文介紹在ACK Serverless集群中創建ECI Pod時,如何連接RDS。
背景信息
阿里云關系型數據庫RDS(Relational Database Service)是一種穩定可靠、可彈性伸縮的在線數據庫服務。基于阿里云分布式文件系統和SSD盤高性能存儲,RDS支持MySQL、SQL Server、PostgreSQL等多種數據庫引擎,本文使用RDS MySQL實例為例。您可以根據業務需求來選擇。更多信息,請參見數據庫引擎介紹。
前提條件
已創建RDS MySQL實例,并且在實例上配置數據庫用戶賬號。具體操作,請參見創建RDS MySQL實例和創建數據庫和賬號。
已創建ACK Serverless集群。具體操作,請參見創建集群。
說明本文以ACK Serverless集群為例,如果您使用其他類型的Kubernetes集群,請確保集群中已部署虛擬節點來對接ECI。
確保DS實例與Kubernetes集群的網絡互通。
建議RDS實例與Kubernetes集群屬于同一VPC網絡下,可以直接使用內網進行通信;如果跨VPC創建RDS實例和Kubernetes集群,則需要配置公網。
設置RDS白名單并獲取數據庫訪問地址
通過內網訪問RDS
如果您的Kubernetes集群和RDS實例在同一VPC下,則集群中的應用可以通過內網訪問RDS,您需要設置RDS白名單并獲取數據庫內網訪問地址。
通過公網訪問RDS
如果您的Kubernetes集群和RDS實例在不同的VPC下,則集群中的應用需要通過公網訪問RDS。您需要設置RDS白名單并申請數據庫外網訪問地址。
外網地址會降低實例的安全性,請謹慎使用。
為了獲得更快的傳輸速率和更高的安全性,建議您將應用遷移到與您的RDS實例在同一地域且網絡類型相同的ECI實例,然后使用內網地址。
配置應用連接RDS實例
以ACK Serverless集群使用內網連接RDS實例為例,操作如下:
登錄容器服務管理控制臺。
在集群頁面,找到目標集群,單擊集群名稱,進入集群管理頁面。
創建ConfigMap,配置RDS連接信息。
說明ConfigMap可以將您的環境配置信息和容器鏡像解耦,便于應用配置的修改。
在左側導航欄,選擇配置管理>配置項。
單擊創建。
填寫ConfigMap配置,然后單擊確定。
名稱為rds-config,要添加的配置如下:
名稱
示例值
說明
host
rm-2zem97a62s9******.mysql.rds.aliyuncs.com
數據庫連接地址,在RDS實例的數據庫連接頁面可以獲取。
port
3306
數據庫連接端口,在RDS實例的數據庫連接頁面可以獲取。
database
test-db
數據庫名稱,在RDS實例的數據庫管理頁面可以獲取。
創建Secret,添加數據庫用戶名和密碼。
說明使用Secret可以將數據庫用戶名和密碼等機密信息安全地傳遞給應用。
在左側導航欄,選擇配置管理>保密字典。
單擊創建。
填寫Secret配置,然后單擊確定。
名稱為rds-secret,要添加的配置如下:
名稱
示例值
說明
username
test
數據庫用戶名稱。在RDS實例的賬號管理頁面可以獲取。
password
pwd******
數據庫密碼。如果您忘記了密碼,在RDS實例的賬號管理頁面可以進行重置。
創建ECI Pod,測試能否連接RDS。
在左側導航欄,選擇工作負載>容器組。
單擊使用YAML創建資源。
填寫YAML,單擊創建。
由于RDS與原生的數據庫服務完全兼容,因此您可以使用任何通用的數據庫客戶端連接到RDS實例,且連接方法類似。配置示例如下:
說明如果采用配置示例進行測試,請先在RDS實例中創建username表,表中增加一個user列。
如下YAML示例通過環境變量傳入數據庫連接信息(包括數據庫連接地址、端口、名稱,以及用戶名和密碼),使用的鏡像包含了一個Python腳本,可以連接數據庫并插入數據。
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 #一個Python Job用來連接云數據庫的鏡像 imagePullPolicy: IfNotPresent command: ["/bin/bash","-c","python3 /testapp/mysqlclient.py"] env: - name: MYSQL_HOST valueFrom: configMapKeyRef: name: rds-config #ConfigMap的名稱 key: host #ConfigMap中的Key - name: MYSQL_PORT valueFrom: configMapKeyRef: name: rds-config #ConfigMap的名稱 key: port #ConfigMap中的Key - name: MYSQL_DB valueFrom: configMapKeyRef: name: rds-config #ConfigMap的名稱 key: database #ConfigMap中的Key - name: MYSQL_USERNAME valueFrom: secretKeyRef: name: rds-secret #Secret的名稱 key: username #Secret中的Key - name: MYSQL_PWD valueFrom: secretKeyRef: name: rds-secret #Secret的名稱 key: password #Secret中的Key restartPolicy: Never
上述示例的鏡像包含的Python腳本(mysqlclient.py)可以在username表的user列中插入一條數據。腳本內容如下:
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 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()
登錄數據庫,查看結果。
登錄云數據庫RDS控制臺。
在左側導航欄選擇實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄單擊數據庫管理。
找到目標數據庫。單擊對應的SQL查詢。
在彈出的對話框中,輸入數據庫用戶名和密碼,單擊登錄。
輸入SQL命令查詢結果。
執行
SELECT * FROM `username`
命令,可以看到username表的user列已新增一條數據。
常見問題
數據庫無法連接的常見場景包括:
網絡類型不同
專有網絡不同
域名解析失敗或錯誤
地域不同
IP白名單設置有誤
只讀實例未設置白名單
內外網地址使用錯誤
連接數已滿
用戶名或密碼錯誤
無法解析地址
請根據當前環境的實際情況(內網或外網),選擇對應的排查方法。更多信息,請參見解決無法連接RDS實例問題。