k8s (二十二) --- kubernetes Helm詳解及使用helm部署redis高可用集羣

一、Helm

Helm是Kubernetes 應用的包管理工具,主要用來管理 Charts,類似Linux系統的yum。

Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。可以在你部署應用的時候自定義應用程序的一些 Metadata,以便於應用程序的分發。

對於應用發佈者而言,可以通過 Helm 打包應用、管理應用依賴關係、管理應用版本併發布應用到軟件倉庫。

對於使用者而言,使用 Helm 後不用需要編寫複雜的應用部署文件,可以以簡單的方式在 Kubernetes 上查找、安裝、升級、回滾、卸載應用程序。

Helm當前最新版本 v3.1.2 官網:https://helm.sh/docs/intro/
在這裏插入圖片描述
Helm V3 與 V2 最大的區別在於去掉了tiller:
在這裏插入圖片描述

二、Helm安裝

安裝包的下載地址:https://github.com/helm/helm/releases,最新版本3.2.1.

下載軟件包:helm-v3.2.1-linux-amd64.tar.gz

解壓:

[root@server1 ~]# tar zxf helm-v3.2.1-linux-amd64.tar.gz 
[root@server1 ~]# cd linux-amd64/
[root@server1 linux-amd64]# ls
helm  LICENSE  README.md
[root@server1 linux-amd64]# cp helm /usr/local/bin/

使命令自動補齊:

[root@server1 linux-amd64]# echo "source <(helm completion bash)" >> ~/.bashrc
[root@server1 linux-amd64]# source ~/.bashrc

helm部署完成。

三、Helm倉庫的使用

搜索官方helm hub chart庫:

[root@server1 linux-amd64]# helm search hub redis

在這裏插入圖片描述Helm 添加第三方 Chart 庫:

添加微軟庫:

[root@server1 linux-amd64]# helm repo add stable http://mirror.azure.cn/kubernetes/charts/
"stable" has been added to your repositories

添加第三庫之後就可以使用以下方式查詢:

[root@server1 linux-amd64]# helm search repo redis

注意:加-l選項可以查看歷史版本
在這裏插入圖片描述這裏也可以添加阿里雲的庫,但是不建議,因爲阿里雲的鏡像版本比較老。

刪除第三方庫:

[root@server1 linux-amd64]# helm repo remove aliyun 
"aliyun" has been removed from your repositories

四、使用Helm部署redis-ha

拉取部署文件

[root@server1 linux-amd64]# helm pull stable/redis-ha
[root@server1 linux-amd64]# ls
helm  LICENSE  README.md  redis-ha-4.4.4.tgz

不指定標籤時默認拉取最新版本,拉取下來是一個壓縮包

解壓

[root@server1 linux-amd64]# tar zxf redis-ha-4.4.4.tgz -C /root/helm
[root@server1 linux-amd64]# cd
[root@server1 ~]# cd helm/
[root@server1 helm]# ls
redis-ha
[root@server1 helm]# cd redis-ha/
[root@server1 redis-ha]# ls
Chart.yaml  ci  OWNERS  README.md  templates  values.yaml

上述文件中README.md 爲幫助文檔,目錄templates中爲模板部署文件,部署文件中的變量都保存在values.yaml文件中,因此我們在部署應用時只需要更改values.yaml文件即可。
在這裏插入圖片描述

查看目錄結構:

[root@server1 redis-ha]# tree .
.
├── Chart.yaml
├── ci
│   └── haproxy-enabled-values.yaml
├── OWNERS
├── README.md
├── templates
│   ├── _configs.tpl
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   ├── redis-auth-secret.yaml
│   ├── redis-ha-announce-service.yaml
│   ├── redis-ha-configmap.yaml
│   ├── redis-ha-exporter-script-configmap.yaml
│   ├── redis-ha-pdb.yaml
│   ├── redis-haproxy-deployment.yaml
│   ├── redis-haproxy-serviceaccount.yaml
│   ├── redis-haproxy-servicemonitor.yaml
│   ├── redis-haproxy-service.yaml
│   ├── redis-ha-rolebinding.yaml
│   ├── redis-ha-role.yaml
│   ├── redis-ha-serviceaccount.yaml
│   ├── redis-ha-servicemonitor.yaml
│   ├── redis-ha-service.yaml
│   ├── redis-ha-statefulset.yaml
│   └── tests
│       ├── test-redis-ha-configmap.yaml
│       └── test-redis-ha-pod.yaml
└── values.yaml

更改變量文件

[root@server1 redis-ha]# vim values.yaml 

在這裏插入圖片描述
這裏需要鏡像redis: 5.0.6-alpine,更改鏡像路徑,我已經下載下來放到了私有倉庫。

在這裏插入圖片描述
還需要更改副本數,我這裏設置的2,即一主一從。
在這裏插入圖片描述

部署redis高可用集羣

支持多種安裝方式:(helm默認讀取~/.kube/config信息連接k8s集羣)

$ helm install redis-ha stable/redis-ha	
$ helm install redis-ha redis-ha-4.4.0.tgz
$ helm install redis-ha path/redis-ha
$ helm install redis-ha https://example.com/charts/redis-ha-4.4.0.tgz

$ helm pull stable/redis-ha		//拉取應用到本地

$ helm status redis-ha			//查看狀態

$ helm uninstall redis-ha			//卸載


注意:以上操作均是在默認的namespace下的示例,其他namespace需要加-n選項

我們這裏直接安裝:

[root@server1 redis-ha]# kubectl create namespace redis
namespace/redis created
[root@server1 redis-ha]# helm install redis-ha . -n redis 

其中redis-ha爲名稱,上述命令表示使用當前目錄的部署文件在redis命名空間中創建名爲redis-ha的高可用集羣。

在這裏插入圖片描述
創建後查看:

[root@server1 redis-ha]# kubectl -n redis get all
NAME                    READY   STATUS    RESTARTS   AGE
pod/redis-ha-server-0   2/2     Running   0          28s
pod/redis-ha-server-1   2/2     Running   0          19s

NAME                          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)              AGE
service/redis-ha              ClusterIP   None             <none>        6379/TCP,26379/TCP   29s
service/redis-ha-announce-0   ClusterIP   10.105.143.195   <none>        6379/TCP,26379/TCP   29s
service/redis-ha-announce-1   ClusterIP   10.101.152.37    <none>        6379/TCP,26379/TCP   29s

NAME                               READY   AGE
statefulset.apps/redis-ha-server   2/2     29s

可以看到創建了兩個pod,其中server-0爲master,還有兩個svc和一個statefulset控制器。

測試集羣高可用

每個pod中有兩個容器redis和sentinel,我們進入redis容器查看:
在這裏插入圖片描述

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh
/data $ redis-cli
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
min_slaves_good_slaves:1
slave0:ip=10.101.152.37,port=6379,state=online,offset=25236,lag=0
master_replid:4baa1ff233604d357f9a5b2d6b100f90192d309c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:25236
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:25236

使用info Replication來差可能主機信息,可以看出redis-ha-server-0爲master主機。
執行SHUTDOWN命令來使主機宕機:

127.0.0.1:6379> SHUTDOWN
command terminated with exit code 137

宕機後控制器會馬上幫我們啓動一個pod:

[root@server1 redis-ha]# kubectl get pod -n redis 
NAME                READY   STATUS    RESTARTS   AGE
redis-ha-server-0   2/2     Running   1          4m57s
redis-ha-server-1   2/2     Running   0          4m48s

繼續進入redis-ha-server-0查看

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh
/data $ redis-cli
127.0.0.1:6379> info Replication
# Replication
role:master
...

可以看出redis-ha-server-0還是master,由於pod重建太快以至於主從還沒有來得及切換。

我們再次使其宕機:

127.0.0.1:6379> SHUTDOWN
not connected> command terminated with exit code 137

這時查看pod,就可以發現pod重建的比較慢了:

[root@server1 redis-ha]# kubectl get pod -n redis 
NAME                READY   STATUS     RESTARTS   AGE
redis-ha-server-0   1/2     NotReady   1          5m41s
redis-ha-server-1   2/2     Running    0          5m32s
[root@server1 redis-ha]# kubectl get pod -n redis 
NAME                READY   STATUS     RESTARTS   AGE
redis-ha-server-0   1/2     NotReady   1          5m43s
redis-ha-server-1   2/2     Running    0          5m34s
[root@server1 redis-ha]# kubectl get pod -n redis 
NAME                READY   STATUS             RESTARTS   AGE
redis-ha-server-0   1/2     CrashLoopBackOff   1          5m54s
redis-ha-server-1   2/2     Running            0          5m45s
[root@server1 redis-ha]# kubectl get pod -n redis 
NAME                READY   STATUS    RESTARTS   AGE
redis-ha-server-0   2/2     Running   2          6m16s
redis-ha-server-1   2/2     Running   0          6m7s

等重建好了之後再次查看pod角色:

[root@server1 redis-ha]# kubectl -n redis exec -it redis-ha-server-0 -c redis -- sh
/data $ redis-cli
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:10.101.152.37
master_port:6379
...

可以看出redis-ha-server-0已經變成了從機,而主機的ip爲10.101.152.37,這時就實現了主從的切換。

訪問master主機:

/data $ nslookup redis-ha.redis.svc.cluster.local			#通過解析查看master主機
nslookup: can't resolve '(null)': Name does not resolve

Name:      redis-ha.redis.svc.cluster.local
Address 1: 10.244.1.127 redis-ha-server-0.redis-ha.redis.svc.cluster.local
Address 2: 10.244.2.109 10-244-2-109.redis-ha-announce-1.redis.svc.cluster.local
/data $ redis-cli -h redis-ha-announce-1.redis.svc.cluster.local
redis-ha-announce-1.redis.svc.cluster.local:6379> info Replication
# Replication
role:master
connected_slaves:1
min_slaves_good_slaves:1
slave0:ip=10.105.143.195,port=6379,state=online,offset=57996,lag=1
master_replid:f475aa004c2eb055a0a19b59e52e88cf90b6219d
master_replid2:564b948de16fb4db8b30a8a57c3d64d447b1252f
master_repl_offset:57996
second_repl_offset:7242
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:594
repl_backlog_histlen:57403
redis-ha-announce-1.redis.svc.cluster.local:6379> 

可以看出redis-ha-server-1變成了master主機,有一個slave主機。

集羣的動態拉伸

可以直接更改變量文件中的副本數量實現集羣的動態拉伸:

[root@server1 redis-ha]# vim values.yaml

在這裏插入圖片描述
將副本數更改爲3.

使用upgrade選項更新集羣:

[root@server1 redis-ha]# helm -n redis upgrade redis-ha .

更新後查看pod可以看出已經變成了3個:

[root@server1 redis-ha]# kubectl -n redis get pod
NAME                READY   STATUS    RESTARTS   AGE
redis-ha-server-0   2/2     Running   2          20m
redis-ha-server-1   2/2     Running   0          20m
redis-ha-server-2   0/2     Pending   0          12s

也可以使用以下命令查看更新歷史以便回滾:

[root@server1 redis-ha]# helm -n redis history 
Error: "helm history" requires 1 argument

Usage:  helm history RELEASE_NAME [flags]
[root@server1 redis-ha]# helm -n redis history redis-ha 
REVISION	UPDATED                 	STATUS    	CHART         	APP VERSION	DESCRIPTION     
1       	Sun May 10 23:15:35 2020	superseded	redis-ha-4.4.4	5.0.6      	Install complete
2       	Sun May 10 23:35:35 2020	deployed  	redis-ha-4.4.4	5.0.6      	Upgrade complete

實驗後刪除:

[root@server1 redis-ha]# helm uninstall redis-ha -n redis 
release "redis-ha" uninstalled
[root@server1 redis-ha]# kubectl -n redis get pod
No resources found in redis namespace.
[root@server1 redis-ha]# kubectl delete namespaces redis 
namespace "redis" deleted
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章