1 helm
1.1什么是helm
helm是k8s的包管理工具,类似于centos的yum,k8s将管理的资源都抽象成api,并且推荐使用声明方式创建,修改,删除这些对象,每个 API 对象都通过一个 yaml 格式或者 json 格式的文本来声明。这带来的一个问题就是这些 API 对象声明文本的管理成本,每当我需要创建一个应用,都需要去编写一堆这样的声明文件,helm就是管理这些api对象的工具,它把创建一个应用所需的所有 Kubernetes API 对象声明文件组合并打包在一起。并提供了仓库的机制便于分发共享,还支持模版变量替换,同时还有版本的概念,使之能够对一个应用进行版本的管理。
1.2 helm 的架构
前面我们在使用wordpress+MySQL 部署博客应用的时候,需要做许多的工作,需要每个pod创建pv 和pvc,然后分别创建每个应用的pod 及svc,整个过程非常的麻烦。 如果搭建博客所有步骤作为一个整体,放在一个文件夹里(叫做chart),以后我们直接使用这个chart 就可以把所有的操作一次性做完,这样很容易实现了一个博客应用(chart 的一个实例,叫做release),就非常的方便了。这个就类似于我们用虚拟机模板去克隆出来一台台的虚拟机,这样就省的在一台台的去安装了,这个模板就是chart,克隆出来的虚拟机就是release。 helm 实现的就是这样的功能,在互联网上存在chart 仓库(也可以自己搭建)包括了各种应用,我们需要什么应用直接拉取部署即可。 在helm 2.X 版本的时候,helm 是一种C/S 结构的应用,包括helm 客户端和tiller 服务器端,用户通过helm 客户端向tiller 服务端发送部署请求,tiller 服务端和kubernetes 的apiserver进行交互然后部署。
1.3Helm 常用命令
-
helm create:在本地创建新的 chart;
-
helm dependency:管理 chart 依赖;
-
helm intall:安装 chart;
-
helm lint:检查 chart 配置是否有误;
-
helm list:列出所有 release; helm package:打包本地 chart;
-
helm repo:列出、增加、更新、删除 chart 仓库;
-
helm rollback:回滚 release 到历史版本;
-
helm pull:拉取远程 chart 到本地;
-
helm search:使用关键词搜索 chart;
-
helm uninstall:卸载 release;
-
helm upgrade:升级 release;
2.helm仓库管理
2.1 配置国内helm源
-
master节点查看现在使用的仓库:
[root@k8s231.com mychar]# helm repo list
NAME URL
azure http://mirror.azure.cn/kubernetes/charts/
-
国内常用的仓库有:
-
阿里云的源
https://apphub.aliyuncs.com
【建议用这个】 -
微软azure 的源
http://mirror.azure.cn/kubernetes/charts/
-
-
添加仓库的语法:
helm repo add 名称地址
搭建私有仓库(其他节点)
-
10.0.0.101
我们用nginx做私库服务,首先需要确保本地80端口没有被占用,如果被占用,则先把端口对应的服务停了
ss -ntl |grep 80
-
docker拉取镜像启动
#创建挂载目录
mkdir /mycharts
docker run -dit --name= --restart=always -p 80:80 -v /mycharts:/usr/share/nginx/html/mycharts nginx
定义一个chart【master上操作】
#创建一个chart
helm create
#修改chart的values.yaml文件
[root@k8s231.com helm]# sed -i '/repository/s#nginx#harbor.com/apps/apps#' web/values.yaml
#查看修改后的文件
[root@k8s231.com helm]# grep repository web/values.yaml
repository: harbor.com/apps/apps
#修改tag标签
[root@k8s231.com helm]# sed -i '/tag:/s#""#v1#' web/values.yaml
#查看
[root@k8s231.com helm]# grep tag: web/values.yaml
tag: v1
#对这个chart 进行打包
helm package web
#会生成一个.taz结尾的文件
[root@k8s231.com helm]# ls
web-linux web web-0.1.0.tgz
#给当前目录下的这个包建立索引文件,并指定私有仓库地址:
[root@k8s231.com helm]# helm repo index . --url http://10.0.0.101:80/mycharts
#把当前目录下index.yaml 和后缀为tgz 的包全部拷贝10.0.0.101:80的/mycharts 目录下
[root@k8s231.com helm]# ll
总用量 8
-rw-r--r-- 1 root root 440 8月 30 21:07 index.yaml
drwxr-xr-x 4 root root 93 8月 30 08:28 web-linux
drwxr-xr-x 4 root root 93 8月 30 15:12 web
-rw-r--r-- 1 root root 3795 8月 30 21:01 web-0.1.0.tgz
[root@k8s231.com helm]# scp index.yaml *.tgz 10.0.0.101:/mycharts
root@10.0.0.101's password:
index.yaml 100% 440 626.1KB/s 00:00
web-0.1.0.tgz
#添加http://10.0.0.101:80/mycharts作为仓库:
[root@k8s231.com helm]# helm repo add myrepo http://10.0.0.101:80/mycharts
"myrepo" has been added to your repositories
#查看是否添加成功
[root@k8s231.com helm]# helm repo list
NAME URL
web-azure http://mirror.azure.cn/kubernetes/charts/
myrepo http://10.0.0.101:80/mycharts
#搜索web的chart
[root@k8s231.com helm]# helm search repo web
NAME CHART VERSION APP VERSION DESCRIPTION
myrepo/web 0.1.0 1.16.0 A Helm chart for Kubernetes
#拉取私库chart包
[root@k8s231.com helm]# helm pull myrepo/web
[root@k8s231.com helm]# ll
总用量 4
-rw-r--r-- 1 root root 3795 8月 30 21:48 web-0.1.0.tgz
#解压chart包
[root@k8s231.com helm]# tar xf web-0.1.0.tgz
[root@k8s231.com helm]# ll
总用量 4
drwxr-xr-x 3 root root 79 8月 30 21:48 web
-rw-r--r-- 1 root root 3795 8月 30 21:48 web-0.1.0.tgz
#安装chart
[root@k8s231.com helm]# helm install myweb web
NAME: myweb
LAST DEPLOYED: Wed Aug 30 21:51:38 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=web,app.kubernetes.io/instance=myweb" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
#验证部署的pod
[root@k8s231.com helm]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-web-66dc87fcd5-7jms2 1/1 Running 0 7s 10.100.1.7 k8s232.com <none>
[root@k8s231.com 1]# curl 10.100.1.7
<h1 style='color:green;'>web apps v1 <h1>
私有仓库配置完毕。
#删除本地私有仓库地址:
[root@k8s231.com helm]# helm repo remove myrepo
"myrepo" has been removed from your repositories