輕鬆整合系列一:如何向 KubeBlocks 新增新的資料庫型別?以 Oracle MySQL 為例
KubeBlocks 可以幫助您輕鬆地管理各種不同型別的資料庫,那麼如何將一個資料庫引擎新增到 KubeBlocks 呢?從這個系列開始,我們將會講解如何透過幾個非常簡單的操作,把一個資料庫引擎當作 KubeBlocks Add-on 新增到 KubeBlocks 進行管理。本文作為這個 Add-on 教程系列的第一篇,將以 Oracle MySQL 為例,介紹如何新增你的第一個 Add-on。
Prerequisites
這個操作需要您:
-
會寫點 Yaml (例如知道 Yaml 的縮排得幾個空格)
-
懂點 Helm (例如 Helm 是幹嘛的,Helm chart 又是什麼)
-
玩過 K8s (例如知道有 Pod 這個東西,在 K8s 上用 Helm 裝過 operator)
-
瞭解 KubeBlocks 的幾個常見概念:ClusterDefinition、ClusterVersion、Cluster
Overview
本文主要介紹如何透過 KubeBlocks add-on 能力快速接入你的引擎。整個接入過程分成 3 大步:
-
規劃叢集藍圖
-
準備叢集模板
-
新增
addon.yaml
檔案
1. 規劃叢集藍圖
叢集形態:部署一個 MySQL 8.0 單節點叢集
在開始之前,我們必須先有一個叢集藍圖,知道我們想要什麼,想要的叢集長什麼樣:
-
叢集包含哪些元件
-
每個元件是什麼形態
a.有狀態/無狀態 b.單節點/多節點
在本文中,我們要部署的叢集只包含 一個元件,該元件是 有狀態,且只有一個節點。
按照 ClusterDefinition、ClusterVersion 和 Cluster 分類,我們整理下需要的資訊,如 Table 1. 所示:
Table 1. Blueprint for Oracle MySQL Cluster
名詞 | 規劃 |
---|---|
ClusterDefinition | 啟動指令碼:預設 配置檔案:預設 服務埠:3306 Component 個數:1,即 MySQL |
ClusterVersion | Image: http:// docker.io/mysql:8.0.34 |
Cluster.yaml | 由使用者建立時指定。 |
2. 準備叢集模板
2.1 建立 Helm chart
有兩種方式可以建立 Helm chart:
Opt 1. helm create oracle-mysql
Opt 2. 直接建立一個資料夾 mkdir oracle-mysql
其主要包含以下檔案內容:
> tree oracle-mysql
.
├── Chart.yaml # A YAML file containing information about the chart
├── templates # A directory of templates that, when combined with values, will generate valid Kubernetes manifest files.
│ ├── NOTES.txt # OPTIONAL: A plain text file containing short usage notes
│ ├── _helpers.tpl # A place to put template helpers that you can re-use throughout the chart
│ ├── clusterdefinition.yaml
│ └── clusterversion.yaml
└── values.yaml # The default configuration values for this chart
2 directories, 6 files
我們這裡著重分析
template
下的 Yaml 檔案。
templates 目錄下只有兩個 Yaml 檔案
clusterDefintion.yaml
和
clusterVersion.yaml
。前者描述元件拓撲,後者描述元件版本資訊。
2.2 ClusterDefinition
看上去很長,接下來我們說明下各個欄位的用途。
ConnectionCredential
connectionCredential:
username: root
password: "$(RANDOM_PASSWD)"
endpoint: "$(SVC_FQDN):$(SVC_PORT_mysql)"
host: "$(SVC_FQDN)"
port: "$(SVC_PORT_mysql)"
會建立一個 secret,其命名規則為
{clusterName}-conn-credential
。它主要在其他服務訪問該叢集時使用,包含使用者名稱、密碼、endpoint、port 等常規資訊。 (這個 secret 會先於其他資源建立,因此我們可以在其他地方引用該物件。)
$(RANDOM_PASSWD)
建立時會替換為一個隨機密碼。
$(SVC_PORT_mysql)
其中
mysql
為埠名,透過選擇埠名來指定要暴露的埠號。這裡為
mysql
。
ComponentDefs
componentDefs:
- name: mysql-compdef
characterType: mysql
workloadType: Stateful
service:
ports:
- name: mysql
port: 3306
targetPort: mysql
podSpec:
containers:
...
componentDefs
,即元件定義(Component Definitions),它定義了每個元件執行所需的基本資訊,包括啟動指令碼、配置、埠等等。
這裡我們只有一個 MySQL 元件。為了方便區分,我們把它命名為:
mysql-compdef
,表示這是 MySQL 的一個元件定義。
name [必選]
元件名稱,沒有特定標準,選擇一個易區分有表達力的名稱就行。
如果我們將拓撲、版本、和資源解耦 (就像資料庫中的 table normalize), 不僅可以讓每一個物件描述的資訊都更清晰和聚焦, 而且還可以透過這些物件的組合來生成更豐富的叢集。
因此,我們可以將 Cluster 表示為:
這個 name 就是那個 join key。
記住這個 name,後面要考的。
characterType [可選]
characterType
是一個字串型別,用來識別這是一個什麼引擎,例如
mysql
、
postgresql
、
redis
是預定義的幾種引擎型別。主要用於資料庫連線,資料庫操作時,能快速識別引擎型別,找到匹配的操作命令。
這可以是一個任意字串,你也可以給你的引擎一個獨特的名稱。前期我們沒有資料庫引擎相關的操作,可以空缺。
workloadType [必選]
顧名思義就是 Workload 型別。K8s 提供了幾個基礎款:Deployment,StatefulSet 等。
Kubeblocks 在這基礎上做了抽象並提供了更豐富的 Workload。比如:
-
Stateless,無狀態服務
-
Stateful,有狀態服務
-
Consensus,有狀態服務,且有自選舉能力,有角色
更深入的 Workload 介紹我們之後會單獨介紹 (包括設計、實現、如何使用等)。
因為我們這裡使用的是單節點的 MySQL,因此使用
Stateful
就足夠了。
service [可選]
service:
ports:
- name: mysql # 埠名 mysql,connectionCredential 會查詢這個名稱找到對應的 port
port: 3306
targetPort: mysql
定義如何為該元件建立一個 Service,暴露哪些埠。
還記得 connectionCredential 中介紹的,叢集對外暴露的 port 和 endpoint 嗎? 透過$(SVC_PORT_mysql)$
來選擇埠,mysql
就是這裡的service.ports[0].name
mysql。
⚠️ 注意:如果 connectionCredential 中填寫了埠名,必須確保埠名有出現在這裡。
podSpec
podSpec 的定義和 Kubernetes 的 podSpec 相同。
podSpec:
containers:
- name: mysql-container
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /var/lib/mysql
name: data
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_HOST
value: {{ .Values.auth.rootHost | default "%" | quote }}
- name: MYSQL_ROOT_USER
valueFrom:
secretKeyRef:
name: $(CONN_CREDENTIAL_SECRET_NAME)
key: username
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: $(CONN_CREDENTIAL_SECRET_NAME)
key: password
我們這裡定義了只包含一個 container 的 Pod,即
mysql-container
,以及所需的環境變數、埠等常規資訊。
有一點需要指出的是:
$(CONN_CREDENTIAL_SECRET_NAME)
是一個 placeholder,用來指代我們前文中提到的 Connection credential Secret。
我們從名為
$(CONN_CREDENTIAL_SECRET_NAME)
的 secret 中獲取使用者名稱和密碼作為 pod environment variable。
2.3 ClusterVersion
所有版本相關的資訊都配置在
ClusterVersion.yaml
中。
我們需要為每一個 Component 需要的每一個 container 補充 image 資訊。
clusterDefinitionRef: oracle-mysql
componentVersions:
- componentDefRef: mysql-compdef
versionsContext:
containers:
- name: mysql-container
image: {{ .Values.image.registry | default "docker.io" }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}
imagePullPolicy: {{ default .Values.image.pullPolicy "IfNotPresent" }}
還記得我們在 ClusterDefinition 中採用的 ComponentDef Name 嗎?對,
mysql-compdef
。
我們在這裡填寫該元件的每一個 container 的 image 資訊。
寫好了 ClusterDefinition 和 ClusterVersion,我們可以快速測試一下,在本地安裝一下試試。
2.4 安裝 Helm chart
Helm Install
helm install oracle-mysql ./path-to-your-helm-chart/oracle-mysql
成功安裝後,可以看到如下資訊:
NAME: oracle-mysql
LAST DEPLOYED: Wed Aug 2 20:50:33 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
2.5 建立叢集
透過
kbcli cluster create
,就可以快速拉起一個 MySQL Cluster。
kbcli cluster create mycluster --cluster-definition oracle-mysql
Info: --cluster-version is not specified, ClusterVersion oracle-mysql-8.0.34 is applied by default
Cluster mycluster created
透過
--cluster-definition
指定你的 ClusterDefinition 名字即可。
因為只有一個 ClusterVersion 物件關聯該 ClusterDefinition。若未指定,
kbcli
在建立叢集時,會使用該 ClusterVersion。
如果有多個 ClusterVersion 物件該關聯 ClusterDefinition,則需要顯式指定。
然後你就可以:
A. 檢視叢集狀態
kbcli cluster list mycluster
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mycluster default oracle-mysql oracle-mysql-8.0.34 Delete Running Aug 02,2023 20:52 UTC+0800
B. 連線叢集
kbcli cluster connect mycluster
Connect to instance mycluster-mysql-compdef-0
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.34 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
C. 簡單運維,例如 Scale-Up
kbcli cluster vscale mycluster --components mysql-compdef --cpu='2' --memory=2Gi
D. 簡單運維,例如 Stop
Stop時會釋放所有計算資源。
kbcli cluster stop mycluster
3. 新增
addon.yaml
檔案
還有最後一步,你就可以透過 KubeBlocks 平臺釋出你的資料庫叢集,讓更多的使用者快速建立你定義的叢集。
那就是新增一個 add-on 檔案,成為 KubeBlocks add-on 的一員。
參考
tutorial-1-create-an-addon/oracle-mysql-addon.yaml
apiVersion: extensions.kubeblocks.io/v1alpha1
kind: Addon
metadata:
name: tutorial-mysql
spec:
description: 'MySQL is a widely used, open-source....'
type: Helm
helm:
chartsImage: registry-of-your-helm-chart
installable:
autoInstall: false
defaultInstallValues:
- enabled: true
我們透過 chartsImage 來配置你的 Helm chart 遠端倉庫地址。
4. 釋出到 KubeBlocks 社群 (可選)
你可以將 Helm chart 和
addon.yaml
貢獻到 KubeBlocks 社群 。
-
你的 Helm chart:放在
kubeblocks/deploy
目錄下。 -
你的
addon.yaml
:放在kubeblocks/deploy/helm/templates/addons
目錄下。
總結
本文以 Oracle MySQL 為例,介紹如何建立你的 add-on,並且釋出到 KubeBlocks 社群。
透過簡單的配置,你就可以快速建立一個 MySQL 單節點叢集,並進行簡單的運維。
Appendix
A.1 如何為同一個引擎配置多個版本?
我們在日常生產環境中碰到的一個常見問題就是:要支援多個版本。而在 KubeBlocks 中可以透過 多個 ClusterVersion 關聯同一個 ClusterDefinition 的方式來解決這個問題。
以本文中的 MySQL 為例。
1. 修改 ClusterVersion.yaml 檔案,支援多個版本
apiVersion: apps.kubeblocks.io/v1alpha1
kind: ClusterVersion
metadata:
name: oracle-mysql-8.0.32
spec:
clusterDefinitionRef: oracle-mysql ## 關聯同一個 clusterdefinition: oracle-mysql
componentVersions:
- componentDefRef: mysql-compdef
versionsContext:
containers:
- name: mysql-container
image: <image-of-mysql-8.0.32> ## 映象地址為 8.0.32
---
apiVersion: apps.kubeblocks.io/v1alpha1
kind: ClusterVersion
metadata:
name: oracle-mysql-8.0.18
spec:
clusterDefinitionRef: oracle-mysql ## 關聯同一個 clusterdefinition: oracle-mysql
componentVersions:
- componentDefRef: mysql-compdef
versionsContext:
containers:
- name: mysql-container
image: <image-of-mysql-8.0.18> ## 映象地址為 8.0.18
2. 建立 Cluster 時,指定版本資訊
-
建立一個 8.0.32 版本的叢集
kbcli cluster create mycluster --cluster-definition oracle-mysql --cluster-version oracle-mysql-8.0.32
-
建立一個 8.0.18 版本的叢集
kbcli cluster create mycluster --cluster-definition oracle-mysql --cluster-version oracle-mysql-8.0.18
這樣就可以快速為你的引擎實現多版本支援了。
A.2 kbcli 建立 Cluster 不能滿足需求?
kbcli
提供了一套便捷且通用的方案來建立叢集。建立時會設定一些值,例如資源大小。但這並不能滿足每個引擎的需求,尤其是當的叢集包含多個元件,且需要選擇性使用時。
你可以再用一個 Helm chart 來渲染 Cluster,或者透過
cluster.yaml
檔案來建立,例如:
piVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: default
spec:
clusterDefinitionRef: oracle-mysql # 指定 ClusterDefinition
clusterVersionRef: oracle-mysql-8.0.32 # 指定 ClusterVersion
componentSpecs: # 開始列舉要用的元件
- componentDefRef: mysql-compdef # 第一個元件,它的元件型別為:mysql-compdef
name: mysql-comp # 第一個元件,名為 mysql-comp
replicas: 1
resources: # 指定 cpu 和 memory 大小
limits:
cpu: "1"
memory: 1Gi
requests:
cpu: "1"
memory: 1Gi
volumeClaimTemplates: # 設定 PVC 資訊,這裡的 name 必須和 ComponentDef 中的對應
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
terminationPolicy: Delete
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70035809/viewspace-3001541/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 輕鬆整合系列三:如何在 KubeBlocks 中配置引數模板|以 Oracle MySQL 為例BloCOracleMySql
- 輕鬆整合系列二:如何在 KubeBlocks 中建立備份並恢復?以 Oracle MySQL 為例BloCOracleMySql
- 新霸哥帶你輕鬆玩轉Oracle資料庫Oracle資料庫
- 帶你輕鬆接觸”DB2″資料庫中的資料型別DB2資料庫資料型別
- 輕鬆學會 React 鉤子:以 useEffect() 為例React
- 以MongoDB為例與關係型資料庫比較MongoDB資料庫
- 向資料庫中插入一條新的資料,並返回新增資料的ID資料庫
- 應用開發實踐之關係型資料庫(以MySql為例)小結資料庫MySql
- MySQL入門系列:MySQL資料型別MySql資料型別
- 如何驗證Oracle資料庫中表的型別Oracle資料庫型別
- 輕鬆接觸Oracle資料庫中的Kill sessionOracle資料庫Session
- 以Lgwr Worker為例,基於Strace 分析 Oracle 資料庫行為的方法Oracle資料庫
- 10個教程教你輕鬆備份MySQL資料庫MySql資料庫
- 資料從Oracle向Mysql資料遷移例項OracleMySql
- Jboss3.0-Tomcat4.03的資料庫的配置(以Oracle為例) (轉)S3Tomcat資料庫Oracle
- 分散式資料庫入門:以國產資料庫 TDSQL 為例分散式資料庫SQL
- 建立一個MySQL資料庫中的datetime型別MySql資料庫型別
- 輕鬆地將PHP會話儲存在MySQL資料庫PHP會話MySql資料庫
- 建立一種新的資料型別資料型別
- MySQL資料庫int型別的那些事MySql資料庫型別
- oracle例項和資料庫的區別Oracle資料庫
- MySQL(二) 資料庫資料型別詳解MySql資料庫資料型別
- 輕鬆上雲系列之一:本地資料遷移上雲
- MySQL 資料庫的對庫的操作及其資料型別悔鋒MySql資料庫資料型別
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- MySql輕鬆入門系列————第一站 從原始碼角度輕鬆認識mysql整體MySql原始碼
- MySQL 的資料型別MySql資料型別
- MySQL的資料型別MySql資料型別
- 輕量&聚焦:精益資料治理實踐——以客戶資料治理為例
- 資料庫重構之路,以 OrientDB 到 NebulaGraph 為例資料庫
- 《卸甲筆記》-PostgreSQL和Oracle的資料型別的對比系列四:大資料型別筆記SQLOracle資料型別大資料
- rhel5 mysql 資料庫_列_資料型別MySql資料庫資料型別
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 5分鐘,輕鬆搞定Oracle資料庫等保測評Oracle資料庫
- 非常規方法,輕鬆應對Oracle資料庫危急異常Oracle資料庫
- MYSQL資料庫型別與JAVA型別對應關係MySql資料庫型別Java
- oracle將表中date資料型別修改為timestamp資料型別Oracle資料型別
- Java 資料型別和 MySql 資料型別對應一覽表JavaMySQL 資料型別