如何在Kubernetes上部署MySQL資料庫

2020-08-29 Linux運維堂

Kubernetes改變了開發的方式,資料庫是應用程式的重要組成部分。在本文中,我們將展示如何在Kubernetes中部署資料庫,以及可以使用哪些方法在Kubernetes中部署資料庫。

資料庫

資料庫是一種用於在計算機系統上存儲和處理數據的系統。資料庫引擎可以在資料庫上創建,讀取,更新和刪除。資料庫由資料庫管理系統(DBMS)控制。

在大多數資料庫中,數據按行和列進行建模,稱為關係型,這種類型的資料庫在80年代佔主導地位。在2000年代,非關係資料庫開始流行,被稱為No-SQL,它們使用不同的查詢語言,並且這些類型的資料庫可用於鍵值對。

StatefulSet

在本文中,我們將在Kubernetes中部署資料庫,因此我們必須了解什麼是StatefulSet。

StatefulSet是用於管理有狀態應用程式的工作負載。它管理一組Pod的實現和擴展,並保證這些Pod的順序和唯一性。

像Deployment一樣,StatefulSet也管理具有相同容器規範的一組Pod。由StatefulSets維護的Pod具有唯一的,持久的身份和穩定的主機名,而不用管它們位於哪個節點上。如果我們想要一個跨存儲的持久性,我們可以創建一個持久性卷並將StatefulSet用作解決方案的一部分。即使StatefulSet中的Pod容易發生故障,存儲卷與新Pod進行匹配也很容易。

StatefulSet對於需要以下一項或多項功能的應用程式很有價值:

  • 穩定的唯一網絡標識符。
  • 穩定,持久的存儲。
  • 有序,順暢的部署和擴展。
  • 有序的自動滾動更新。

在Kubernetes上部署資料庫時,我們需要使用StatefulSet,但是使用StatefulSet有一些局限性:

  • 需要使用持久性存儲卷為Pod提供存儲。
  • 刪除副本或按比例縮小副本將不會刪除附加到StatefulSet的存儲卷。存儲卷確保數據的安全性。
  • StatefulSet當前需要Headless Service 來負責Pod的網絡標識。
  • 與Deployment 不同,StatefulSet不保證刪除StatefulSet資源時刪除所有Pod,而Deployment在被刪除時會刪除與Deployment關聯的所有Pod。在刪除StatefulSet之前,你必須將pod副本數量縮小到0 。

Kubernetes上的資料庫

我們可以將資料庫作為有狀態應用程式部署到Kubernetes。通常,當我們部署Pod時,它們具有自己的存儲空間,但是該存儲空間是短暫的-如果容器被殺死了,則其存儲空間將隨之消失。

因此,我們需要有一個Kubernetes資源對象來解決這種情況:當我們想要數據持久化時,我們就把Pod和持久化存儲卷聲明關聯。通過這種方式,如果我們的容器被殺死了,我們的數據仍將位於集群中,新的pod也能夠相應地訪問數據。

Pod -> PVC-> PV

  • PV =持久性存儲
  • PVC =持久性存儲聲明

Operators將資料庫部署到Kubernetes

  • 我們可以使用由Oracle開發的Kubernetes Operators來部署MySQL資料庫:

https://github.com/oracle/mysql-operator

  • 使用Crunchydata開發的PostgreSQL Operators,、將PostgreSQL部署到Kubernetes:

https://github.com/CrunchyData/postgres-operator

  • 使用MongoDB開發的Operators,可將MongoDB Enterprise部署到Kubernetes集群:

https://github.com/mongodb/mongodb-enterprise-kubernetes

在Kubernetes上部署資料庫是否可行?

在當今世界上,越來越多的公司致力於容器技術。在進行深入研究之前,讓我們回顧一下用於運行資料庫的選項。

1.完全託管的資料庫

完全託管的資料庫是那些不用自己來管理的資料庫-這種管理可以由AWS Google,Azure或Digital Cloud等雲提供商完成。託管資料庫包括Amazon Web Services,Aurora DynamoDB或Google Spanner等。

使用這些完全託管的資料庫的優勢是操作少,雲提供商可以處理許多維護任務,例如備份,擴展補丁等。你只需創建資料庫即可構建應用程式,其他的由雲提供商幫你處理。

2.在VM或本地自行部署

使用此選項,你可以將資料庫部署到任何虛擬機(EC2或Compute Engine),並且將擁有完全控制權。你將能夠部署任何版本的資料庫,並且可以設置自己的安全性和備份計劃。

另一方面,這意味著你將自行管理,修補,擴展或配置資料庫。這將增加基礎架構的成本,但具有靈活性的優勢。

3.在Kubernetes上運行

在Kubernetes中部署資料庫更接近full-ops選項,但是從Kubernetes提供的自動化方面來看,你將獲得一些好處–能夠保持資料庫應用程式的正常運行。

要注意,pod是短暫的,因此資料庫應用程式重新啟動或失敗的可能性更大。另外,你將負責更具體的資料庫管理任務,例如備份,擴展等。

選擇在Kubernetes上部署資料庫時要考慮的一些重要點是:

  • 有一些自定義資源和 operators可用於在Kubernetes上管理資料庫。
  • 具有緩存層和瞬時態存儲的資料庫更適合Kubernetes。
  • 你必須了解資料庫中可用的複製模式。異步複製模式為數據丟失留有空間,因為事務可能會提交給主資料庫,而不會提交給從資料庫。

上面,我們用一個簡單的圖表來顯示在Kubernetes上部署資料庫時的決策。

首先,我們需要嘗試了解資料庫是否具有與Kubernetes友好的功能,例如MySQL或PostgreSQL,然後我們查找kubernetes operators將資料庫與其他功能打包在一起。

第二個問題是-考慮到在Kubernetes中部署資料庫需要多少工作量,這是可以接受的?我們是否有一個運維團隊,或者在託管資料庫上部署資料庫是否可行?

在Kubernetes上部署有狀態應用程式:

步驟1:部署MySQL服務

apiVersion: v1kind: Servicemetadata:name: mysqlspec:ports:- port: 3306selector:app: mysqlclusterIP: None

首先,我們在埠3306上為MySQL資料庫部署服務,所有Pod均具有標籤鍵app: mysql。

接下來,創建以下資源:

Kubectl create -f mysql_service.yaml

步驟2:部署MySQL Deployment


apiVersion: apps/v1 Use secret in real usage- name: MYSQL_ROOT_PASSWORDvalue: passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pv-claim

此Deployment在3306埠上創建帶有MySQL5.6鏡像和密碼(使用secret)的Pod。我們還將附加一個持久卷mysql-pv-claim,將在接下來的步驟中進行顯示。

創建資源:


Kubectl create -f mysql_deployment.yaml

第3步:創建持久卷

apiVersion: v1kind: PersistentVolumemetadata:name: mysql-pv-volumelabels:type: localspec:storageClassName: manualcapacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: &34;

這將創建一個持久卷,我們將使用它來附加到容器,以確保Pod重啟時的數據安全。該持久卷具有ReadWriteOne訪問模式,擁有20GB的存儲空間,存放路徑是/ mnt/data,我們所有的數據都將保存在該路徑中。

創建以下資源:

Kubectl create -f persistence_volume.yaml

第4步:創建持久卷聲明

apiVersion: v1kind: PersistentVolumeClaimmetadata:name: mysql-pv-claimspec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 20Gi

該聲明從上面創建的「持久卷」中聲明20GB,並具有與上面的「持久卷」相同的訪問模式。

創建以下資源:

Kubectl create -f pvClaim.yaml

步驟5:測試MySQL資料庫

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

此命令在運行MySQL的集群中創建一個新的Pod,並連接到MySQL伺服器。如果連接成功,則說明你的MySQL資料庫已啟動並正在運行。

Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: falseIf you don't see a command prompt, try pressing enter.mysql>

以上完整代碼存放在這個位置:https://github.com/zarakM/mysql-k8.git

總結

  • 有狀態應用程式是存儲用戶會話狀態的應用程式,保存的數據稱為應用程式狀態。
  • StatefulSet是一個Kubernetes資源對象,用於管理有狀態應用程式,並提供有關Pod順序和唯一性的保證。
  • 通過刪除StatefulSet,不會刪除StatefulSet中的pod。相反如果刪除,你必須將有狀態應用程式副本數量縮小為0。
  • Kubernetes上的資料庫部署有一個持久存儲卷,只要你的集群正在運行,該存儲卷就可以永久存儲數據。這意味著它可以抵禦pod的破壞,並且創建的任何新pod將能夠再次使用該存儲卷。
  • 完全託管的資料庫是由雲提供商管理的資料庫。我們不必管理資料庫。這些資料庫需要額外的費用,但是如果你想專注於應用程式,它們是最佳選擇。
  • 你可以通過VM部署資料庫。但你將必須處理所有資料庫操作,例如擴展,設置和修補。
  • 最後,我們展示了如何在Kubernetes上部署資料庫。

譯者:王延飛

原文連結:https://www.magalix.com/blog/kubernetes-and-database

相關焦點

  • 把Spring Cloud Data Flow部署在Kubernetes上,再跑個任務試試
    1 前言Spring Cloud Data Flow在本地跑得好好的,為什麼要部署在Kubernetes上呢?主要是因為Kubernetes能提供更靈活的微服務管理;在集群上跑,會更安全穩定、更合理利用物理資源。
  • kubernetes部署PXC集群
    PXC集群到kubernetes1、下載部署文件git clone -b v1.5.0 https://github.com/percona/percona-xtradb-cluster-operator
  • Kubernetes-應用部署問題定位和處理
    作者:Daniel_Ji 來源: Kubernetes 中文社區原文連結: https://www.kubernetes.org.cn/4354.html1、應用部署問題處理的整體思路在將容器化的應用部署到Kubernetes
  • 如何部署一個生產級別的 Kubernetes 應用
    原理首先要部署 Wordpress 應用,我們肯定需要知道 Wordpress 是如何運行起來的,Wordpress 是一個基於 PHP 和 MySQL到這裡我們應該就清楚應該如何去運行 Wordpress 了,一個能夠解析 PHP 的程序,和 MySQL 資料庫就可以了,我們要想在 Kubernetes 系統中來運行,肯定需要使用到 Docker 鏡像了,對於 Wordpress 應用程式本身官方提供了鏡像 https://hub.docker.com/_/wordpress,也給出了說明如何運行,可以通過一系列環境變量去指定 MySQL 資料庫的配置
  • 如何在K8S上備份和恢復MySQL
    越來越多的生產系統和關鍵應用運行在K8S上。在生產系統運行有狀態應用,並不是一件容易的事情,它需要我們仔細的計劃並部署。我們之前有一篇文章專門介紹如何在K8S上運行高可用的MySQL。這次我們來介紹下如何備份和恢復MySQL。當我們在生產環境中備份和恢復MySQL,我們需要思考下面的問題:我們需要備份哪些K8S對象?我如何備份我的持久卷(PVs)?
  • 如何部署一個Kubernetes集群
    正是基於這樣的痛點,在志願者的推動下Kubernetes社區終於發起了kubeadm這一獨立的一鍵部署工具,使用kubeadm我們可以通過幾條簡單的指令來快速地部署一個kubernetes集群。後面的內容,就將具體演示如何使用kubeadm來部署一個Kubernetes集群。
  • 在 Kubernetes 上部署 Vault
    本文就將來介紹如何使用 HashiCorp Vault 在 Kubernetes 集群中進行秘鑰管理。Vault 介紹Vault 是用於處理和加密整個基礎架構秘鑰的中心管理服務。可以作為事後證據成為被入侵的線索資料庫和 API 秘鑰不再散落在代碼各處安裝同樣為了方便我們這裡還是使用 Helm3 在 Kubernetes 集群上安裝 Vault,對應的環境版本如下所示:$ helm versionversion.BuildInfo
  • MySQL 資料庫如何改名?
    最近客戶諮詢了我一個關於如何更改 MySQL 庫名的問題。其實如何安全的更改資料庫名,是個非常棘手的問題,特別是針對 MySQL 來資料庫來說。今天梳理出來,供大家參考。 更改資料庫名大致上有以下幾種方案: 一、mysqldump 導入導出 要說最簡單的方法,就是直接用 mysqldump 工具,在舊庫導出再往新庫導入(最原始、最慢、最容易想到)的方法: 舊庫 yttdb_old 導出(包含的對象
  • 教你使用Prometheus監控MySQL與MariaDB
    在 Kubernetes 環境中如何使用 Prometheus 來對它們進行監控呢?通常是藉助開源的 mysqld-exporter 來實現,本文將圍繞這個主題展開詳細介紹下。mysqld-exporter在部署 mysqld-exporter 之前首先保證 MySQL 或 MariaDB 已經部署,可以在集群內,也可以在集群外,或者使用現成的雲服務。
  • 雲原生下,如何實現高可用的MySQL?
    如何用 Cloud Native 的設計原則,通過沙箱隔離、計算和數據的完全分離,實現低成本、可擴展、高可用的 Cloud RDS 方案?阿里雲資料庫團隊的姜杉彪(孟宇)同學將介紹一種雲原生分布式 MySQL 高可用資料庫方案,分享其中的關鍵技術,並對雲原生場景下傳統資料庫的發展趨勢做簡要分析。
  • MySQL資料庫怎麼升級 MySQL資料庫升級教程
    邏輯方式升級邏輯方式升級其實就是通過邏輯備份工具(例如mysqldump工具)將資料庫、表、其他相關對象及數據邏輯備份成SQL腳本,再將其還原至MySQL5. 7 的實例中。詳細步驟如下:1.1  備份資料庫當前資料庫的版本為MySQL5.6.27,現在準備備份
  • Milvus 實戰 | 基於 Kubernetes 的分布式集群部署方案
    https://milvus.io/cn/docs/v0.10.0/mishards.md本文將主要介紹如何在集群內部配置 StorageClass 實現共享存儲,如何使用 Helm 或 kubectl 部署 Milvus 集群,最後通過在集群外部訪問 Milvus 服務測試集群。
  • MySQL資料庫高可用集群搭建-PXC集群部署
    集群是有節點組成的,推薦配置至少3個節點,但是也可以運行在2個節點上。PXC原理描述:分布式系統的CAP理論:C:一致性,所有的節點數據一致A:可用性,一個或者多個節點失效,不影響服務請求P:分區容忍性,節點間的連接失效,仍然可以處理請求其實,任何一個分布式系統,需要滿足這三個中的兩個。
  • 使用docker備份mysql資料庫
    所以,資料庫備份在生產上是必不可少的,下面我們來了解下在docker環境下mysql資料庫的備份是如何做的。一、資料庫容器假設我們在伺服器上部署了一個mysql docker容器實例,容器名為mysql,如下圖
  • 如何搭建MySQL資料庫系統
    假如要編譯一些老的程序,還是會經常碰到,在TTY下登錄主機上MySQL需要。如下圖:3)MySQL 5.X 系列版本需要cmake編譯安裝,所以先安裝cmake包(從cmake官網可以下載源碼包)。如下圖:2.創建運行用戶為了加強資料庫服務的權限控制,建議使用專門的運行用戶,如mysql。
  • Windows Server系統部署MySQL資料庫
    由於工作需要在阿里雲伺服器中使用MySQL,所以安裝一下MySQL資料庫最新版本mysql-8.0.18-windows x64部署手冊 【公眾號dotNet工控上位機:thinger_swj】踩坑1:執行mysqld命令時,發現系統不認這個命令
  • 如何使用MySQL資料庫
    如何使用MySQL資料庫前言:前面我們已經了解了如何搭建MySQL資料庫,那麼接下來我們就一起來了解一下,如何使用MySQL資料庫。MySQL資料庫系統也是一個典型的C/S(客戶端/伺服器)架構應用,要訪問MySQL資料庫需要使用專門的客戶端軟體。在linux系統中,最簡單、易用的MySQL客戶端軟體是其自帶的MySQL命令工具。
  • 一個簡單的Kubernetes應用部署示例
    說明我們通過一個簡單的示例來說明如何在Kubernets中部署一個應用,一個Spring Boot項目提供資料庫的增刪改查操作一個Mysql資料庫持久化數據​通過Eclipse構建一個Spring Boot項目以下簡稱demo,其中連接mysql的property文件application-k8s.properties內容如下:spring.datasource.url=jdbc
  • 小白windows 部署 Nginx 並虛擬主機配置 和 mySQL 的部署
    總結:本次中學習了如何在 windows 2012伺服器上配置 nginx 並嘗試配置了虛擬主機。本次中一共有三個重點:第一,如何下載 Nginx第二,如何配置 Nginx第三,如何重啟 Nginx.二、mysql 的部署在windows 2012 伺服器環境下配置 MySQL,並執行命令,測試能否正常使用。部署 mysql 的注意事項:安裝完成後,一定注意配置 mysql 的密碼,並進行相關的 mysql_secure_installtion 配置,以免出現安全問題。
  • 如何在 Kubernetes 集群中部署 ceph-csi
    本文詳細介紹了如何在 Kubernetes 集群中部署 ceph-csi (v3.1.0),並使用 RBD 作為持久化存儲。Ceph 版本:$ ceph versionceph version 14.2.11 (f7fdb2f52131f54b891a2ec99d8205561242cdaf) nautilus (stable)以下是詳細部署過程