基於minikube的kubernetes集羣部署及Vitess最佳實踐

簡介

minikube是一個能夠很容易在本地運行Kubernetes集羣的工具, minikube在電腦上的虛擬機內運行單節點Kubernetes集羣,能夠很方便的供Kubernetes平常開發使用;minikube在Linux下是部署須要依賴VirtualBox或者KVM,本文中所說的是基於KVM驅動搭建單機集羣環境。
minikube運行的大體結構以下:
Alt texthtml

minikube環境搭建

minikube安裝

Minikube使用go語言編寫,發佈形式是一個獨立的二進制文件,所以只須要下載,而後放到對應的位置便可正常使用。node

# 下載minikube-linux-amd64文件 $ wget https://storage.googleapis.com/minikube/releases/v0.16.0/minikube-linux-amd64 # 增長可執行權限 $ chmod +x minikube-linux-amd64 # 將可執行文件移動到/usr/local/bin $ mv minikube-linux-amd64 /usr/local/bin/minikube # 查看版本確認是否安裝成功 $ minikube version # minikube version: v0.16.0

kubectl安裝

kubectl一樣是go語言編寫, 發佈形式是一個獨立的二進制文件,咱們只須要下載該文件就能夠正常使用。mysql

# 下載kubectl文件 $ wget http://storage.googleapis.com/kubernetes-release/release/v1.3.0/bin/linux/amd64/kubectl # 增長可執行權限 $ chmod +x kubectl # 移動文件到/usr/local/bin下 $ mv kubectl /usr/local/bin # 查看版本確認安裝成功 $ kubectl version

docker-machine-driver-kvm安裝

docker-machine-driver-kvm是提供在kvm虛擬機上安裝docker的驅動程序,二進制發佈,能夠直接下載使用。linux

# 下載驅動 $ wget https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.7.0/docker-machine-driver-kvm # 增長可執行權限 $ chmod +x docker-machine-driver-kvm # 移動文件到/usr/local/bin $ mv docker-machine-driver-kvm /usr/local/bin

kvm驅動安裝

安裝kvm驅動主要是爲了在本機運行kvm虛擬機, kvm驅動須要根據本身系統到官網下載對應的驅動進行安裝。 minikube官方對kvm驅動的安裝說明請參考: kvm驅動
如下是我我的整理的須要安裝的內容:git

# centos 系統 # 安裝驅動 $ yum install libvirt-daemon-kvm kvm # 安裝驅動相關工具 $ yum install libguestfs libguestfs-tools libvirt # ubuntu 系統 # 安裝驅動和相應的工具 $ sudo apt install libvirt-bin qemu-kvm

啓動kvm相關服務

kvm安裝好後須要啓動相應的服務才能保證虛擬機正常啓動使用github

$ libvirtd -d
$ systemctl start virtlogd.socket

啓動minikube

經過上面的安裝下面咱們就能夠正常啓動minikube了,因爲minikube啓動參數比較多,如下咱們只列出兩條,簡單說明下,須要詳細瞭解請自行閱讀minikube幫助文檔,幫助信息能夠經過如下命令查看:web

$ minikube -h

正常啓動命令sql

# 正常啓動minikube服務,指定驅動;不開啓日誌 # --vm 參數指定了須要使用的驅動程序, linux下默認使用的是virtualbox程序來啓動, 因爲virtualbox操做安裝問題較多,因此這裏選用了kvm # 能夠藉助kvm強大的命令行工具集合來操做, 方便快捷 $ minikube start --vm-driver=kvm

開啓日誌啓動命令docker

# 啓動minikube而且開啓日誌, --v參數是能夠指定minikube的日誌級別 # --v=0 INFO level logs # --v=1 WARNING level logs # --v=2 ERROR level logs # --v=3 libmachine logging # --v=7 libmachine --debug level logging $ minikube start --v=7 --vm-driver=kvm

以上只說明瞭--v和--vm參數的使用說明,因爲minikube涉及的參數比較多,使用的時候能夠根據本身須要查看幫助文檔,或者參考官方說明。本文只列出了linux下的部署說明,windows和mac系統下請參閱官方說明shell

通過上面的步驟我就能夠正常使用minikube和kubectl來管理操做咱們的集羣了。

集羣操做經常使用命令

kubectl相關

# 命令會返回當前kubernetes 已經建立的pods列表,主要會顯示如下信息 # NAME READY STATUS RESTARTS AGE $ kubectl get pod # NAME READY STATUS RESTARTS AGE # etcd-global-9002d 1/1 Running 0 2d # etcd-global-l3ph8 1/1 Running 0 2d # etcd-global-psj52 1/1 Running 0 2d
  • 查看pod詳細信息
# 使用pod名稱查看pod的詳細信息, 主要是容器的詳細信息 $ kubectl describe pod etcd-global-9002d
  • 查詢部署列表
# 獲取部署列表 $ kubectl get deployment
  • 刪除部署
# 刪除名稱爲etcd-minikube的部署 $ kubectl delete deployment etcd-minikube

容器相關

  • 拉取容器鏡像
# 拉取遠端名稱爲test的鏡像 $ docker pull test # docker pull vitess/etcd:v2.0.13-lite # docker pull vitess/lite
  • 查看容器列表
# 查看當前啓動的容器列表 $ docker ps # 返回如下信息 # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • 登陸容器
# 經過容器ID登陸容器 $ docker exec -it 容器ID /bin/bash  # docker exec -it 66f92ed4befb /bin/bash
  • 保存容器鏡像
# 保存已經下載下來的容器到文件,xxx是鏡像名稱(REPOSITORY)  $ docker save -o xxx.tar xxx 
  • 加載鏡像
# 加載導出的鏡像文件 $ docker load --input xxx.tar

若是有多個鏡像文件,可使用腳本進行批量導入

$ ls -l | awk -F ' ' '{print "docker load --input="$NF}' | sh

kvm相關

kvm命令也不少,下面介紹部分命令,詳細的命令信息能夠參見virsh -h

  • 啓動虛擬機
### 啓動已經建立的虛擬機xxxx $ virsh start xxxx
  • 暫停虛擬機
# 暫停正在運行的虛擬機xxx $ virsh suspend xxxx
  • 設置虛擬機內存
# 修改內存 $ virsh setmem xxxxx 512000
  • 恢復掛起(暫停)的虛擬機
$ virsh resume xxxx
  • 修改虛擬機配置文件

    上面所說的修改內存還有一種方法是能夠直接修改運行中的虛擬機的配置文件,以達到修改對應參數的效果,修改配置文件相對於其餘命令來講比較好用,kvm虛擬機配置都是以xml格式配置的,咱們可使用virsh edit直接修改。

    # 使用以下命令就會顯示配置文件編輯窗口,對應的xml文件記錄了虛擬機的各類參數, 修改完成重啓虛擬機便可生效 $ virsh edit xxxx
  • 其餘

    在使用minikube經過kvm建立虛擬機的時候,文件virbr1.status記錄着對應的ip信息,若是出現ip衝突能夠修改如下文件進行處理,保證如下文件只有一個惟一的ip便可。

$ vim /var/lib/libvirt/dnsmasq/virbr1.status

Vitess部署

本文假定用戶已經具有本地部署Vitess的經驗,須要將Vitess部署在Kubernetes,因此對於相關的環境依賴就不在作過多的說明; 若是有不明白的地方請先參閱官方文檔。

編譯安裝vtctlclient

vtctlclient工具能夠用來向Vitess發送命令, 因此安裝環境前咱們須要先安裝vtctlclient

  $ go get github.com/youtube/vitess/go/cmd/vtctlclient

該命令會在$GOPATH/src/github.com/youtube/vitess/目錄下下載而且編譯vtctlclient源碼, 同時也會把編譯好的vtctlclient二進制文件拷貝到目錄$GOPATH/bin下。

本地kubectl

若是正常按照文檔說明安裝,本地`kubectl`就應該已經安裝完成,這裏咱們須要再次校驗一下,確保`kubectl`處於正常可用狀態。
檢查`kubectl`是否已經正常安裝並設置環境變量PATH:
``` sh
$ which kubectl
### example output:
# /usr/local/bin/kubectl
```

若是kubectl沒有包含在$PATH環境變量中, 就須要設置`KUBECTL`環境變量,不然執行啓動腳本的時候沒法獲取`kubectl`位置。

``` sh
$ export KUBECTL=/export/working/bin/kubectl
```

啓動Vitess集羣

1. 跳轉到本地Vitess源代碼目錄

通過上面的步驟後,咱們就能夠嘗試着運行Vitess官方提供的實例了, 切換到$GOPATH/src/github.com/youtube/vitess/examples/kubernetes目錄下:
``` sh
$ cd $GOPATH/src/github.com/youtube/vitess/examples/kubernetes
```
  1. 修改本地配置

    運行configure.sh腳原本生成config.sh文件,config.sh用於自定義的集羣設置。對於備份官方支持兩種方式file和gcs方式,咱們這裏使用file方式建立備份。

    vitess/examples/kubernetes$ ./configure.sh
    ### example output: # Vitess Docker image (leave empty for default) []: # Backup Storage (file, gcs) [gcs]: file # Root directory for backups (usually an NFS mount): /backup # NOTE: You must add your NFS mount to the vtctld-controller-template # and vttablet-pod-template as described in the Kubernetes docs: # http://kubernetes.io/v1.0/docs/user-guide/volumes.html#nfs

    注意: 對於使用file方式備份的咱們須要在vttablet和vtctld pod中安裝一個讀寫網絡卷, 能夠經過NFS(Network File System)將任何存 儲服務mount到Kubernetes中;這樣咱們就能夠很方便的備份了。

  2. 啓動etcd集羣

    Vitess拓撲服務存儲Vitess集羣中全部服務器的協做元數據, 他將此數據存儲在支持數據一致性的分佈式存儲系統中。本例中咱們使用etcd來存儲,注意:咱們須要本身的etcd集羣,與Kubernetes自己使用的集羣分開。

    vitess/examples/kubernetes$ ./etcd-up.sh
    ### example output: # Creating etcd service for global cell... # service "etcd-global" created # service "etcd-global-srv" created # Creating etcd replicationcontroller for global cell... # replicationcontroller "etcd-global" created # ...

    這條命令建立了兩個集羣, 一個是全局數據中心集羣,另外一個是本地數據中心集羣。你能夠經過運行如下命令來檢查羣集中pods的狀態:

    $ kubectl get pods
    ### example output: # NAME READY STATUS RESTARTS AGE # etcd-global-8oxzm 1/1 Running 0 1m # etcd-global-hcxl6 1/1 Running 0 1m # etcd-global-xupzu 1/1 Running 0 1m # etcd-test-e2y6o 1/1 Running 0 1m # etcd-test-m6wse 1/1 Running 0 1m # etcd-test-qajdj 1/1 Running 0 1m

    Alt text

    Kubernetes節點第一次下載須要的Docker鏡像的時候會耗費較長的時間, 在下載鏡像的過程當中Pod的狀態是Pending狀態。

    注意: 本例中, 每一個以-up.sh結尾的腳本都有一個以-down.sh結尾的腳本相對應。 你能夠用來中止Vitess集羣中的某些組件,而不會關閉整個集羣;例如:移除etcd的部署可使用一下命令:

    vitess/examples/kubernetes$ ./etcd-down.sh
  3. 啓動vtctld vtctld提供了檢查Vitess集羣狀態的相關接口, 同時還能夠接收vtctlclient的RPC命令來修改集羣信息。

    vitess/examples/kubernetes$ ./vtctld-up.sh
    ### example output: # Creating vtctld ClusterIP service... # service "vtctld" created # Creating vtctld replicationcontroller... # replicationcontroller "vtctld" create createdd
  4. 使用vtctld web界面

    在Kubernetes外面使用vtctld須要使用kubectl proxy在工做站上建立一個通道。

    注意: proxy命令是運行在前臺, 因此若是你想啓動proxy須要另外開啓一個終端。

    $ kubectl proxy --port=8001
    ### example output: # Starting to serve on localhost:8001

    你能夠在本地打開vtctld web界面:

    http://localhost:8001/api/v1/proxy/namespaces/default/services/vtctld:web/

    界面截圖以下:
    Alt text

    同時,還能夠經過proxy進入Kubernetes Dashboard, 監控nodes, pods和服務器狀態:

    http://localhost:8001/ui 控制檯截圖以下:
    Alt text

  5. 啓動vttablets

    tablet是Vitess擴展的基本單位。tablet由運行在相同的機器上的vttablet 和 mysqld組成。 咱們在用Kubernetes的時候經過將vttablet和mysqld的容器放在單個pod中來實現耦合。

    運行如下腳本以啓動vttablet pod,其中也包括mysqld:

    vitess/examples/kubernetes$ ./vttablet-up.sh
    ### example output: # Creating test_keyspace.shard-0 pods in cell test... # Creating pod for tablet test-0000000100... # pod "vttablet-100" created # Creating pod for tablet test-0000000101... # pod "vttablet-101" created # Creating pod for tablet test-0000000102... # pod "vttablet-102" created # Creating pod for tablet test-0000000103... # pod "vttablet-103" created # Creating pod for tablet test-0000000104... # pod "vttablet-104" created

    啓動後在vtctld Web管理界面中很快就會看到一個名爲test_keyspacekeyspace,其中有一個名爲0的分片。點擊分片名稱能夠查看 tablets列表。當5個tablets所有顯示在分片狀態頁面上,就能夠繼續下一步操做。注意,當前狀態tablets不健康是正常的,由於在tablets上面尚未初始化數據庫。

    tablets第一次建立的時候, 若是pod對應的node上還沒有下載對應的Vitess鏡像文件,那麼建立就須要花費較多的時間。一樣也能夠經過命令行使用kvtctl.sh查看tablets的狀態。

    vitess/examples/kubernetes$ ./kvtctl.sh ListAllTablets test
    ### example output: # test-0000000100 test_keyspace 0 spare 10.64.1.6:15002 10.64.1.6:3306 [] # test-0000000101 test_keyspace 0 spare 10.64.2.5:15002 10.64.2.5:3306 [] # test-0000000102 test_keyspace 0 spare 10.64.0.7:15002 10.64.0.7:3306 [] # test-0000000103 test_keyspace 0 spare 10.64.1.7:15002 10.64.1.7:3306 [] # test-0000000104 test_keyspace 0 spare 10.64.2.6:15002 10.64.2.6:3306 []

    Alt text

  6. 初始化MySQL數據庫

    一旦全部的tablets都啓動完成, 咱們就能夠初始化底層數據庫了。

    注意: 許多vtctlclient命令在執行成功時不返回任何輸出。

    首先,指定tablets其中一個做爲初始化的master。Vitess會自動鏈接其餘slaves的mysqld實例,以便他們開啓從master複製數據; 默認數據庫建立也是如此。 由於咱們的keyspace名稱爲test_keyspace,因此MySQL的數據庫會被命名爲vt_test_keyspace

    vitess/examples/kubernetes$ ./kvtctl.sh InitShardMaster -force test_keyspace/0 test-0000000100
    ### example output: # master-elect tablet test-0000000100 is not the shard master, proceeding anyway as -force was used # master-elect tablet test-0000000100 is not a master in the shard, proceeding anyway as -force was used

    注意: 由於分片是第一次啓動, tablets尚未準備作任何複製操做, 也不存在master。若是分片不是一個全新的分片,InitShardMaster命令增長-force標籤能夠繞過應用的完整性檢查。

    tablets更新完成後,你能夠看到一個 master, 多個 replica 和 rdonly tablets:

    vitess/examples/kubernetes$ ./kvtctl.sh ListAllTablets test
    ### example output: # test-0000000100 test_keyspace 0 master 10.64.1.6:15002 10.64.1.6:3306 [] # test-0000000101 test_keyspace 0 replica 10.64.2.5:15002 10.64.2.5:3306 [] # test-0000000102 test_keyspace 0 replica 10.64.0.7:15002 10.64.0.7:3306 [] # test-0000000103 test_keyspace 0 rdonly 10.64.1.7:15002 10.64.1.7:3306 [] # test-0000000104 test_keyspace 0 rdonly 10.64.2.6:15002 10.64.2.6:3306 []

    replica tablets一般用於提供實時網絡流量, 而 rdonly tablets一般用於離線處理, 例如批處理做業和備份。 每一個tablet type的數量能夠在配置腳本vttablet-up.sh中配置。

  7. 建立表

    vtctlclient命令能夠跨越keyspace裏面的全部tablets來應用數據庫變動。如下命令能夠經過文件create_test_table.sql的內容來建立表:

    # Make sure to run this from the examples/kubernetes dir, so it finds the file. vitess/examples/kubernetes$ ./kvtctl.sh ApplySchema -sql "$(cat create_test_table.sql)" test_keyspace

    建立表的SQL以下所示:

    CREATE TABLE messages ( page BIGINT(20) UNSIGNED, time_created_ns BIGINT(20) UNSIGNED, message VARCHAR(10000), PRIMARY KEY (page, time_created_ns) ) ENGINE=InnoDB

    咱們能夠經過運行此命令來確認在給定的tablet上表是否建立成功,test-0000000100ListAllTablets命令顯示 tablet列表中一個tablet的別名:

    vitess/examples/kubernetes$ ./kvtctl.sh GetSchema test-0000000100
    ### example output: # { # "DatabaseSchema": "CREATE DATABASE `{{.DatabaseName}}` /*!40100 DEFAULT CHARACTER SET utf8 */", # "TableDefinitions": [ # { # "Name": "messages", # "Schema": "CREATE TABLE `messages` (\n `page` bigint(20) unsigned NOT NULL DEFAULT '0',\n `time_created_ns` bigint(20) unsigned NOT NULL DEFAULT '0',\n `message` varchar(10000) DEFAULT NULL,\n PRIMARY KEY (`page`,`time_created_ns`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8", # "Columns": [ # "page", # "time_created_ns", # "message" # ], # ...
  8. 執行備份

    如今, 數據庫初始化已經應用, 能夠開始執行第一次備份了。在他們連上master而且複製以前, 這個備份將用於自動還原運行的任何其餘副本。 若是一個已經存在的tablet出現故障,而且沒有備份數據, 那麼他將會自動從最新的備份恢復而且恢復複製。

    選擇其中一個 rdonly tablets而且執行備份。由於在數據複製期間建立快照的tablet會暫停複製而且中止服務,因此咱們使用 rdonly 代替 replica。

    vitess/examples/kubernetes$ ./kvtctl.sh Backup test-0000000104

    備份完成後,能夠經過一下命令查詢備份列表:

    vitess/examples/kubernetes$ ./kvtctl.sh ListBackups test_keyspace/0
    ### example output: # 2017-02-21.142940.test-0000000104
  9. 初始化Vitess路由

    在本例中, 咱們只使用了沒有特殊配置的單節點數據庫。所以,咱們只須要確保當前配置的服務處於可用狀態。 咱們能夠經過運行如下命令完成:

    vitess/examples/kubernetes$ ./kvtctl.sh RebuildVSchemaGraph

    (此命令執行完成後將不顯示任何輸出)

  10. 啓動vtgate

    Vitess經過使用vtgate來路由每一個客戶端的查詢到正確的vttablet。 在KubernetesIn中vtgate服務將鏈接分發到一個vtgatepods池中。pods由replication controller來制定。

    vitess/examples/kubernetes$ ./vtgate-up.sh
    ### example output: # Creating vtgate service in cell test... # service "vtgate-test" created # Creating vtgate replicationcontroller in cell test... # replicationcontroller "vtgate-test" created
  11. 說明

    到目前位置,咱們總體的Vitess環境就搭建好了,可使用命令鏈接服務進行測試,也能夠本身部署對應的應用進行測試。 測試用例能夠參考官方提供的測試用例

其餘

基礎環境的搭建徹底是依賴於Kubernetes, 如下列出了對應的Kubernetes文檔, 有須要的能夠根據須要進行查閱。
[Kubernetes中文文檔](https://www.kubernetes.org.cn/k8s)
[Kubernetes官方文檔](https://kubernetes.io/docs/)
相關文章
相關標籤/搜索