k8s之Helm基础
Helm简介
产生背景
使用K8s部署一个应用,涉及到很种K8s资源的协作,如Deployment、Service、Secret、pv、 pvc 等。这么多资源,且过于分散,使用kubectl来进行维护和创建,极其不方便。
Helm将应用的一系列资源当做一个软件包来管理,统一管理、配置和更新这些分散的 k8s 的应用资源文件,分发和复用一套应用模板。可以将Hlem类比为yum,apt。
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。
- 查找要安装和使用的预打包软件
- 轻松创建和托管自己的软件包
- 将软件包安装到任何 K8S 集群中
- 查询集群以查看已安装和正在运行的程序包
- 更新、删除、回滚或查看已安装软件包的历史记录
Helm的一些概念
- helm :一个命令行工具,Helm的客户端,用于本地开发及管理chart,chart仓库管理等
- Tiller :Helm 的服务端。Tiller 负责接收 Helm 的请求,与 k8s 的 apiserver 交互,根据chart 来生成一个 release 并管理 release.Helm3移除Tiller。
- chart:Helm的打包格式叫做chart,chart就是一系列k8s文件, 它描述了一组相关的 k8s 集群资源
- release :chart的运行实例,当 chart 被发布后,Helm 库会创建一个 release 来跟踪这个发布的对象。你可以用不同的release name多次安装同一个chart:有点像镜像和容器的关系。
- Repoistory:Helm chart 的仓库,用来存chart包,和 yum repository类似。
Helm命令
1、应用管理操作
#列出charts仓库中所有可用的应用
helm search
#查询指定应用
helm search memcached
#查询指定应用的具体信息
helm inspect stable/memcached
#用helm安装软件包,--name:指定release名字
helm install --name memcached1 stable/memcached
#查看安装的软件包
helm list
#删除指定引用
helm delete memcached1
2、Helm repository仓库管理命令
#添加chart仓库
helm repo add <仓库名称> <仓库URI地址>
#查看chart仓库列表
helm repo list
#更新chart仓库中的chart软件包列表
helm repo update
#删除chart仓库
helm repo remove <仓库名称>
#查看仓库中可用的chart包列表
helm search repo <仓库名称>
#查看仓库中指定的chart包的所有历史版本列表
helm search repo <仓库名称/软件包> -l
#查看chart包的基本信息
helm show chart <仓库名称/软件包>
#查看chart包的所有信息
helm show all <仓库名称/软件包>
2.2 Helm chart包管理命令
#从仓库拉取chart包
helm pull <仓库名称/软件包>
#创建一个chart目录
helm create <软件包>
#检查chart配置语法是否正确
helm lint <chart目录>
#将chart目录打包成chart包(tar包格式)
helm package <chart目录>
3、Helm release(实例) 管理命令
#通过chart包安装实例
1、helm install <实例名称> <仓库名称/软件包> -n 命名空间 [--version=<chart版本>]
#还可以通过其他方式安装
2、本地 chart 压缩包(helm install foo foo-0.1.1.tgz)
3、解压后的 chart 目录(helm install foo path/to/foo)
4、完整的 URL(helm install foo https://example.com/charts/foo-1.2.3.tgz)
#查看helm安装的实例
helm ls|list -n 命名空间
#查看实例的状态
helm status <实例名称> -n 命名空间
#卸载实例
helm uninstall <实例名称> -n 命名空间、
helm uninstall 的时候提供 --keep-history 选项, Helm将会保存版本历史。可以用helm status 查看,进而用helm rollback 回滚版本。
#升级实例
helm upgrade -n 命名空间 <实例名称> <chart包>
指定配置文件升级
helm upgrade -f panda.yaml happy-panda bitnami/wordpress
helm get values 命令来看看配置值是否真的生效了
#查看实例的历史版本列表
helm history -n 命名空间 <实例名称>
#回滚实例到指定的chart历史版本
helm rollback -n 命名空间 <实例名称> <chart版本序号>
4、Helm私有仓库管理命令
私有仓库地址格式: http://<私有仓库URL地址>/chartrepo/<项目名>
helm repo add <私有仓库名称> <私有仓库地址> --username=<仓库用户> --password=<用户密码>
helm push <chart包> <私有仓库名称>
安装Helm
helm和k8s版本对应关系
下载 Helm 二进制文件安装
wget https://get.helm.sh/helm-v3.14.4-linux-amd64.tar.gz
解压缩
tar -zxvf helm-v3.14.4-linux-amd64.tar.gz
复制 helm 二进制 到bin目录下
cp linux-amd64/helm /usr/local/bin/
chmod a+x /usr/local/bin/helm
source ~/.bashrc
#运行以下命令使用命令自动补全
cat >> ~/.bashrc <<EOF
source <(helm completion bash)
EOF
source ~/.bashrc
Helm基本使用
仓库使用
添加常用仓库
#添加 Bitnami 官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
#添加 Azure 中国提供的稳定版 Helm Charts 仓库,该仓库中包含了丰富的 Kubernetes 应用的 Helm Charts
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#阿里云提供的 Helm Charts 仓仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#添加官方稳定仓库
helm repo add stable https://charts.helm.sh/stable
#添加官方测试仓库(可能添加不上)
helm repo add incubator https://charts.helm.sh/incubator
更新仓库获取数据
helm repo update
查看仓库
helm repo list
helm search 两种来源中进行搜索:
– helm search hub 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。
– helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。
查看stable仓库可用的charts列表
helm search repo stable
查看指定chart的信息,是show all的头部信息
helm show chart stable/mysql
查看指定chart的所有信息,非常详细
helm show all stable/mysql
chart的结构
[root@k8s-master01 helm]# helm create nginx
Creating nginx
[root@k8s-master01 helm]# tree nginx/
nginx/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
- charts 目录 可以 包含其他的chart(称之为 子chart)。
- Chart.yaml 文件包含了该chart的描述。可以从模板中访问它。
- templates 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给
- values.yaml 这个文件包含了chart的 默认值 。这些值会在用户执行helm install 或 helm upgrade时被覆盖。
NOTES.txt chart的”帮助文本”。这会在你的用户执行helm install时展示给他们。
_helpers.tpl: 放置可以通过chart复用的模板辅助对象
部署redis
#指定 release 的名字为my-redis,-n 指定应用到k8s 的 namespace
helm install my-redis bitnami/redis [-n default]
注意reis部署需要pv,不然报错
删除redis
helm uninstall my-redis
修改chart默认配置
以上是使用默认的配置,但是可能不可能完全符合需求
使用 helm show values 可以查看 chart 中的可配置选项
[root@k8s-master01 helm]# helm show values stable/redis | egrep -v '^( *#|$)'
global:
redis: {}
image:
registry: docker.io
repository: bitnami/redis
tag: 5.0.7-debian-10-r32
pullPolicy: IfNotPresent
.......省略........
resources: {}
podSecurityPolicy:
create: false
然后可以使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件。
echo '{mariadb.auth.database: user0db, mariadb.auth.username: user0}' > values.yaml
helm install -f values.yaml bitnami/wordpress --generate-name
--generate-name 自动生成名字
安装过程中有两种方式传递配置数据:
--values (或 -f):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件。
--set:通过命令行的方式对指定项进行覆盖。
--set a=b,c=d set多个值用逗号隔开
--set name={a, b, c} set列表使用花括号
--set servers[0].port=80 2.5开始使用数组下标来访问列表
使用Helm安装Rancher
Rancher官网
Rancher和k8s的版本对应关系
cert-manager官网
自动添加证书配置
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
kubectl create namespace cattle-system
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.crds.yaml
helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl create namespace cert-manager
helm install my-release --namespace cert-manager --version v1.14.5 jetstack/cert-manager
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=myrancher.com \
--set replicas=1 \
--set bootstrapPassword=admin \
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.class'=nginx
如果不加
--set ingress.extraAnnotations.'kubernetes\.io/ingress\.class'=nginx
会无法在外部访问rancher,需要给ingress添加注解或者修改ingressClasssNmae,两者二选一
kubernetes.io/ingress.class: nginx
ingressClassName: nginx
输入域名进行访问,我的ingressController设置是30080和30043端口访问,看个人设置,一般大家可以直接80访问
https://myrancher.com:30043/
最后的server URL好像不做解析也可以
修改语言为中文
点击local即可查看本机k8s集群了
问题及解决
pod has unbound immediate PersistentVolumeClaims
0/3 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling..
没有pv导致错误,安装nfs,创建pv即可,例如nfs在192.168.126.23,pv挂载在/data/k8svolumes/v2
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02
labels:
name: pv02
spec:
nfs:
server: 192.168.126.23
path: /data/k8svolumes/v2
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
FATAL CONFIG FILE ERROR (Redis 7.2.5)
Reading the configuration file, at line 1
>>> 'dir /data'
Permission denied
也是pv的问题,删除pvc、pv重新生成即可