利用Kubernetes搭建便攜式開發環境之MySQL和Redis

以前給你們介紹過, 我本身用的開發環境都是容器化的,只不過前兩年不會用K8,大部分都是用的 Docker 或者 Docker-Compose。隨着這一年多對 K8 的學習和工做中的使用,一直有想法用K8 作一套便攜式開發環境,之後換電腦就不用再愁數據庫、緩存、隊列這些基礎軟件的安裝了。正好下個月我就能換新的辦公電腦啦,也不能拿『能用就行』的理由再拖延下去了。node

若是問你 「 平時開發程序依賴最多的基礎軟件時啥?」,我猜大部分人會回答:「MySQL 和 Redis」,畢竟萬物皆是增刪改查,成天作CURD的咱們怎麼能離開它們呢。mysql

準備工做

工具選擇

既然是要在本地 Kubernetes 上搭建開發環境,那電腦上得先有 Kubernetes 集羣才行。目前能夠在本地運行 Kubernetes 集羣的工具備:Minikube 、Kind 和 K3d ,咱們的MySQL和Redis都是靠先編寫資源定義YAML文件,再經過 kubectl 交給Kubernetes 集羣執行的,因此這三種工具用哪一種都行。git

我本身在本地使用的是Minikube,這是 Kubernetes 官方提供的工具,說實話運行起來後電腦有點卡,Minikube的安裝步驟能夠參考我之前寫的文章「Minikube-運行在筆記本電腦上的Kubernetes集羣」。另外兩種 Kind 和 K3d 則是輕量級集羣,支持多節點部署。其中我比較推薦K3d,尤爲是使用 M1芯片MacBook的同窗,如今暫時只能使用K3d安裝Kubernetes集羣。github

K3d 是使用 docker 容器在本地運行 k3s 集羣,k3s 是由 Rancher Lab 開源的輕量級 Kubernetes。k3d 完美繼承了 k3s 的簡單、快速和佔用資源少的優點,鏡像大小隻有 100 多 M,啓動速度快,支持多節點集羣。雖然 k3s 對 Kubernetes 進行了輕量化的裁剪,可是提供了完整了功能,像 Istio 這樣複雜的雲原生應用均可以在 k3s 上順利運行。sql

K3d 除了啓動速度快和佔用資源少之外,在邊緣計算和嵌入式領域也有着不俗的表現。由於 k3s 自己應用場景主要在邊緣側,因此支持的設備和架構不少,如:ARM64 和 ARMv7 處理器。不少老舊 PC 和樹莓派這樣的設備均可以拿來作成 k3s 集羣,爲本地研發測試燃盡最後的生命。docker

預備知識點

說完了安裝工具的選擇,咱們再來講一下在Kubernetes上從零搭建開發環境須要提早作哪些知識儲備,若是你已經對Kubernetes這些基礎概念已經有所瞭解能夠直接跳過去看實操環節了,若是還比較生疏的話,我建議你們先看看下面這幾篇文章,這些都是咱們搭建開發環境時須要用到的。數據庫

Kubernetes Pod入門指南後端

應用編排利器之Deploymentapi

學練結合,快速掌握Kubernetes Service緩存

用面向對象的方式管理配置文件

深刻理解StatefulSet,用Kubernetes編排有狀態應用

安裝MySQL

在正式開始在Kubernetes上安裝MySQL和Redis前我先說明下安裝這兩個基礎軟件服務的思路。

  1. 首先由於是用做開發環境,咱們就不追求高可用了,儘可能精簡。文章後面我會給出安裝主從和集羣式數據庫的一些教程連接,供你們參考。

  2. 安裝MySQL和Redis的思路是同樣的,每一個服務都由下面幾個主要的部分構成:

    ① 一個單副本 Pod 做爲運行MySQL或者Redis 的載體。

    ② 一個調度Pod用的Deployment控制器,由於服務裏只包含一個Pod,不須要維持構建的順序,因此不用使用StatefulSet做爲Pod的控制器。

    ③一個ConfigMap對象,包含了MySQL或者Redis配置文件裏須要的配置項,在建立Pod時會做爲配置文件掛載到應用所在的容器中。

    ④一個 Service 對象,將應用 Pod 做爲本身的後端端點,以始終保持不變的NodeId:NodePort 方式向外暴露服務。

下面這張圖很好的解釋了這四部分的協做關係。

MySQL on Kubernetes

解釋清楚咱們在Kubernetes上搭建MySQL和Redis開發環境的思路後,下面就能夠進入實操環節啦,我爲你們準備了能夠直接拿來使用的YAML資源定義文件。

建立MySQL配置

咱們先來建立一個名爲 mysql-db-config 的ConfigMap,稍後會把這些配置做爲 my.cnf 配置文件掛載到MySQL應用Pod的容器裏。

### 文件名 mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-db-config
  namespace: default
  labels:
    app: mysql-db-config
data:
  my.cnf: | [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' skip-character-set-client-handshake = true max_connections=2000 secure_file_priv=/var/lib/mysql datadir=/var/lib/mysql bind-address=0.0.0.0 symbolic-links=0 複製代碼

假定MySQL相關的YAML定義文件都放在 mysql-singleton 這個目錄下,經過 kubectl 把這個ConfigMap 提交給Kubernetes 進行建立便可:

kubectl apply -f mysql-singleton/mysql-configmap.yaml
複製代碼

建立MySQL容器和Service

有了MySQL配置相關的 ConfigMap後,咱們就能在建立運行MySQL的容器時,把他做爲配置文件掛載到容器中:

### 文件名 deployment-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      nodePort: 30306
      targetPort: mysql
  selector:
    app: mysql
---
apiVersion:
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: root
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
            - name: mysql-config
              mountPath: /etc/mysql/conf.d/my.cnf
              subPath: my.cnf
      volumes:
        - name: mysql-persistent-storage
          emptyDir: {}
        - name: mysql-config
          configMap:
            name: mysql-db-config
            items:
              - key: my.cnf
                path: my.cnf
複製代碼

一樣的,使用kubectl 把 YAML 提交給Kubernetes後,等資源建立完畢咱們的開發環境MySQL就算搭建好了

kubectl apply -f mysql-singleton/deployment-service.yaml
複製代碼

經過

上面的YAML文件中,有三點須要詳細說明一下:

  1. 使用 mysql-db-config 這個ConfigMap 中my.cnf這個配置項以my.cnf文件名掛載到容器中去,可是由於掛載進去後會覆蓋容器中conf.d 目錄中的內容。經過volumeMounts.subPath能夠支持選定ConfigMap中的Key-Value掛載到容器中而不覆蓋容器中原有的文件。
  2. Service 用 30306 端口向集羣外暴露了MySQL服務,客戶端從電腦上使用NodeIP:NodePort便可鏈接到這裏建立的數據庫,若是用的是Minikube建立的Kubernetes集羣, 能夠經過minikube ip 命令查到NodeIP。
  3. emptyDir 類型的數據卷的生命週期與Pod同步,這裏的同步指的是Pod被kubectl delete 主動刪除時纔會銷燬對應的數據卷,若是是Pod本身崩潰,或者是集羣Shotdown,等恢復後重建出來的Pod仍然會使用以前的數據卷,不會形成數據丟失。

在Kubernetes上建立完MySQL後,咱們能夠經過任意客戶端或者mysql命令行,鏈接MySQL服務。

mysql -uroot -proot -h {minikube-ip} -P 30306
複製代碼

安裝Redis

聊清楚了怎麼用Kubernetes建立單節點的MySQL後,對於建立單例的Redis相信你們對大體流程也就比較清楚了,惟一少的就是定義Redis服務的這些YAML文件了。我已經幫大家踩好坑了,下面這些YAML都是我在線下調試過一段時間的,而且也能正確完成Redis數據的持久化。

因爲聲明 Redis 配置的 ConfigMap 篇幅太長,爲了避免影響文章的閱讀我就把這個安裝Redis須要的YAML文件都放在GitHub上了,能夠點擊閱讀原文或者經過連接:github.com/kevinyan815… 訪問下載。

在這個倉庫裏我給出了MySQL和Redis的詳細安裝步驟,以及各類資源的YAML定義文件,包括以前安裝ETCD集羣的教程也整合到了這個倉庫裏。

安裝步驟詳解,參考 用Kubernetes搭建ETCD集羣和WebUI

關於安裝過程當中遇到的問題能夠在留言裏跟我交流,你們還想看其餘基礎軟件在Kubernetes上的安裝教程的話也能夠告訴我。

總結

這篇文章裏整理了在Kubernetes上安裝MySQL和Redis這兩款咱們經常使用的基礎軟件的操做步驟,因爲目的是在本地開發環境用,因此力求資源定義儘可能簡單,能作到數據可持久化就好了,高可用再也不這裏討論。若是你對在Kubernetes上建立MySQL集羣有興趣,能夠參考我下面給出的連接。

[MySQL Operator FOR Kubernetnes](: medium.com/oracledevs/…)

今天的文章就到這裏啦,若是喜歡個人文章就幫我點個贊吧,我會每週經過技術文章分享個人所學所見和第一手實踐經驗,感謝你的支持。微信搜索關注公衆號「網管叨bi叨」每週教會你一個進階知識。

相關文章
相關標籤/搜索