IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    k8s_安装14_helm_redis

    C1G发表于 2024-05-17 10:24:56
    love 0

    什么是Helm

    Helm是一个为K8s进行包管理的工具。Helm将yaml作为一个整体管理并实现了这些yaml的高效复用,就像Linux中的yum或apt-get,它使我们能够在K8s中方便快捷的安装、管理、卸载K8s应用。
    Helm基于go模板语言,用户只要提供规定的目录结构和模板文件。在真正部署时Helm模板引擎便可以将其渲染成真正的K8s资源配置文件,并按照正确的顺序将它们部署到节点上。

    Helm中有三个重要概念,分别为Chart、Repository和Release。
    Chart代表中Helm包。它包含在K8s集群内部运行应用程序,工具或服务所需的所有资源定义。可以类比成yum中的RPM。

    Repository就是用来存放和共享Chart的地方,可以类比成Maven仓库。

    Release是运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。

    Helm作为K8s的包管理软件,每次安装Charts 到K8s集群时,都会创建一个新的 release。你可以在Helm 的Repository中寻找需要的Chart。Helm对于部署过程的优化的点在于简化了原先完成配置文件编写后还需使用一串kubectl命令进行的操作、统一管理了部署时的可配置项以及方便了部署完成后的升级和维护。

    Helm的架构

    Helm客户端使用REST+JSON的方式与K8s中的apiserver进行交互,进而管理deployment、service等资源,并且客户端本身并不需要数据库,它会把相关的信息储存在K8s集群内的Secrets中。

    Helm的目录结构

    ★ templates/ 目录包含了模板文件。Helm会通过模板渲染引擎渲染所有该目录下的文件来生成Chart,之后将收集到的模板渲染结果发送给K8s。

    ★ values.yaml 文件对于模板也非常重要。这个文件包含了对于一个Chart的默认值 。这些值可以在用户执行Helm install 或 Helm upgrade时指定新的值来进行覆盖。

    ★ Chart.yaml 文件包含对于该Chart元数据描述。这些描述信息可以在模板中被引用。

    ★ _helper.tpl 包含了一些可以在Chart中进行复用的模板定义。

    ★ 其他诸如deployment.yaml、service.yaml、ingress.yaml文件,就是我们用于生成K8s配置文件的模板,Helm默认会按照如下的顺序将生成资源配置发送给K8s:

    Namespace -> NetworkPolicy -> ResourceQuota -> LimitRange -> PodSecurityPolicy --> PodDisruptionBudget -> ServiceAccount -> Secret -> SecretList -> ConfigMap -> StorageClass -> PersistentVolume -> PersistentVolumeClaim -> CustomResourceDefinition -> ClusterRole -> ClusterRoleList -> ClusterRoleBinding -> ClusterRoleBindingList -> Role -> RoleList -> RoleBinding -> RoleBindingList -> Service -> DaemonSet -> Pod -> ReplicationController -> ReplicaSet -> Deployment -> HorizontalPodAutoscaler -> StatefulSet -> Job -> CronJob -> Ingress -> APIService

    helm3 安装部署

    由于国外很多镜像网站国内无法访问,例如gcr.io ,建议使用阿里源,https://developer.aliyun.com/hub 。
    目前helm3已经不依赖于tiller,Release 名称可在不同 ns 间重用。

    安装helm

    Helm3 不需要安装tiller,下载到 Helm 二进制文件直接解压到 $PATH 下就可以使用了。
    https://github.com/helm/

    cd /opt && wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
    wget https://mirrors.huaweicloud.com/helm/v3.13.2/helm-v3.13.2-linux-amd64.tar.gz
    
    mkdir tmp
    tar xf helm-v3.13.2-linux-amd64.tar.gz -C ./tmp
    cp tmp/linux-amd64/helm /usr/local/bin/
    helm version --short
    rm -rf tmp
    
    helm version
    v3.13.2+g2a2fb3b

    Helm补全

    在当前shell会话中加载自动补全:

    source <(helm completion bash)

    为每个新的会话加载自动补全,执行一次:
    vi /etc/profile

    source <(kubectl completion bash)
    source <(helm completion bash) # 增加改行内容

    source /etc/profile

    Helm验证

    helm version 
    version.BuildInfo{Version:"v3.13.2", GitCommit:"2a2fb3b98829f1e0be6fb18af2f6599e0f4e8243", GitTreeState:"clean", GoVersion:"go1.20.10"}

    配置国内helm源

    查看当前

    helm repo list

    添加阿里源

    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

    其它源

    helm repo add bitnami https://charts.bitnami.com/bitnami

    删除 incubator 仓库:

    helm repo remove incubator

    更新chart仓库:

    helm repo update

    查找软件

    https://artifacthub.io/packages/helm/bitnami/mysql

    搜索需指定 repo|hub

    helm search repo memcached

    从指定 chart 仓库地址搜索 chart:

    helm search repo aliyun | grep 名称

    找出大于指定版本chart,不能找app版本

    helm search repo mysql –version ^1.0

    查看具体信息

    helm show chart aliyun/mysql

    使用helm3安装应用举例

    helm search hub guestbook
    helm install guestbook apphub/guestbook

    下载并解压到当前目录

    helm pull bitnami/redis –untar

    helm命令帮助

    completion  # 为指定的shell生成自动完成脚本(bash或zsh)
    create      # 创建一个具有给定名称的新 chart
    delete      # 从 Kubernetes 删除指定名称的 release
    dependency  # 管理 chart 的依赖关系
    fetch       # 从存储库下载 chart 并(可选)将其解压缩到本地目录中
    get         # 下载一个命名 release
    help        # 列出所有帮助信息
    history     # 获取 release 历史
    home        # 显示 HELM_HOME 的位置
    init        # 在客户端和服务器上初始化Helm
    inspect     # 检查 chart 详细信息
    install     # 安装 chart 存档
    lint        # 对 chart 进行语法检查
    list        # releases 列表
    package     # 将 chart 目录打包成 chart 档案
    plugin      # 添加列表或删除 helm 插件
    repo        # 添加列表删除更新和索引 chart 存储库
    reset       # 从集群中卸载 Tiller
    rollback    # 将版本回滚到以前的版本
    search      # 在 chart 存储库中搜索关键字
    serve       # 启动本地http网络服务器
    status      # 显示指定 release 的状态
    template    # 本地渲染模板
    test        # 测试一个 release
    upgrade     # 升级一个 release
    verify      # 验证给定路径上的 chart 是否已签名且有效
    version     # 打印客户端/服务器版本信息
    dep         # 分析 Chart 并下载依赖

    指定value.yaml部署一个chart

    helm install –name els1 -f values.yaml stable/elasticsearch

    升级一个chart

    helm upgrade –set mysqlRootPassword=passwd db-mysql stable/mysql

    helm upgrade go2cloud-api-doc go2cloud-api-doc/

    回滚一个 chart

    helm rollback db-mysql 1

    删除一个 release

    helm delete –purge db-mysql

    只对模板进行渲染然后输出,不进行安装

    helm install/upgrade xxx –dry-run –debug

    列出仓库中chart

    helm search repo bitnami
    helm search repo aliyun

    Helm Chart实战安装redis

    helm search repo redis

    将 redis chart 拉到本地

    helm pull aliyun/redis

    helm pull bitnami/redis
    tar -xvf redis-18.4.0.tgz
    cat redis/values.yaml

    查看镜像地址

    cat redis/values.yaml |grep -C 3 image:

      registry: repo.k8s.local/docker.io
      repository: bitnami/redis
      tag: 7.2.3-debian-11-r1
    --
      ##     image: your-image
      ##     imagePullPolicy: Always
      ##     ports:
      ##       - name: portname
    --
      ##    image: your-image
      ##    imagePullPolicy: Always
      ##    command: ['sh', '-c', 'echo "hello world"']
      ##
    --
      ##     image: your-image
      ##     imagePullPolicy: Always
      ##     ports:
      ##       - name: portname
    --
      ##    image: your-image
      ##    imagePullPolicy: Always
      ##    command: ['sh', '-c', 'echo "hello world"']
      ##
    --
      image:
        registry: repo.k8s.local/docker.io
        repository: bitnami/redis-sentinel
        tag: 7.2.3-debian-11-r1
    --
      image:
        registry: repo.k8s.local/docker.io
        repository: bitnami/redis-exporter
        tag: 1.55.0-debian-11-r2
    --
      image:
        registry: repo.k8s.local/docker.io
        repository: bitnami/os-shell
        tag: 11-debian-11-r91
    --
      image:
        registry: repo.k8s.local/docker.io
        repository: bitnami/os-shell
        tag: 11-debian-11-r91

    准备私仓镜像

    docker pull bitnami/redis:7.2.3-debian-11-r1
    docker pull bitnami/redis-sentinel:7.2.3-debian-11-r1
    docker pull bitnami/redis-exporter:1.55.0-debian-11-r2
    docker pull bitnami/os-shell:11-debian-11-r91
    
    docker tag docker.io/bitnami/redis:7.2.3-debian-11-r1 repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1
    docker tag docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1 repo.k8s.local/docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1
    docker tag docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2 repo.k8s.local/docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2
    docker tag docker.io/bitnami/os-shell:11-debian-11-r91 repo.k8s.local/docker.io/bitnami/os-shell:11-debian-11-r91
    
    docker push repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1
    docker push repo.k8s.local/docker.io/bitnami/redis-sentinel:7.2.3-debian-11-r1
    docker push repo.k8s.local/docker.io/bitnami/redis-exporter:1.55.0-debian-11-r2
    docker push repo.k8s.local/docker.io/bitnami/os-shell:11-debian-11-r91

    修改镜像为私仓地址

    cat redis/values.yaml | grep ‘registry: docker.io’
    cat redis/values.yaml | grep ‘registry: ‘
    sed -n "/registry: docker.io/{s/docker.io/repo.k8s.local\/docker.io/p}" redis/values.yaml
    sed -i "/registry: docker.io/{s/docker.io/repo.k8s.local\/docker.io/}" redis/values.yaml

    安装

    选择集群模式

    支持

    • 独立模式
    • 主从模式
    • 哨兵模式
    • 集群模式

    独立模式

    cat redis/values.yaml |grep architecture:
    sed -rn '/architecture: /{s/architecture: (.*)/architecture: standalone/p}' redis/values.yaml
    sed -ri '/architecture: /{s/architecture: (.*)/architecture: standalone/}' redis/values.yaml

    主从模式

    cat redis/values.yaml |grep architecture:
    sed -rn '/architecture: /{s/architecture: (.*)/architecture: replication/p}' redis/values.yaml
    sed -ri '/architecture: /{s/architecture: (.*)/architecture: replication/}' redis/values.yaml
    设置副本数量

    默认为3个,这里改2个

    cat redis/values.yaml |grep replicaCount:
    sed -rn '/replicaCount: /{s/replicaCount: (.*)/replicaCount: 2/p}' redis/values.yaml
    sed -ri '/replicaCount: /{s/replicaCount: (.*)/replicaCount: 2/}' redis/values.yaml
    选择Service类型

    bitnami/redis默认使用clusterIP模式,如需外部访问可开NodePort
    cat redis/values.yaml |grep "service:"

    master:
      service:
        type: NodePort
    replica:
      service:
        type: NodePort

    修改存储StorageClass和密码

    动态pv创建请参考前期存储文章

    cat redis/values.yaml |grep "storageClass:"
    sed -rn '/storageClass: /{s/storageClass: (.*)/storageClass: "managed-nfs-storage"/p}' redis/values.yaml
    sed -ri '/storageClass: /{s/storageClass: (.*)/storageClass: "managed-nfs-storage"/}' redis/values.yaml
    
    vi redis/values.yaml
    storageClass: "managed-nfs-storage"

    配置(可选):配置密码

    cat redis/values.yaml |grep "password:"
    sed -rn '/password: /{s/password: (.*)/password: "123456"/p}' redis/values.yaml
    sed -ri '/password: /{s/password: (.*)/password: "123456"/}' redis/values.yaml
    
    vi redis/values.yaml
    password: "123456"

    查看值

    helm show values ./redis|grep replicaCount:

    先检查语法

    helm lint ./redis
    ==> Linting ./redis
    
    1 chart(s) linted, 0 chart(s) failed
    安装到test命名空间

    这里使用主从模式安装
    helm install luo-redis ./redis -n test –create-namespace

    NAME: luo-redis
    LAST DEPLOYED: Mon Dec  4 09:54:42 2023
    NAMESPACE: test
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    CHART NAME: redis
    CHART VERSION: 18.4.0
    APP VERSION: 7.2.3
    
    ** Please be patient while the chart is being deployed **
    
    Redis® can be accessed on the following DNS names from within your cluster:
    
        luo-redis-master.test.svc.cluster.local for read/write operations (port 6379)
        luo-redis-replicas.test.svc.cluster.local for read-only operations (port 6379)
    
    To get your password run:
    
        export REDIS_PASSWORD=$(kubectl get secret --namespace test luo-redis -o jsonpath="{.data.redis-password}" | base64 -d)
    
    To connect to your Redis® server:
    
    1. Run a Redis® pod that you can use as a client:
    
       kubectl run --namespace test redis-client --restart='Never'  --env REDIS_PASSWORD=$REDIS_PASSWORD  --image repo.k8s.local/docker.io/bitnami/redis:7.2.3-debian-11-r1 --command -- sleep infinity
    
       Use the following command to attach to the pod:
    
       kubectl exec --tty -i redis-client \
       --namespace test -- bash
    
    2. Connect using the Redis® CLI:
       REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h luo-redis-master
       REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h luo-redis-replicas
    
    To connect to your database from outside the cluster execute the following commands:
    
        kubectl port-forward --namespace test svc/luo-redis-master 6379:6379 &
        REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379

    查看

    kubectl get all -n test
    kubectl get pod -n test
    kubectl get pods,svc -n test -owide
    
    kubectl get pv,pvc -n test
    kubectl describe pvc redis-data-luo-redis-master-0 

    删pvc

    kubectl patch pvc redis-data-luo-redis-master-0  -p '{"metadata":{"finalizers":null}}' -n test
    kubectl patch pvc redis-data-luo-redis-replicas-0  -p '{"metadata":{"finalizers":null}}' -n test
    
    kubectl delete pvc redis-data-luo-redis-master-0 --grace-period=0 --force -n test
    kubectl delete pvc redis-data-luo-redis-replicas-0 --grace-period=0 --force -n test
    
    kubectl describe pod luo-redis-master-0 -n test
    kubectl logs -f luo-redis-master-0 -n test
    
    kubectl describe luo-redis-replicas-0 -n test

    升级

    helm upgrade luo-redis ./redis -n test

    查看历史

    helm history luo-redis

    回退到指定版本

    helm rollback luo-redis 3

    删除

    helm delete luo-redis -n test

    查看数据文件

    在nfs上查看

    cd /nfs/k8s/dpv/test-redis-data-luo-redis-master-0-pvc-9d72c5b3-4cc4-444c-89f5-20487ed694d6
    ll appendonlydir/
    total 8
    -rw-r--r--. 1 1001 root 88 Dec  4 09:54 appendonly.aof.1.base.rdb
    -rw-r--r--. 1 1001 root  0 Dec  4 09:54 appendonly.aof.1.incr.aof
    -rw-r--r--. 1 1001 root 88 Dec  4 09:54 appendonly.aof.manifest

    客户端访问redis

    方式一 没有redis-cli
    按安装后的提示步骤创建客户端后连入redis master 查看信息

    role:master
    connected_slaves:3
    slave0:ip=luo-redis-replicas-0.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
    slave1:ip=luo-redis-replicas-1.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
    slave2:ip=luo-redis-replicas-2.luo-redis-headless.test.svc.cluster.local,port=6379,state=online,offset=560,lag=1
    kubectl -n test describe pod redis-client
    
    kubectl scale deployment/redis-client -n test --replicas=0 
    kubectl delete pod redis-client  -n test

    方式二 有redis-cli

    kubectl exec -it redis-master-0 -n redis -- redis-cli -h redis-master -a $(kubectl get secret --namespace redis redis -o jsonpath="{.data.redis-password}" | base64 -d)

    调度redis从机

    我们有2个node但pod有3个,并且部署在同一node上

    kubectl get pods,svc -n test -owide
    NAME                               READY   STATUS    RESTARTS        AGE     IP             NODE               NOMINATED NODE   READINESS GATES
    pod/luo-redis-master-0             1/1     Running   0               42m     10.244.2.99    node02.k8s.local   <none>           <none>
    pod/luo-redis-replicas-0           1/1     Running   0               42m     10.244.2.100   node02.k8s.local   <none>           <none>
    pod/luo-redis-replicas-1           1/1     Running   0               41m     10.244.1.187   node01.k8s.local   <none>           <none>
    pod/luo-redis-replicas-2           1/1     Running   0               41m     10.244.2.101   node02.k8s.local   <none>           <none>

    将redis从机改成2

    修改 配置文件
    vi redis/values.yaml

    replica:
      ## @param replica.kind Use either DaemonSet or StatefulSet (default)
      ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
      ##
      kind: StatefulSet
      ## @param replica.replicaCount Number of Redis® replicas to deploy
      ##
      replicaCount: 2

    在线缩容为2个

    kubectl scale sts/luo-redis-replicas -n test --replicas=2 
    kubectl get pods,svc -n test -owide
    NAME                               READY   STATUS    RESTARTS        AGE     IP             NODE               NOMINATED NODE   READINESS GATES
    pod/luo-redis-master-0             1/1     Running   0               93m     10.244.2.99    node02.k8s.local   <none>           <none>
    pod/luo-redis-replicas-0           1/1     Running   0               93m     10.244.2.100   node02.k8s.local   <none>           <none>
    pod/luo-redis-replicas-1           1/1     Running   0               92m     10.244.1.187   node01.k8s.local   <none>           <none>

    redis从机 已缩为2个,但pvc和pv依然存在,每个节点都有自己的Persistent Volume。如果删除或缩小 pod,与它们关联的卷将不会被删除,因此数据会保留

    kubectl get pv,pvc -n test
    NAME                                                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
    persistentvolumeclaim/redis-data-luo-redis-master-0     Bound    pvc-9d72c5b3-4cc4-444c-89f5-20487ed694d6   8Gi        RWO            managed-nfs-storage   93m
    persistentvolumeclaim/redis-data-luo-redis-replicas-0   Bound    pvc-521abe8f-918e-4940-99df-9647a2de33c8   8Gi        RWO            managed-nfs-storage   93m
    persistentvolumeclaim/redis-data-luo-redis-replicas-1   Bound    pvc-5f7ef942-1cef-45bd-8adf-15126cdcf8de   8Gi        RWO            managed-nfs-storage   92m
    persistentvolumeclaim/redis-data-luo-redis-replicas-2   Bound    pvc-56ccb5a3-43bb-4713-a927-d74332e8b673   8Gi        RWO            managed-nfs-storage   91m

    在线扩容为3个

    当你upgrade发布时,其修订号会增加。在内部,Helm 存储版本的所有修订,允许你在需要时返回到以前的修订

    helm upgrade luo-redis ./redis  -n test --set cluster.replicaCount=3
    helm upgrade luo-redis ./redis  -n test --set cluster.replicaCount=3 --reuse-values

    传入–reuse-values,它指示 Helm 将你的更改基于已部署的版本,保留以前的配置。

    要回滚版本,请使用helm rollback

    helm list -n test
    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
    luo-redis       test            2               2023-12-04 15:41:19.336430771 +0800 CST deployed        redis-18.4.0    7.2.3      
    helm history -n test luo-redis
    REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION     
    1               Mon Dec  4 15:34:40 2023        superseded      redis-18.4.0    7.2.3           Install complete
    2               Mon Dec  4 15:41:19 2023        superseded      redis-18.4.0    7.2.3           Upgrade complete
    3               Mon Dec  4 16:01:56 2023        deployed        redis-18.4.0    7.2.3           Upgrade complete

    回滚第一版

    helm rollback luo-redis -n test 1
    Rollback was a success! Happy Helming!

    查看历史版本

    helm history -n test luo-redis
    REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION     
    1               Mon Dec  4 15:34:40 2023        superseded      redis-18.4.0    7.2.3           Install complete
    2               Mon Dec  4 15:41:19 2023        superseded      redis-18.4.0    7.2.3           Upgrade complete
    3               Mon Dec  4 16:01:56 2023        superseded      redis-18.4.0    7.2.3           Upgrade complete
    4               Mon Dec  4 16:16:04 2023        deployed        redis-18.4.0    7.2.3           Rollback to 1  

    安装和后续升级

    values.yaml 中包含了默认的安装参数,但是诸如数据库的ip、username、password,若我们不想去修改安装包,如何在安装的时候进行覆盖呢?我们只要在 install 时使用 set 选项,设置想要覆盖的参数值即可。

    Helm install myChart-test myChart–set config.mysql.server=100.71.32.11

    用户也可以在安装时指定自己的values.yaml配置。例如用户在升级的时候用 upgrade 命令,指定新的参数配置文件,即可实现在原有部署好的应用的基础上变更配置。命令如下:

    install myChart-test02 myChart -f my-values.yaml
    Helm upgrade myChart-test02 myChart -f my-new-values.yaml

    The post k8s_安装14_helm_redis first appeared on C1G军火库.



沪ICP备19023445号-2号
友情链接