1、基础知识
1.1、需求
在kubernetes平台上,我们在部署各种各样的应用服务的时候,可以基于手工或者自动的方式对各种资源对象实现伸缩操作,尤其是对于有状态的应用,
我们可以结合持久性存储机制实现更大场景的伸缩动作。
但是,无论我们怎么操作各种资源对象,问题最多的就是各种基础配置、镜像等之类的依赖管理操作。在linux平台下,常见的包依赖的就是yum、apt等工具,在kubernetes平台下,
同样有类似的解决依赖关系的工具 -- helm。
1.2、官方文档
官方网址:https://v3.helm.sh/ 官方地址:https://github.com/helm/helm 官方仓库:https://hub.kubeapps.com/ 和 https://artifacthub.io/ 最新版本:v3.11.3 | 20230413
1.3、Helm V2简介
1.3.1、Helm功能
helm的功能类似于yum 或 apt,提供应用部署时候所需要的各种配置、资源清单文件,他与yum之类工具不同的是,
在k8s中helm是不提供镜像的,这些镜像文件需要由专门的镜像仓库来提供。
1.3.2、Helm示例流程
例如:k8s平台上的nginx应用部署,对于该应用部署来说,主要需要三类内容: 1、镜像:nginx镜像 2、资源定义文件:Deployment、service、hpa等 3、专用文件:配置文件、证书等
helm管理的主要是:资源定义文件和专用文件。
1.3.3、Helm流程图
1.3.4、Tiller Server、Charts
Tiller Server是一个部署在Kubernetes集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。
Tiller server 主要负责如下: 1、监听来自 Helm client 的请求 2、通过 chart 及其配置构建一次发布 3、安装 chart 到Kubernetes集群,并跟踪随后的发布 4、通过与Kubernetes交互升级或卸载 chart
简单的说,client 管理 charts,而 server 管理发布 release
1.3.5、流程解析
基于helm部署应用服务,完整的工作流程如下: 1、部署一个稳定运行的k8s集群,在能管理k8s的主机上部署helm。 2、用户在客户端主机上,定制各种Chart资源和config资源,上传到专用的仓库(本地或者远程) 3、helm客户端向Tiller发出部署请求,如果本地有chart用本地的,否则从仓库获取 4、Tiller与k8s集群的api-server发送请求 5、api-server通过集群内部机制部署应用,需要依赖镜像的时候,从专门的镜像仓库获取。 6、基于helm部署好的应用实例,在k8s集群中,我们称之为release。
1.3、Helm V3简介
1.3.1、v3简介
根据我们对 helm v2 版本的流程解析,我们发现,在客户端上部署tiller来维护 release相关的信息,有些太重量级了,
所以在 helm v3 版本的时候,就剔除了专门的Tiller。 根据我们之前对于flannel的理解,flannel的专用数据存储方式可以使用独立的etcd集群来进行数据的存储,也可以借助于apiservice方式将数据存储到etcd里面。所以helm借鉴与此,也可以通过apiserver来进行chart数据的存储,
包括运行出来的release信息,也借助于apiserver存储到etcd里面。
所以在 Helm v3 中移除了 Tiller, 版本相关的数据直接存储在了 Kubernetes 中
1.3.2、从v2到v3架构图
1.3.3、helm vs kustomize
Kustomize 只有一个 CLI 工具,在 Kubernetes 1.14 之后,甚至这唯一的工具也成为 kubectl 的一部分,可以说是很轻量级了。 Kustomize的特色 1、功能简单清晰,kubectl 直接支持。 2、不考虑派生,仅作为应用的 YAML 组织方式也很有帮助。 3、也有自己的插件系统。例如可以用简单的 YAML 定义,使用文件生成 Configmap/Secret。 通过上面对 kustomize 的讲解,可能已经有人注意到它与 Helm 有一定的相似。先来看看 Helm 的定位:Kubernetes 的包管理工具, 而 kustomize 的定位是:Kubernetes 原生配置管理。两者定位领域有很大不同,Helm 通过将应用抽象成 Chart 来管理, 专注于应用的操作、 复杂性管理等, 而kustomize 关注于 k8s API 对象的管理。 总的来说,Helm 有自己一套体系来管理应用,而kustomize更轻量级,融入Kubernetes的设计理念,通过原生 k8s API对象来管理应用。
1.3.4、helm vs operator
helm 仅仅是部署的功能。 operator 部署只是他的功能之一,他的核心功能是确保应用程序符合k8s的api的资源管理规范的基础上,通过代码级别的控制,确保应用能够按照用户所定义的期望状态进行执行。
2、Helm环境安装
2.1、软件安装
2.1.1、软件下载
wget https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz
2.1.2、解压安装软件
tar xvf helm-v3.11.3-linux-amd64.tar.gz -C /usr/local/ mv /usr/local/linux-amd64 /usr/local/helm-v3.11.3 ln -s /usr/local/helm-v3.11.3 /usr/local/helm
mkdir /usr/local/helm/bin && mv /usr/local/helm/helm /usr/local/bin/
2.1.3、配置环境变量
cat > /etc/profile.d/helm-v3.11.3.sh <<EOF #!/bin/bash export HELM_HOME=/usr/local/helm export PATH=$PATH:${HELM_HOME}/bin EOF chmod +x /etc/profile.d/helm-v3.11.3.sh source /etc/profile
2.1.4、确认helm版本
]# helm version version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"}
2.2、仓库配置
2.2.1、官方源配置
helm repo add brigade https://brigadecore.github.io/charts # 查询仓库 ]# helm repo list NAME URL brigade https://brigadecore.github.io/charts ]# helm search repo kash NAME CHART VERSION APP VERSION DESCRIPTION brigade/kashti 0.7.0 v0.4.0 A Helm chart for Kubernetes
2.2.2、第三方源配置
]# helm repo list NAME URL bitnami https://charts.bitnami.com/bitnami prometheus-community https://prometheus-community.github.io/helm-charts
2.3、仓库管理
2.3.1、增加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
2.3.3、显示已配置的仓库
helm repo list
2.3.3、删除仓库
helm repo remove prometheus-community
2.3.4、更新仓库
helm repo update
2.3.5、仓库中查询charts
# 如查询redis ]# helm search repo redis NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis 17.9.3 7.0.10 Redis(R) is an open source, advanced key-value ... bitnami/redis-cluster 8.4.3 7.0.10 Redis(R) is an open source, scalable, distribut...
2.4、helm显示管理
2.4.1、查看chart的信息
]# helm show chart bitnami/redis annotations: category: Database licenses: Apache-2.0 apiVersion: v2 appVersion: 7.0.10 dependencies: - name: common repository: https://charts.bitnami.com/bitnami tags: - bitnami-common version: 2.x.x description: Redis(R) is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. home: https://github.com/bitnami/charts/tree/main/bitnami/redis icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png keywords: - redis - keyvalue - database maintainers: - name: Bitnami url: https://github.com/bitnami/charts name: redis sources: - https://github.com/bitnami/containers/tree/main/bitnami/redis version: 17.9.3
2.4.2、获取chart文件
helm pull bitnami/redis # 拉到本地 ]# ll redis-17.9.3.tgz -rw-r--r-- 1 root root 90546 Apr 13 13:43 redis-17.9.3.tgz
2.4.3、helm show更多命令
]# helm show --help ... Available Commands: all show all information of the chart chart show the chart's definition crds show the chart's CRDs readme show the chart's README values show the chart's values
2.5、chart安装方式
2.5.1、本地安装chart
指定本地chart目录:helm install /path/to/chart_dir 指定本地chart压缩包:helm install chart_name.tgz
2.5.2、安装chart仓库中的chart
使用默认的远程仓库:helm install repo/chart_name 使用指定的仓库:helm install web_address:port/url/to/chart_name.tgz
注意:所谓的远程仓库,本质上是将打包后chart作为静态文件托管到了web服务器上。
3、使用helm部署redis-入门实践
3.1、首次需要更新一下repo
helm repo update # 主要目标是为了创建缓存目录 ~]# tree .cache/ .cache/ └── helm └── repository ├── bitnami-charts.txt └── bitnami-index.yaml
3.2、安装redis
3.2.1、安装redis-chart
# 注意helm名字不能为下划线
]# helm install my-helm-redis bitnami/redis # 缓存已经下载好redis charts ~]# tree .cache/ .cache/ └── helm └── repository ├── bitnami-charts.txt ├── bitnami-index.yaml └── redis-17.9.3.tgz
3.2.2、安装后提示的解析
]# helm install my-helm-redis bitnami/redis NAME: my-helm-redis LAST DEPLOYED: Thu Apr 13 14:08:03 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: redis CHART VERSION: 17.9.3 APP VERSION: 7.0.10 ** Please be patient while the chart is being deployed ** #1、 redis主从的域名访问 my-helm-redis-master.default.svc.cluster.local for read/write operations (port 6379) my-helm-redis-replicas.default.svc.cluster.local for read-only operations (port 6379) #2、 获取运行的登陆密码 export REDIS_PASSWORD=$(kubectl get secret --namespace default my-helm-redis -o jsonpath="{.data.redis-password}" | base64 -d) To connect to your Redis® server: # 3、运行一个redis客户端 kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:7.0.10-debian-11-r4 --command -- sleep infinity # 4、进入pod kubectl exec --tty -i redis-client --namespace default -- bash # 5、pod连接主从redis服务 REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-master REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-replicas # 6、要从集群外部连接到数据库,请执行以下命令 kubectl port-forward --namespace default svc/my-helm-redis-master 6379:6379 & REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379
3.2.3、查询helm状态
]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-helm-redis default 1 2023-04-13 14:08:03.113305603 +0800 CST deployed redis-17.9.3 7.0.10
3.2.4、查询redis运行pod状态
]# kubectl get pod NAME READY STATUS RESTARTS AGE my-helm-redis-master-0 0/1 Pending 0 10m my-helm-redis-replicas-0 0/1 Pending 0 10m
# 注意:此时pod挂起的,原因:持久化存储,没有配置共享盘。
3.3、缓存文件的解析
3.3.1、解压缓存文件并且查看
]# tar xvf .cache/helm/repository/redis-17.9.3.tgz -C /tmp/ && cd /tmp/redis ]# ll total 208 -rw-r--r-- 1 root root 219 Apr 1 23:13 Chart.lock drwxr-xr-x 3 root root 20 Apr 13 14:02 charts -rw-r--r-- 1 root root 753 Apr 1 23:13 Chart.yaml drwxr-xr-x 2 root root 66 Apr 13 14:23 img -rw-r--r-- 1 root root 113678 Apr 1 23:13 README.md drwxr-xr-x 5 root root 4096 Apr 13 14:23 templates -rw-r--r-- 1 root root 4483 Apr 1 23:13 values.schema.json -rw-r--r-- 1 root root 76003 Apr 1 23:13 values.yaml
3.3.2、文件解析
values.yaml 就是当前redis应用的各种属性的定制 redis]# vi values.yaml ## @section Global parameters ## Global Docker image parameters ## Please, note that this will override the image parameters, including dependencies, configured to use the global value ## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass ## ## @param global.imageRegistry Global Docker image registry ## @param global.imagePullSecrets Global Docker registry secret names as an array ## @param global.storageClass Global StorageClass for Persistent Volume(s) ## @param global.redis.password Global Redis® password (overrides `auth.password`) ## global: imageRegistry: "" ## E.g. ## imagePullSecrets: ## - myRegistryKeySecretName ## imagePullSecrets: [] storageClass: "" redis: password: "" ## @section Common parameters ## ## @param kubeVersion Override Kubernetes version ## kubeVersion: "" ## @param nameOverride String to partially override common.names.fullname ## nameOverride: "" ## @param fullnameOverride String to fully override common.names.fullname ## fullnameOverride: "" ## @param commonLabels Labels to add to all deployed objects ...
3.3.3、修改启动属性方式
1、可以通过 helm命令参数。 2、helm values.yaml文件的方式来进行操作。
3.4、Pod状态Pending的解决方法
3.4.1、原因
默认的持久化存储方式部署redis,我们没有配置共享存储的原因,下面先关闭它,再看看运行状态
3.4.2、删除redis helm
]# helm uninstall my-helm-redis release "my-helm-redis" uninstalled
3.4.3、设置属性安装redis helm
helm install my-helm-redis bitnami/redis --set master.persistence.enabled=false --set replica.persistence.enabled=false
3.4.4、查询pod的运行状态
# 下载镜像中 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE my-helm-redis-master-0 0/1 ContainerCreating 0 26s my-helm-redis-replicas-0 0/1 ContainerCreating 0 26s # redis已经运行成功 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE my-helm-redis-master-0 0/1 Running 0 37s my-helm-redis-replicas-0 0/1 Running 0 37s
3.5、连接redis测试
3.5.1、查询helm状态
# 如果不知道怎么链接,请看这个命令打印出来的教程 helm status my-helm-redis
3.5.2、获取redis登陆密码
export REDIS_PASSWORD=$(kubectl get secret --namespace default my-helm-redis -o jsonpath="{.data.redis-password}" | base64 -d)
]# echo $REDIS_PASSWORD dDJW7k6Bem
3.5.3、创建redis-client的pod
kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:7.0.10-debian-11-r4 --command -- sleep infinity
# 注意:这里的密码是以环境变量传入pod中了
3.5.4、登陆redis进行数据读写
# 登陆master测试 $ REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-master my-helm-redis-master:6379> set name cyc my-helm-redis-master:6379> get name "cyc" my-helm-redis-master:6379> set age 18 my-helm-redis-master:6379> get age "18" # 登陆slave测试 $ REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-replicas my-helm-redis-replicas:6379> get age "18" my-helm-redis-replicas:6379> get name "cyc"
3.6、通过values文件方式配置环境
3.6.1、修改values.yaml
cp /tmp/redis/values.yaml /tmp/redis/values.define.yaml vi /tmp/redis/values.define.yaml 553 replica: 554 ## @param replica.replicaCount Number of Redis® replicas to deploy 555 ## 我们发现replicas默认是为3,现在把它修改为2 556 replicaCount: 2 557 ## @param replica.configuration Configuration for Redis® replicas nodes 558 ## ref: https://redis.io/topics/config 559 ## 560 configuration: "" 561 ## @param replica.disableCommands Array with Redis® commands to disable on replicas nodes 562 ## Commands will be completely disabled by renaming each to an empty string. 563 ## ref: https://redis.io/topics/security#disabling-of-specific-commands 564 ## 565 disableCommands: 566 - FLUSHDB 567 - FLUSHALL
3.6.2、安装redis并且使用修改好的配置文件
helm install my-helm-2-redis bitnami/redis -f /tmp/redis/values.define.yaml --set master.persistence.enabled=false --set replica.persistence.enabled=false
3.6.3、查询helm和pod运行状态
~]# kubectl get pods NAME READY STATUS RESTARTS AGE my-helm-2-redis-master-0 1/1 Running 0 2m1s my-helm-2-redis-replicas-0 1/1 Running 0 2m1s my-helm-2-redis-replicas-1 1/1 Running 0 86s标签:示例,--,redis,helm,65,Helm,##,bitnami,my From: https://www.cnblogs.com/ygbh/p/17311936.html
~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-helm-2-redis default 1 2023-04-13 15:09:18.980635094 +0800 CST deployed redis-17.9.3 7.0.10