0%

k8s-Helm

背景:为什么要使用Helm,Helm解决了什么问题?

在之前的例子中,可以看到部署一个应用,需要写很多yaml配置(deployment, service, pv, pvc, secret, configmap),将这些配置保存到各自的文件中,或集中写进一个配置中,然后通过kubectl apply -f .部署。当应用多了起来,这种组织形式会带来以下问题:

  1. 管理维护复杂
  2. 无法将这些服务作为一个整体统一发布
  3. 不能高效的共享和重用服务
  4. 不支持应用级别的版本管理
  5. 不支持对部署的应用状态进行验证

(待补充)

Helm的引入,就是为了解决这些问题

  • 使用Helm可以把这些YAML文件作为整体管理
  • 实现YAML文件高效复用
  • 使用helm应用级别的版本管理

Helm架构

chart

chart是一个应用的信息集合,包括各种k8s对象的配置模板、参数定义、依赖关系、文档说明等;chart是应用部署的逻辑单元

helm可以创建新的chart,或与存储chart的仓库交互、拉取、保存、更新chart

release

release是chart的运行实例(应用),helm可以在k8s集群中安装、卸载、测试、更新、回滚release

架构

Helm采用客户端/服务端架构,组件如下

  • Helm Client:客户端,在本地执行,用来:
    • 本地开发chart
    • 管理chart仓库
    • 与Tiller服务器交互
    • 查看release信息
  • Tiller:服务器端,在Kubernetes集群上运行,管理应用,用来:
    • 与Helm客户端交互
    • 通过chart构建release
    • 通过 k8s API Server管理release
  • Repository:Chart仓库,Helm客户端通过HTTP协议访问仓库中Chart索引文件和压缩包
image-20201118171523403
image-20201118171956054

Think: Why remove tiller in V3?

部署Helm

部署Helm Client

helm官网 下载安装包,解压,拷贝到/usr/bin目录下

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

部署Tiller Server

使用Helm

使用helm

chart目录结构

chat模板

开发chart

实践:安装wordpress

搜索wordpress helm包

helm search repo wordpress

image-20220417015525266

执行安装命令

helm install happy-dog bitnami/wordpress

image-20220417033300848

遇到问题:无法创建pvc

image-20220417020330093
image-20220417020354987

猜测原因:chart中使用了动态pvc,但k8s集群没有安装动态pvc

尝试安装动态pvc:

helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=node1 --set nfs.path=/home/work/nfs --set storageClass.defaultClass=true

验证动态pv

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client
resources:
requests:
storage: 1Gi
EOF

pvc 状态为 pending

image-20220417024141132

查看pvc描述 kubectl describe pvc {pvc-name}

查看 cluster.local/nfs-client-provisioner 日志

image-20220417024322442

问题原因:k8s V1.20中移除了SelfLink https://github.com/kubernetes/enhancements/issues/1164

解决方案 from https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/pull/26#issuecomment-743745469 覆盖 nfs-client-provisioner 的image,使用支持k8s 1.20版本的镜像:

1
2
3
image:
repository: rkevin/nfs-subdir-external-provisioner
tag: fix-k8s-1.20

helm show values stable/nfs-client-provisioner

替换方式使用--set(先uninstall)

helm install nfs-client-provisioner stable/nfs-client-provisioner --set nfs.server=node1 --set nfs.path=/home/work/nfs --set storageClass.defaultClass=true --set image.repository=rkevin/nfs-subdir-external-provisioner --set image.tag=fix-k8s-1.20

或者使用--valueshelm install -f values.yaml bitnami/wordpress --generate-nameusing helm

问题解决 :+1:

总结:helm安装release时动态pvc,如果pv使用nfs,需要安装nfs-client-provisioner

访问wordpress服务

查看service

image-20220417033358303

在浏览器输入master:32386访问

实践:自己创建chart包安装应用

遇到问题

  1. 在V3中为什么去掉了tiller模块?
  2. self-link 是什么,为什么要在v1.20中去掉