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。
- chart:是 Helm 管理的安装包,里面包含需要部署的安装包资源。
- config:包含了可以合并到打包的 chart 中的配置信息,用于创建一个可发布的对象。
- release:是一个与特定 config 相结合的 chart 的运行实例,一个 chart 可以部署多个 release,即这个 chart 可以被安装多次。
- repository:chart 的仓库,用于发布和存储 chart。
每个chart包含下面两部分:
- Chart.yaml:描述本chart的基本信息,如名称版本等
- values.yaml:chart配置的默认值
- templates:存放k8s manifest文件模板的目录,模板使用chart配置的值生成k8s manifest(yaml)文件
- charts:本chart需要依赖的其他chart
- 客户端bin:通过gRPC连接到服务器端Tiller
- 服务器端Tiller:用来调用k8s api-server
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]
Helm3 最明显的变化是删除了 Tiller
版本: v2.9.1
cd /data
wget http://openstack.oa.com/tshift/helm-v2.9.1-linux-amd64.tar.gz
: download Helm clientdocker pull docker-registry.tshift-test.oa.com/tiller:v2.9.1
: download Helm Tilleryum install -y socat
tar -zxvf helm-v2.9.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
: install Helm clienthelm init --tiller-image tiller:v2.9.1 --skip-refresh
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
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
维护了许多流行的开源镜像
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
本小节会介绍一些常用Charts的安装方法
可以通过两种方式验证部署的情况
- K8S:可以在K8S上运行一个 Pod 作为客户端
- 本地:可以用
kubectl port-forward
将MySQL服务转发到本地
注意,许多Charts(例如MySQL等数据库)需要设置PVC/StorageClass,请具体问题具体分析,使用
helm inspect all <chart>
查看要求
许多本地客户端接入命令会导致kubectl端口转发任务作为后台任务创建。可以用
jobs
命令列出用户的后台任务,然后使用kill %[n]
等命令结束(n
为后台任务的编号)
MariaDB 是和MySQL兼容的关系型数据库
helm install my-mariadb --set global.storageClass=nfs-client bitnami/mariadb
helm uninstall my-mariadb
helm uninstall
命令不会释放PVC,需要手动释放。(bitnami/mariadbl)
--set global.storageClass=nfs-client
指定了使用nfs-client作为storageClassglobal.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
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;
kubectl delete svc --all
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
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
kubectl delete svc --all
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/"
上述的命令会导致端口转发任务作为后台任务创建
kubectl delete svc --all
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/
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/
可以自定义Charts。以下是一些常见的命令
helm create hello-svc
: 创建 Helm packagehelm install --dry-run --debug ./
:验证模板和配置helm install ./
:启动本chart的releasehelm list
:列出 releasehelm delete [release]
删除特定的 release
举例说明
[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
来使用应用