前言:

helm是k8s的专有包管理器,使用helm的chart包可以快速简单的实现一个或者多个微服务的部署,好处太多在这就不说了,当然,坏处也是有的,就是定制化部署比较困难,因此,本次实验目的是通过下载的chart包,离线部署实现nfs的存储类实现,并在nfs的存储类实现的基础上,通过helm部署一个redis简单的集群。

实验步骤:

一,

首先,我们需要一个关于helm的nfs-client-provisioner的chart包,在此基础上将该包的内容做适当的修改,然后通过helm快递的部署一个nfs的存储类。

其次,需要一个redis的关于helm的chart包,不修改此包,直接通过helm快速部署一个简单的redis集群。

相关chart包以及镜像在以下链接:

链接:https://pan.baidu.com/s/1LXZRo1kmFE_5bsLZuc1X9A?pwd=k8ss 
提取码:k8ss 

 

二,

helm的安装

这个比较简单了,上传NFS目录下的helm文件到服务器,放入系统环境变量内即可。命令是:

mv helm  /usr/local/bin/  &&chmod a+x /usr/local/bin/helm

三,

自定义 PROVISIONER

这一步需要修改chart文件nfs-client-provisioner-0.1.1.tgz,将该文件解压后,可以看到一个文件夹:

[root@master ~]# ls nfs-client-provisioner
Chart.yaml  templates  values.yaml

 编辑values.yaml这个文件(该文件是一个模板文件):

image:
  repository: registry.cn-shanghai.aliyuncs.com/c7n/nfs-client-provisioner
  tag: v3.1.0-k8s1.11
  pullPolicy: IfNotPresent

strategy:
  type: Recreate

storageClass:
  name: nfs-client-provisioner
  provisioner: nfs-client-provisioner
  archiveOnDelete: true

这个provisioner的值修改为自己想要的值即可。修改完毕后删除原tar包nfs-client-provisioner-0.1.1.tgz,重新使用helm打包即可。

rm -rf nfs-client-provisioner-0.1.1.tgz
helm package ./nfs-client-provisioner

四,

在部署之前,需要将镜像registry.cn-shanghai.aliyuncs.com_c7n_nfs-client-provisioner_v3.1.0-k8s1.11.tar导入到集群各个节点内,导入命令为:

docker load <registry.cn-shanghai.aliyuncs.com_c7n_nfs-client-provisioner_v3.1.0-k8s1.11.tar

部署nfs的存储类

helm install nfs-client-provisioner    ./nfs-client-provisioner-0.1.1.tgz   --set rbac.create=true     --set persistence.enabled=true     --set storageClass.name=nfs-provisioner     --set persistence.nfsServer=192.168.217.16     --set persistence.nfsPath=/data/nfs-sc     --version 0.1.2     --namespace kube-system

参数说明: 

--set storageClass.name=nfs-provisioner  #这个值自定义
--set persistence.nfsServer=192.168.217.16 #这里是nfs服务器的IP地址,根据实际情况填写
--set persistence.nfsPath=/data/nfs-sc  #这里是nfs服务的共享目录,也是根据实际填写,我定义的是/data/nfs-sc
--set rbac.create=true #这个不能更改
--version 0.1.2   #这里的版本定义,可自定义
--namespace kube-system  # namespace不要使用default,一般是设置为kube-system
   

helm非常的方便,一般部署服务都是一句话就搞定了,nfs的存储类部署也是同样的简单,下面做一个简单的测试:

(1)获取sc信息,验证提供者provisioner是否正确:

[root@master ~]# k get sc
NAME                        PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-provisioner (default)   nfs-client-provisioner   Delete          Immediate           false                  21m

(2)

为了以后使用的方便,将该StorageClass设置为默认存储类:

kubectl patch storageclass nfs-provisioner -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

 (3)

helm查看部署的是否正确:

[root@master ~]# helm list -A
NAME                  	NAMESPACE  	REVISION	UPDATED                                	STATUS  	CHART                       	APP VERSION   
nfs-client-provisioner	kube-system	1       	2022-07-17 17:49:21.281270901 +0800 CST	deployed	nfs-client-provisioner-0.1.1	v3.1.0-k8s1.11

(4)

查看nfs存储类的pod是否运行正常:

[root@master ~]# k get po -A |grep nfs
kube-system   nfs-client-provisioner-57c749cf94-s5vmr   1/1     Running   0          26m

 

 

五,

安装redis集群

这个就非常简单了,一条命令就可以了,因为是使用的默认设置,当然,也可以像nfs存储类一样,修改values.yaml 文件重新打包

解压redis的chart包:

tar zxf redis-16.4.1.tgz

镜像导入:

registry.hand-china.com_tools_redis_6.2.6-debian-10-r120这个镜像在集群各个节点都导入,导入命令:

docker load <registry.hand-china.com_tools_redis_6.2.6-debian-10-r120

 

直接部署: 

helm install redis ./redis --namespace kube-system

此命令输出如下:

NAME: redis
LAST DEPLOYED: Sun Jul 17 17:54:25 2022
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 16.4.1
APP VERSION: 6.2.6

** Please be patient while the chart is being deployed **

Redis&trade; can be accessed on the following DNS names from within your cluster:

    redis-master.kube-system.svc.cluster.local for read/write operations (port 6379)
    redis-replicas.kube-system.svc.cluster.local for read-only operations (port 6379)



To get your password run:

    export REDIS_PASSWORD=$(kubectl get secret --namespace kube-system redis -o jsonpath="{.data.redis-password}" | base64 --decode)

To connect to your Redis&trade; server:

1. Run a Redis&trade; pod that you can use as a client:

   kubectl run --namespace kube-system redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image registry.hand-china.com/tools/redis:6.2.6-debian-10-r120 --command -- sleep infinity

   Use the following command to attach to the pod:

   kubectl exec --tty -i redis-client \
   --namespace kube-system -- bash

2. Connect using the Redis&trade; CLI:
   REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-master
   REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h redis-replicas

To connect to your database from outside the cluster execute the following commands:

    kubectl port-forward --namespace kube-system svc/redis-master : &
    REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p

 

单元测试:

(1)

查看pvc和pv是否正常:

[root@master ~]# k get pvc -A
NAMESPACE     NAME                          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
kube-system   redis-data-redis-master-0     Bound    pvc-0a788b58-a806-43ac-9c80-8d35684587d4   8Gi        RWO            nfs-provisioner   52m
kube-system   redis-data-redis-replicas-0   Bound    pvc-cca6d8b0-1f2f-437a-bcdd-f978234cc551   8Gi        RWO            nfs-provisioner   52m
kube-system   redis-data-redis-replicas-1   Bound    pvc-d2ec683c-9d18-4d91-9bb4-b7995814d76e   8Gi        RWO            nfs-provisioner   51m
kube-system   redis-data-redis-replicas-2   Bound    pvc-ea3d3d4f-255b-493d-8406-d9c563054c08   8Gi        RWO            nfs-provisioner   51m
[root@master ~]# k get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS      REASON   AGE
pvc-0a788b58-a806-43ac-9c80-8d35684587d4   8Gi        RWO            Delete           Bound    kube-system/redis-data-redis-master-0     nfs-provisioner            52m
pvc-cca6d8b0-1f2f-437a-bcdd-f978234cc551   8Gi        RWO            Delete           Bound    kube-system/redis-data-redis-replicas-0   nfs-provisioner            52m
pvc-d2ec683c-9d18-4d91-9bb4-b7995814d76e   8Gi        RWO            Delete           Bound    kube-system/redis-data-redis-replicas-1   nfs-provisioner            51m
pvc-ea3d3d4f-255b-493d-8406-d9c563054c08   8Gi        RWO            Delete           Bound    kube-system/redis-data-redis-replicas-2   nfs-provisioner            51m

 (2)

执行命令获取redis集群的密码:

[root@master ~]# kubectl get secret --namespace kube-system redis -o jsonpath="{.data.redis-password}" | base64 --decode
u2vXM3RHVM

查看pod:

u2vXM3RHVM[root@master ~]# k get po -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   coredns-6c76c8bb89-tfcrm                  1/1     Running   4          34d
kube-system   coredns-6c76c8bb89-vnlwg                  1/1     Running   4          34d
kube-system   etcd-c7n.cnn                              1/1     Running   4          34d
kube-system   kube-apiserver-c7n.cnn                    1/1     Running   4          34d
kube-system   kube-controller-manager-c7n.cnn           1/1     Running   2          81m
kube-system   kube-flannel-ds-hgx56                     1/1     Running   3          33h
kube-system   kube-flannel-ds-nwgv8                     1/1     Running   3          33h
kube-system   kube-flannel-ds-r8ckj                     1/1     Running   3          33h
kube-system   kube-proxy-7v5mj                          1/1     Running   4          34d
kube-system   kube-proxy-mtttm                          1/1     Running   4          34d
kube-system   kube-proxy-zwmwf                          1/1     Running   4          34d
kube-system   kube-scheduler-c7n.cnn                    1/1     Running   2          81m
kube-system   nfs-client-provisioner-57c749cf94-s5vmr   1/1     Running   0          60m
kube-system   redis-master-0                            1/1     Running   0          55m
kube-system   redis-replicas-0                          1/1     Running   0          55m
kube-system   redis-replicas-1                          1/1     Running   0          54m
kube-system   redis-replicas-2                          1/1     Running   0          54m

 

登录redis的master节点:

[root@master ~]# kubectl exec --tty -i redis-master-0    --namespace kube-system -- bash

命令输出如下:

[root@master ~]# kubectl exec --tty -i redis-master-0    --namespace kube-system -- bash
I have no name!

连接redis数据库(使用前面查询出来的密码登录该集群的master):

I have no name!@redis-master-0:/$ redis-cli -h redis-master -a u2vXM3RHVM
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-master:6379> auth u2vXM3RHVM
OK
redis-master:6379> set msg fuck
OK
redis-master:6379> get msg
"fuck"

多说一句,如果想要固定redis集群的密码,可以修改values.yaml 文件的这一段:

global:
  imageRegistry: ""
  ## E.g.
  ## imagePullSecrets:
  ##   - myRegistryKeySecretName
  ##
  imagePullSecrets: []
  storageClass: ""
  redis:
    password: ""

 自定义的密码添加完毕后,使用helm重新打包这个文件夹即可,然后在重新安装,如果正常的话,集群将会使用自定义的固定密码,打包命令:

helm package ./redis/

重新打包后的安装命令是:

helm upgrade --install redis ./redis-16.4.1.tgz --namespace kube-system

Logo

开源、云原生的融合云平台

更多推荐