如何使用 Kubernetes 建置可以取代 DBaaS 的混合雲

我的名字是 Petr Zaitsev,我是執行長、創辦人 佩爾科納 我想告訴你:

  • 我們如何從開源解決方案轉向資料庫即服務;
  • 在雲端部署資料庫有哪些方法;
  • Kubernetes 如何取代 DBaaS,消除供應商依賴並保持 DBMS 即服務的簡單性。

本文是根據 Mail.ru Cloud Solutions 和 Tarantool 在 @Databases Meetup 上的報告編寫的。 如果你不想看,可以看:


我們如何從開源轉向雲端中的資料庫即服務

我自 90 年代末以來一直從事開源工作。 二十年前,使用開源,例如資料庫,並不是那麼容易。 需要下載原始碼,修補它,編譯它,然後才能使用它。

隨後開源經歷了一系列的簡化:

  • tar.gz和需要編譯的INSTALL來源;
  • 具有依賴關係的軟體包,例如 .deb 和 .rpm,您只需要安裝一組軟體包;
  • APT 和 YUM 等軟體包儲存庫,可自動安裝;
  • Docker 和 Snap 等解決方案可讓您透過安裝來接收套件,而無需外部依賴。

因此,使用開源軟體變得更加容易,並且還降低了開發此類應用程式的門檻。

同時,與 20 年前的情況不同,當時每個人都是組裝專家,現在大多數開發人員無法從原始碼建立他們使用的工具。

事實上,這還不錯,因為:

  1. 我們可以使用更複雜但更用戶友好的軟體。 例如,瀏覽器使用方便,但包含許多開源元件,不方便從頭開始建置。
  2. 更多的人可以成為開源和其他軟體的開發者,更多的軟體被企業使用,對它的需求也更大。

缺點是簡化的下一步與雲端解決方案的使用有關,這會導致某種供應商鎖定,即綁定到一個供應商。 我們使用簡單的解決方案,提供者使用開源元件,但實際上它們被釘在大型雲端之一上。 也就是說,部署開源(以及與其相容的軟體)的最簡單、最快的方法是使用專有 API 在雲端。

對於雲端中的資料庫,有兩種方法:

  1. 像在常規資料中心一樣組裝資料庫基礎設施。 也就是說,採用標準構建塊:計算、儲存等,在其上安裝 Linux 和資料庫,並配置它們。
  2. 使用資料庫即服務,提供者在雲端提供現成的資料庫。

DBaaS 目前是一個快速成長的市場,因為它允許開發人員直接使用資料庫並最大限度地減少日常工作。 提供者承諾確保高可用性和輕鬆擴展、資料庫修補、備份和效能調整。

兩種基於開源的資料庫即服務和 Kubernetes 形式的替代方案

開放資料庫有兩種類型的資料庫即服務:

  1. 打包在管理後端中的標準開源產品,可輕鬆部署和管理。
  2. 具有各種附加元件的高級商業解決方案,與開源相容。

這兩種選擇都降低了雲端之間遷移的可能性,並降低了資料和應用程式的可移植性。 例如,儘管不同類型的雲端支援基本相同的標準MySQL,但它們之間在操作、效能、備份等方面存在顯著差異。 從一種雲端遷移到另一種雲端可能具有挑戰性,尤其是對於複雜的應用程式。

這裡出現了一個問題 - 是否有可能獲得資料庫即服務的便利,但作為一個簡單的開源解決方案?

不幸的是,壞消息是市場上還沒有這樣的解決方案。 好消息是 Kubernetes 可以讓您實現此類解決方案。

Kubernetes 是一個用於雲端或資料中心的作業系統,可讓您跨叢集中的多個伺服器而不是在單一主機上部署和管理應用程式。

現在 Kubernetes 是此類軟體領域的領導者。 對於此類問題有許多不同的解決方案,但它成為了標準。 許多過去專注於替代解決方案的公司現在專注於調整其產品以支援 Kubernetes。

此外,Kubernetes是一種通用解決方案,在許多供應商的私有雲、公有雲和混合雲中都得到支持,例如:AWS、Google Cloud、Microsoft Azure、 Mail.ru 雲解決方案.

Kubernetes 如何與資料庫配合使用

Kubernetes 最初是為處理資料但不儲存任何內容的無狀態應用程式而設計的,例如微服務或 Web 應用程式。 資料庫則處於另一端,即它們是有狀態的應用程式。 Kubernetes 最初並不是為此類應用程式設計的。

然而,Kubernetes 最近出現了一些允許使用資料庫和其他有狀態應用程式的功能:

  1. StatefulSet 概念是一系列用於處理有關停止 Pod 工作和實現 Graceful Shutdown(應用程式的可預測關閉)的事件的原語。
  2. 持久性磁碟區是與 pod、Kubernetes 管理物件關聯的資料儲存。
  3. Operator Framework - 即建立用於管理分佈在多個節點上的資料庫和其他有狀態應用程式的元件的能力。

現在在公有雲已經有大型資料庫即服務,其後端是 Kubernetes,例如:CockroachCloud、InfluxDB、PlanetScale。 也就是說,Kubernetes 上的資料庫不僅在理論上是可能的,而且在實踐中也是可行的。

Percona 有兩個針對 Kubernetes 的開源解決方案:

  1. Percona Server for MongoDB 的 Kubernetes Operator。
  2. Kubernetes Operator for XtraDB CLUSTER 是一個相容於 MySQL 並提供高可用性和一致性的服務。 如果不需要高可用性(例如開發資料庫),您也可以使用單一節點。

Kubernetes 使用者可以分為兩類。 有些人直接使用 Kubernetes Operators - 這些主要是高級用戶,他們非常了解該技術的工作原理。 其他人在後端運行它 - 這些用戶對資料庫即服務之類的東西感興趣,他們不想深入研究 Kubernetes 的細微差別。 對於第二組用戶,我們有另一個開源解決方案 - Percona DBaaS CLI Tool。 對於想要獲得基於 Kubernetes 的開源 DBaaS 而對技術沒有深入了解的人來說,這是一個實驗性的解決方案。

如何在 Google Kubernetes Engine 上執行 Percona 的 DBaaS

在我看來,Google Kubernetes Engine 是 Kubernetes 技術最實用的實作之一。 它在世界許多地區都可用,並具有簡單方便的命令列工具(SDK),可讓您建立腳本而不是手動管理平台。

為了讓 DBaaS 正常運作,我們需要以下元件:

  1. 庫貝克特爾。
  2. 谷歌雲端SDK。
  3. Percona DBaaS CLI。

安裝 kubectl

我們安裝適合您的作業系統的軟體包,我們將查看 Ubuntu 的範例。 更多細節 這裡.

sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl

安裝Google雲端SDK

我們以同樣的方式安裝軟體包。 更多細節 這裡.

# Add the Cloud SDK distribution URI as a package source
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] 
http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk

安裝 Percona DBaaS CLI

從 Percona 儲存庫安裝。 Percona DBaaS CLI Tool 仍然是一個實驗性產品,因此它位於實驗儲存庫中,即使您已經安裝了 Percona 儲存庫,也必須單獨啟用該工具。

這裡.

安裝演算法:

  1. 使用 percona-release 工具設定 Percona 儲存庫。 首先你需要從 Percona 下載並安裝官方的 percona-release 套件:
    wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
    sudo dpkg -i percona-release_latest.generic_all.deb
  2. 啟用實驗工具儲存庫元件,如下所示:
    sudo percona-release enable tools experimental
    
  3. 安裝 percona-dbaas-cli 軟體包:
    sudo apt-get update
    sudo apt-get install percona-dbaas-cli

設定組件的操作

有關設置的更多信息 這裡.

首先您需要登入您的 Google 帳戶。 此外,Google Cloud 允許一個使用者擁有多個獨立項目,因此您需要使用該項目的程式碼指定一個工作項目:

gcloud auth login
gcloud config set project hidden-brace-236921

接下來,我們建立一個叢集。 對於演示,我創建了一個僅包含三個節點的 Kubernetes 叢集 - 這是高可用性所需的最低限度:

gcloud container clusters create --zone us-central1-a your-cluster-name --cluster-version 1.15 --num-nodes=3

以下 kubectl 指令為目前使用者提供所需的權限:

kubectl create clusterrolebinding cluster-admin-binding-$USER 
--clusterrole=cluster-admin --user=$(gcloud config get-value core/account)

然後我們創建一個命名空間並使其處於活動狀態。 粗略地說,命名空間也類似於專案或環境,但已經位於 Kubernetes 叢集內部。 它獨立於 Google Cloud 專案:

kubectl create namespace my-namespace
kubectl config set-context --current --namespace=my-namespace

啟動叢集

完成這幾個步驟後,我們可以使用以下簡單指令啟動三節點叢集:

# percona-dbaas mysql create-db example
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     example
Resource Endpoint: example-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              Nt9YZquajW7nfVXTTrP
Status:            ready

如何連接到集群

預設情況下,它僅在 Kubernetes 內部可用。 也就是說,無法從您執行“創建”命令的伺服器存取它。 為了使其可用,例如,用於客戶端測試,您需要透過連接埠對映轉送連接埠:

kubectl port-forward svc/example-proxysql 3306:3306 $

然後我們連接你的MySQL客戶端:

mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP

高階集群管理命令

公共IP資料庫

如果您想要更持久的叢集可用性解決方案,您可以獲得外部 IP 位址。 在這種情況下,可以從任何地方存取資料庫。 這不太安全,但通常更方便。 對於外部 IP,我們使用以下命令:

# percona-dbaas mysql create-db exposed 
--options="proxysql.serviceType=LoadBalancer"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     exposed
Resource Endpoint: 104.154.133.197
Port:              3306
User:              root
Pass:              k0QVxTr8EVfgyCLYse
Status:            ready

To access database please run the following command:
mysql -h 104.154.133.197 -P 3306 -uroot -pk0QVxTr8EVfgyCLYse

明確設定密碼

您可以明確設定密碼,而不是系統隨機產生密碼:

# percona-dbaas mysql create-db withpw --password=mypassword
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     withpw
Resource Endpoint: withpw-proxysql.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              mypassword
Status:            ready

我以人類可讀的格式顯示腳本的輸出,但也支援 JSON 格式。

關閉高可用性

使用以下命令,您可以停用高可用性以部署單一節點:

# percona-dbaas mysql create-db singlenode 
--options="proxysql.enabled=false, allowUnsafeConfigurations=true,pxc.size=1"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider:          k8s
Engine:            pxc
Resource Name:     singlenode
Resource Endpoint: singlenode-pxc.my-namespace.pxc.svc.local
Port:              3306
User:              root
Pass:              22VqFD96mvRnmPMGg
Status:            ready

這是一個測試任務的解決方案,可以盡可能快速、輕鬆地啟動並運行 MySQL,對其進行測試,然後關閉它或將其用於開發。

Percona DBaaS CLI 工具可協助您在 Kubernetes 上實作類似 DBaaS 的解決方案。 同時,我們繼續致力於其功能和可用性。

該報告首次發佈於 @資料庫聚會 由 Mail.ru 雲端解決方案和 Tarantool 提供。 看 視頻 其他表演並在 Telegram 上訂閱活動公告 Mail.ru Group 圍繞 Kubernetes 展開.

關於該主題還可以閱讀什麼:

  1. 現代 IIoT 平台中的資料庫。
  2. 如何為項目選擇資料庫,這樣您就不必再次選擇。

來源: www.habr.com

添加評論