全部產品
Search
文件中心

Elastic Container Instance:配置ECI串連RDS

更新時間:Jul 06, 2024

如果您的容器應用需要串連資料庫(以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白名單並擷取資料庫內網訪問地址。

  1. 設定RDS白名單。

    內網訪問時,白名單可以設定IP地址或安全性群組:

    • IP地址

      在RDS白名單中添加IP地址網段(VPC或交換器網段),屬於該網段的ECI執行個體均可訪問該RDS執行個體。具體操作,請參見設定IP白名單

    • 安全性群組

      在RDS白名單中添加安全性群組後,該安全性群組中的ECI執行個體均可以訪問該RDS執行個體。具體操作,請參見設定安全性群組

  2. 在RDS執行個體的資料庫連接頁面,記錄資料庫內網訪問地址。

通過公網訪問RDS

如果您的Kubernetes叢集和RDS執行個體在不同的VPC下,則叢集中的應用需要通過公網訪問RDS。您需要設定RDS白名單並申請資料庫外網訪問地址。

重要
  • 外網地址會降低執行個體的安全性,請謹慎使用。

  • 為了獲得更快的傳輸速率和更高的安全性,建議您將應用遷移到與您的RDS執行個體在同一地區且網路類型相同的ECI執行個體,然後使用內網地址。

  1. 設定RDS白名單。

    公網訪問時,需要設定IP白名單,具體操作,請參見設定IP白名單

    • 如果ECI執行個體使用NAT Gateway訪問公網,則IP白名單中需添加NAT Gateway綁定的EIP地址。

    • 如果ECI執行個體使用EIP訪問公網,則IP白名單中需添加該ECI執行個體綁定的EIP地址。

  2. 申請並記錄資料庫外網訪問地址。具體操作,請參見申請或釋放外網地址

配置應用串連RDS執行個體

ACK Serverless叢集使用內網串連RDS執行個體為例,操作如下:

  1. 登入Container Service管理主控台

  2. 叢集頁面,找到目的地組群,單擊叢集名稱,進入叢集管理頁面。

  3. 建立ConfigMap,配置RDS串連資訊。

    說明

    ConfigMap可以將您的環境配置資訊和容器鏡像解耦,便於應用配置的修改。

    1. 在左側導覽列,選擇組態管理>配置項

    2. 單擊建立

    3. 填寫ConfigMap配置,然後單擊確定

      名稱為rds-config,要添加的配置如下:

      名稱

      樣本值

      說明

      host

      rm-2zem97a62s9******.mysql.rds.aliyuncs.com

      資料庫連接地址,在RDS執行個體的資料庫連接頁面可以擷取。

      port

      3306

      資料庫連接連接埠,在RDS執行個體的資料庫連接頁面可以擷取。

      database

      test-db

      資料庫名稱,在RDS執行個體的資料庫管理頁面可以擷取。

  4. 建立Secret,添加資料庫使用者名稱和密碼。

    說明

    使用Secret可以將資料庫使用者名稱和密碼等機密資訊安全地傳遞給應用。

    1. 在左側導覽列,選擇組態管理>保密字典

    2. 單擊建立

    3. 填寫Secret配置,然後單擊確定

      名稱為rds-secret,要添加的配置如下:

      名稱

      樣本值

      說明

      username

      test

      資料庫使用者名稱稱。在RDS執行個體的帳號管理頁面可以擷取。

      password

      pwd******

      資料庫密碼。如果您忘記了密碼,在RDS執行個體的帳號管理頁面可以進行重設。

  5. 建立ECI Pod,測試能否串連RDS。

    1. 在左側導覽列,選擇工作負載>容器組

    2. 單擊使用YAML建立資源

    3. 填寫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()
  6. 登入資料庫,查看結果。

    1. 登入雲資料庫RDS控制台

    2. 在左側導覽列選擇執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

    3. 在左側導覽列單擊資料庫管理

    4. 找到目標資料庫。單擊對應的SQL查詢

    5. 在彈出的對話方塊中,輸入資料庫使用者名稱和密碼,單擊登入

    6. 輸入SQL命令查詢結果。

      執行SELECT * FROM `username` 命令,可以看到username表的user列已新增一條資料。

      對接RDS

常見問題

資料庫無法串連的常見情境包括:

  • 網路類型不同

  • 專用網路不同

  • 網域名稱解析失敗或錯誤

  • 地區不同

  • IP白名單設定有誤

  • 唯讀執行個體未設定白名單

  • 內外網地址使用錯誤

  • 串連數已滿

  • 使用者名稱或密碼錯誤

  • 無法解析地址

請根據當前環境的實際情況(內網或外網),選擇對應的排查方法。更多資訊,請參見解決無法串連RDS執行個體問題