如果您的容器應用需要串連資料庫(以RDS MySQL執行個體為例),您需要設定RDS白名單,並在建立ECI Pod時傳入資料庫連接資訊。本文介紹在ACK Serverless叢集中建立ECI Pod時,如何串連RDS。
背景資訊
阿里雲關係型資料庫RDS(Relational Database Service)是一種穩定可靠、可Auto Scaling的線上資料庫服務。基於阿里雲Distributed File System和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執行個體問題。