65、K8S-部署管理-Helm基础知识、安装、入门示例

发布时间 2023-04-13 15:15:48作者: 小粉优化大师

Kubernetes学习目录

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 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&reg; 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&reg; 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&reg; replicas to deploy
    555   ## 我们发现replicas默认是为3,现在把它修改为2
    556   replicaCount: 2
    557   ## @param replica.configuration Configuration for Redis&reg; replicas nodes
    558   ## ref: https://redis.io/topics/config
    559   ##
    560   configuration: ""
    561   ## @param replica.disableCommands Array with Redis&reg; 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运行状态