Skip to content

Latest commit

 

History

History

5_Helm

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

第五章 Helm

1. Introduction

helm 是 k8s 的一个项目,相当于 Linux 的 yum。在 yum 仓库中,yum 不光要解决包之间的依赖关系,还要提供具体的程序包。helm 仓库里面只有配置清单文件而没有镜像,镜像还是由镜像仓库来提供,如 hub.docker.com、私有仓库。helm 提供了一个应用所需要的所有清单文件。例如一个 nginx,需要一个 deployment 清单文件、一个 service 清单文件、一个 hpa 的清单文件,把这 3 个文件打包到一起就是一个应用的程序包,称之为 Chart。Chart 是一个 helm 程序包,其实质只是一个模板,可以对这个模板进行赋值(value),形成自定义的清单文件。Helm 把 K8s 资源打包到一个 chart 中,而 chart 被保存到 chart 仓库,通过 chart 仓库可用来存储和分享 chart。

1.1 原理

  • chart:是 Helm 管理的安装包,里面包含需要部署的安装包资源。
  • config:包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
  • release:是一个与特定 config 相结合的 chart 的运行实例,一个 chart 可以部署多个 release,即这个 chart 可以被安装多次。
  • repository:chart 的仓库,用于发布和存储 chart。

1.2 chart 包

每个chart包含下面两部分:

  • Chart.yaml:描述本chart的基本信息,如名称版本等
  • values.yaml:chart配置的默认值
  • templates:存放k8s manifest文件模板的目录,模板使用chart配置的值生成k8s manifest(yaml)文件
  • charts:本chart需要依赖的其他chart

1.3 Helm2 架构

  • 客户端bin:通过gRPC连接到服务器端Tiller
  • 服务器端Tiller:用来调用k8s api-server

1.4 Helm3 架构

Helm Client

  • 本地 chart 开发
  • 管理仓库
  • 管理 release
  • 与 Helm 库建立接口
    • 发送安装的chart
    • 发送升级或卸载现有发布的请求

Helm Library:提供执行所有 Helm 操作的逻辑。独立的Helm库封装了Helm逻辑以便不同的客户端可以使用它。与K8s Apiserver 交互并提供以下功能:

  • 结合 chart 和 config 来构建 release
  • 将 chart 安装到 K8s 中
  • 与 K8s 交互升级和卸载 chart

Helm3 架构:

flowchart LR
A[Helm Client] <--> B[Helm Library]
Loading

Helm3 最明显的变化是删除了 Tiller

img

1.4 Installation

Helm2

版本: v2.9.1

  • cd /data
  • wget http://openstack.oa.com/tshift/helm-v2.9.1-linux-amd64.tar.gz: download Helm client
  • docker pull docker-registry.tshift-test.oa.com/tiller:v2.9.1: download Helm Tiller
  • yum install -y socat
  • tar -zxvf helm-v2.9.1-linux-amd64.tar.gz
  • mv linux-amd64/helm /usr/local/bin/helm: install Helm client
  • helm init --tiller-image tiller:v2.9.1 --skip-refresh

Helm3 Docker-for-Desktop

wget https://get.helm.sh/helm-v3.4.1-linux-amd64.tar.gz 
tar xvf helm-v3.4.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin
rm helm-v3.4.1-linux-amd64.tar.gz
rm -rf linux-amd64
helm version

1.5 Init Repo

helm version
helm repo add stable https://mirror.azure.cn/kubernetes/charts/
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add incubator https://mirror.azure.cn/kubernetes/charts-incubator/
helm repo update
helm search repo stable
helm install my-redis stable/redis
helm uninstall my-redis

bitnami维护了许多流行的开源镜像

stablehttps://mirror.azure.cn/kubernetes/charts/镜像

1.6 Repo操作

helm version
helm repo add stable https://mirror.azure.cn/kubernetes/charts/
helm repo add incubator https://charts.helm.sh/incubator/
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo stable

stable通道有https://mirror.azure.cn/kubernetes/charts/镜像可以替代

Helm3 最明显的变化是删除了 Tiller

2. 安装Charts

本小节会介绍一些常用Charts的安装方法

可以通过两种方式验证部署的情况

  • K8S:可以在K8S上运行一个 Pod 作为客户端
  • 本地:可以用kubectl port-forward将MySQL服务转发到本地

注意,许多Charts(例如MySQL等数据库)需要设置PVC/StorageClass,请具体问题具体分析,使用helm inspect all <chart>查看要求

许多本地客户端接入命令会导致kubectl端口转发任务作为后台任务创建。可以用jobs命令列出用户的后台任务,然后使用kill %[n]等命令结束(n为后台任务的编号)

2.1 MariaDB

MariaDB 是和MySQL兼容的关系型数据库

helm install my-mariadb --set global.storageClass=nfs-client bitnami/mariadb
helm uninstall my-mariadb

image-20220523112316536

helm uninstall命令不会释放PVC,需要手动释放。(bitnami/mariadbl)

--set global.storageClass=nfs-client指定了使用nfs-client作为storageClass global.storageClass的默认参数可以通过helm inspect all stable/mysql获得

可以通过kubectl get secret获取密码

export MARIADB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
echo $MARIADB_ROOT_PASSWORD

image-20220523112408293

Pod接入

pod接入之前需要先声明一个PVC

kubectl run my-mariadb-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mariadb:10.6.7-debian-10-r70 --namespace default --command -- bash
[pod] $ mysql -h my-mariadb -uroot -p
Enter Password: 
本地客户端接入
# 转发端口
MARIADB_PORT=3307
kubectl port-forward --namespace default svc/my-mysql 3307:3306
#  在另一终端
MARIADB_PORT=3307
mysql -h 127.0.0.1 -P${MARIADB_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
Enter Password: 

验证

MariaDB [(none)]> show databases;

image-20220523184849440

kubectl delete svc --all

2.2 MongoDB

MongoDB 是一个基于分布式文件存储的数据库

helm install my-mongodb --set persistence.storageClass=nfs-client stable/mongodb
helm uninstall my-mongodb

获取密码

export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
  • Pod接入
kubectl run --namespace default my-mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.2.4-debian-10-r0 --command -- mongo admin --host my-mongodb --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
  • 本地客户端接入
kubectl port-forward --namespace default svc/my-mongodb 27017:27017 & mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

验证

show dbs
use ice6413p # 创建db
db # 显示当前db
db.ice6413p.insert({"name":"ice6413p"}) # 插入一条数据
show dbs # 应该会多出一个ice6413p
db.dropDatabase() # 删除db

image-20220523190029126

2.3 Redis

Redis 是一个key-value 存储系统,是跨平台的非关系型数据库

helm install my-redis --set slave.persistence.storageClass=nfs-client,master.persistence.storageClass=nfs-client stable/redis
helm uninstall my-redis

helm uninstall命令不会释放PVC,需要手动释放。(stable/redis)

获取密码

export REDIS_PASSWORD=$(kubectl get secret --namespace default my-redis -o jsonpath="{.data.redis-password}" | base64 --decode) 
echo $REDIS_PASSWORD
  • Pod接入
kubectl run --namespace default my-redis-client --rm --tty -i --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash
[pod] $ redis-cli -h my-redis-master -a $REDIS_PASSWORD # read/write operation
[pod] $ redis-cli -h my-redis-slave -a $REDIS_PASSWORD # read-only operation
  • 本地客户端接入
kubectl port-forward --namespace default svc/my-redis-master 6379:6379 & 
redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD

验证

set aaa "xxx"
get aaa

image-20220523190700523

kubectl delete svc --all

2.4 RabbitMQ

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件

helm install my-rabbitmq --set persistence.storageClass=nfs-client stable/rabbitmq
helm uninstall my-rabbitmq

helm uninstall命令不会释放PVC,需要手动释放。(stable/rabbitmq)

获取凭据

export RABBITMQ_USERNAME="user"
export RABBITMQ_PASSWORD=$(kubectl get secret --namespace default my-rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)
export RABBITMQ_COOKIE=$(kubectl get secret --namespace default my-rabbitmq -o jsonpath="{.data.rabbitmq-erlang-cookie}" | base64 --decode)
  • 本地客户端接入"
# AMQP
kubectl port-forward --namespace default svc/my-rabbitmq 5672:5672 & echo "URL: amqp://127.0.0.1:5672/"
# Management Interface
kubectl port-forward --namespace default svc/my-rabbitmq 15672:15672 &
echo "URL: http://127.0.0.1:15672/"

上述的命令会导致端口转发任务作为后台任务创建

image-20220523191128638

image-20220523200317515

kubectl delete svc --all

2.5 Kafka

Kafka 是一种分布式的,基于发布 / 订阅的消息系统。主要设计目标如下: 以时间复杂度为 O(1) 的方式提供消息持久化能力

Kafka 不需要持久化

helm install my-kafka stable/kafka-manager
helm uninstall my-kafka
  • 本地客户端接入
export POD_NAME=$(kubectl get pods --namespace default -l "app=kafka-manager,release=my-kafka" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:9000

访问http://127.0.0.1:8080/

image-20220523191600302

2.6 ElasticSearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例

helm install my-es --set global.storageClass=nfs-client bitnami/elasticsearch
helm uninstall my-es

根据这里这里,ElasticSearch需要执行sysctl -w vm.max_map_count=262144 && sysctl -w fs.file-max=65536修改内核设置

  • 本地客户端接入
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/instance=my-es,app.kubernetes.io/component=master" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward --namespace default $POD_NAME 9200:9200 

执行curl http://127.0.0.1:9200/

image-20220523200751204

3. Custom Charts

可以自定义Charts。以下是一些常见的命令

3.1 Release

  • helm create hello-svc: 创建 Helm package
  • helm install --dry-run --debug ./:验证模板和配置
  • helm install ./:启动本chart的release
  • helm list:列出 release
  • helm delete [release] 删除特定的 release

3.2 Custom Charts

举例说明

[node] $ docker pull nginx # Selective
helm create hello-helm
helm install hello-nginx ./hello-helm
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=hello-helm" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:80
helm uninstall hello-nginx 

访问 http://127.0.0.1:8080 来使用应用

image-20220523201112666

image-20220523201059976