百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

k8s实践(九):Helm and Kubeapps UI

connygpt 2024-09-09 03:08 9 浏览

一、概述

1. Helm简介

??Helm是一个Kubemetes包管理器(类似于OS包管理器,比如Linux中的yum、apt,或者MacOS中的 homebrew)。

??Helm包括两个部分:helm客户端和tiller服务端。

helm客户端

helm客户端是一个命令行工具,负责管理charts、repository和release。它通过gPRC API(使用kubectl port-forward将tiller的端口映射到本地,然后再通过映射后的端口跟tiller通信)向tiller发送请求,并由tiller来管理对应的Kubernetes资源。helm作用:

  • 本地Charts开发;
  • 管理Charts仓库;
  • 与Tiller服务器交互:发送Charts以安装、查询Release的相关信息及升级或卸载已有的Release

tiller 服务端

tiller 接收来自helm客户端的请求,并把相关资源的操作发送到Kubernetes,负责管理(安装、查询、升级或删除等)和跟踪 Kubernetes 资源。为了方便管理,tiller把release的相关信息保存在kubernetes的ConfigMap中。tiller作用:

  • 监听来自helm客户端的请求;
  • 合并Charts和配置以构建一个Release;
  • 向Kubernetes集群安装Charts并对相应的Release进行跟踪;
  • 升级和卸载Charts;

图片.png

2. 为什么需要Helm

??Kubernetes虽然提供了多种容器编排对象,例如Deployment、StatefulSet、DeamonSet、Job等,还有多种基础资源封装例如ConfigMap、Secret、Serivce等,但是一个应用往往有多个服务,有的可能还要依赖持久化存储,当这些服务之间直接互相依赖,需要有一定的组合的情况下,使用YAML文件的方式配置应用往往十分繁琐还容易出错,这时候就需要服务编排工具。

??服务编排管理工具就是构建在kubernetes的基础object之上,统筹各个服务之间的关系和依赖的。目前常用到的工具是Helm。

3. Helm核心术语

Chart:一个Helm包,其中包含了运行一个应用所需要的工具和资源定义,还可能包含Kubernetes集群中的服务定义,类似于Homebrew中的formula、APT中的dpkg或者Yum中的RPM文件: Release:在Kubernetes集群上运行的一个Chart实例。在同一个集群上,一个Chart可以安装多次。例如有一个MySQLChart,如果想在服务器上运行两个MySQL数据库,就可以基于这个Chart安装两次,每次安装都会生成新的Release,会有独立的Release名称; Repository:用于存放和共享Chart的仓库。

Helm将charts安装到Kubernetes中,每个安装创建一个新release。要找到新的chart,可以搜索Helm charts存储库repositories。

二、安装Helm

1. 安装Helm Client

Helm客户端可以从源代码安装,也可以从预构建的二进制版本安装或执行安装脚本。

1.1 脚本安装方式

Helm现在有一个安装shell脚本,将自动获取最新版本的Helm客户端并在本地安装。

[root@master ~]# curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash

脚本方式安装很简单,执行一条命令就行。

1.2 二进制方式安装

这种方式可以选择helm客户端安装版本,下载二进制文件:https://github.com/helm/helm/releases/ ,例如下载2.14.2版本:

[root@master ~]# curl -L https://get.helm.sh/helm-v2.14.2-linux-amd64.tar.gz -o helm-v2.14.2-linux-amd64.tar.gz
[root@master ~]# tar -zxvf helm-v2.14.2-linux-amd64.tar.gz 
linux-amd64/
linux-amd64/LICENSE
linux-amd64/helm
linux-amd64/README.md
linux-amd64/tiller
[root@master ~]# cp linux-amd64/helm /usr/bin
[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Error: could not find tiller

下载二进制文件、解压、拷贝命令,执行helm version命令发现helm客户端版本为v2.14.2,服务端tiller还未安装,本文测试基于v2.14.3最新版。

1.3 命令补全

[root@master ~]# echo   "source <(helm completion bash)" >> .bash_profile
[root@master ~]# source .bash_profile

图片.png

2. 安装Tiller server

2.1 设置环境变量

[root@master ~]# mkdir helm
[root@master ~]# echo 'export HELM_HOME=~/helm' >> .bash_profile 
[root@master ~]# source .bash_profile 
[root@master ~]# echo $HELM_HOME
/root/helm

设置helm的home目录为/root/helm,tiller将安装于该目录下

图片.png

2.2 创建带有cluster-admin角色权限的服务账户

[root@master ~]# more rbac-config.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
[root@master ~]# kubectl create -f rbac-config.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
[root@master ~]# kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller
secret/tiller-token-dz4lt
serviceaccount/tiller
clusterrolebinding.rbac.authorization.k8s.io/tiller

否则helm install可能会报权限错误:

Error: no available release name found
Error: the server does not allow access to the requested resourc

图片.png

2.3 下载tiller镜像

[root@master helm]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3
[root@master helm]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 gcr.io/kubernetes-helm/tiller:v2.14.3
[root@master helm]# docker rmi -f registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3

由于网络原因官网镜像无法下载,下载阿里源镜像,打上tag并删除原镜像。注意,每个node节点都需执行以上操作。

图片.png

2.4 安装Tiller

[root@master ~]# helm init --service-account tiller

安装的tiller版本与helm客户端版本一致

图片.png

3. 卸载Helm

3.1 卸载tiller server

[root@master ~]# helm reset --force
[root@master ~]# kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system delete
[root@master ~]# kubectl get all -n kube-system -l app=helm -o name|xargs kubectl delete -n kube-system
[root@master ~]# rm -rf /root/helm

卸载tiller,删除相关资源和文件

图片.png

3.2 卸载helm客户端

[root@master ~]# rm -rf /usr/bin/helm
[root@master ~]# rm -rf helm-v2.14.3-linux-amd64.tar.gz 
[root@master ~]# rm -rf linux-amd64/

helm客户端卸载只需移除相关文件即可

三、Helm UI

Kubeapps提供了一个开源的Helm UI界面,方便以图形界面的形式管理Helm应用。Kubeapps特点:

部署应用。可从公共或私有仓库中浏览chart并将其部署到集群中; 管理应用。升级、管理和删除部署在kubernetes集群中的应用程序; 搜索功能。Kubeapps提供chart搜索页面;

1. 新增仓库bitnami

[root@master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
[root@master ~]# helm update
Command "update" is deprecated, use 'helm repo update'

Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "bitnami" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
[root@master ~]# helm repo list
NAME    URL                                             
stable  https://kubernetes-charts.storage.googleapis.com
local   http://127.0.0.1:8879/charts                    
bitnami https://charts.bitnami.com/bitnami

图片.png

2. 安装Kubeapps

[root@master ~]# helm install --name kubeapps --namespace kubeapps bitnami/kubeapps

安装的时候主要遇到的问题是网络,即镜像下载失败,可通过手动方式下载镜像到对应节点方式解决。

图片.png

kubeappspod资源列表如下:

图片.png

3. 创建API token

[root@master ~]# kubectl create -n default serviceaccount example
serviceaccount/example created
[root@master ~]# kubectl get -n default secret $(kubectl get -n default serviceaccount example -o jsonpath='{.secrets[].name}') -o jsonpath='{.data.token}' | base64 --decode 
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImV4YW1wbGUtdG9rZW4tdHBmdHoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZXhhbXBsZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImFhZTIxZmE0LWU5N2ItMTFlOS05Njk0LTAwMGMyOWQ5OWJhMyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmV4YW1wbGUifQ.Cto0Csh7n6Uk_cgGWGGGiMXVie8IBX-yu3fKWGFgX4rxhjT1pwS1PXI7Kq2M-c00DJhHEih2cHFZ7trwZdLrBpI3qJUz5Ymta3I3k5V2m0C_H3wXH9KODIRAhOxT45yFPk3gmdfl8-QBKLD8bB8WufHTTO0SeJ1hsAWDX5S9f3EyTmYhjI6UPEnlWiheq-WjiR1Ba7ZRzCCr4KU3_UIZ_GTF0D_1a5yghizwwngdOs7dPdLfuKOwbgjBhEBlWP4nINa2ixo03EE2EzjfAVtX6SQTuJu1lAmH-vZZi19pKc6PyMzSjfUKHmB-W5dfcbmPhv4OAlJxx4tZffq8fKP0cw[root@master ~]# 

创建serviceaccount example并获取secret,登录时会用到。

图片.png

4. 创建service

[root@master ~]# more kubeapps-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kubeapps-svc
  namespace: kubeapps 
spec:
  type: NodePort
  selector:
    app: kubeapps
  ports:
  - protocol: TCP
    nodePort: 30002
    port: 8080
    targetPort: 8080
[root@master ~]# kubectl apply -f kubeapps-service.yaml
service/kubeapps-svc created
[root@master ~]# kubectl get service -n kubeapps 
NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubeapps                         ClusterIP   10.103.27.24    <none>        80/TCP           46m
kubeapps-internal-chartsvc       ClusterIP   10.102.122.69   <none>        8080/TCP         46m
kubeapps-internal-dashboard      ClusterIP   10.110.249.91   <none>        8080/TCP         46m
kubeapps-internal-tiller-proxy   ClusterIP   10.105.104.45   <none>        8080/TCP         46m
kubeapps-mongodb                 ClusterIP   10.96.175.241   <none>        27017/TCP        46m
kubeapps-svc                     NodePort    10.98.2.173     <none>        8080:30002/TCP   6s

创建servicekubeapps-svc用于登陆访问。

图片.png

5. 登录kubeapps

登录kubeapps,地址为:http://NodeIp:30002,密码为之前创建的secret

图片.png

输入secret后登陆成功

图片.png

6.通过kubeapps创建mysql

6.1 授权

[root@master ~]# kubectl create clusterrolebinding example --clusterrole=cluster-admin --serviceaccount=default:example
clusterrolebinding.rbac.authorization.k8s.io/example created

授予example用户集群管理访问权限

6.2 创建pv

部署mysql服务时需8G的pv

nfs和pv搭建详见:k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

[root@master ~]# more kubeapps-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-mysql
spec:
  capacity:
    storage: 8Gi                             #指定PV容量为8G
  volumeMode: Filesystem                     #卷模式,默认为Filesystem,也可设置为'Block'表示支持原始块设备
  accessModes:
    - ReadWriteOnce                          #访问模式,该卷可以被单个节点以读/写模式挂载
  persistentVolumeReclaimPolicy: Retain      #回收策略,Retain(保留),表示手动回收
  nfs:                                       #指定NFS共享目录和IP信息
    path: /backup/v1
    server: 172.27.9.181
[root@master ~]# kubectl apply -f kubeapps-pv.yaml 
persistentvolume/pv-mysql created
[root@master ~]# kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-mysql   8Gi        RWO            Retain           Available                                   5s

图片.png

6.3 创建mysql

图片.png

仓库选择stable

图片.png

选择deploy

图片.png

name为mysql-stable,submit

图片.png

mysql部署成功

6.4 进入mysql

[root@master ~]# kubectl get secret --namespace default mysql-stable -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo
L31oZF8AJ2
[root@master ~]# kubectl exec -it mysql-stable-76674bc757-8crfk sh
# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.7.14 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

图片.png

四、Helm的使用

1. helm search

[root@master ~]# helm search mysql

使用search命令可搜索仓库中的mysql应用

图片.png

2. helm inspect

[root@master ~]# helm inspect values stable/mysql

使用inspect查询package详细信息,之前kubeapps部署mysql时需要8G的pv就是通过该命令获得的。

图片.png

3. helm status

[root@master ~]# helm ls
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
kubeapps        1               Tue Oct  8 10:41:57 2019        DEPLOYED        kubeapps-2.1.6  v1.5.1          kubeapps 
mysql-stable    1               Tue Oct  8 15:39:07 2019        DEPLOYED        mysql-1.4.0     5.7.27          default  
[root@master ~]# helm status mysql-stable

通过status查询之前部署的服务mysql-stable的状态

图片.png

4. helm delete

[root@master ~]# helm delete --purge mysql-stable
release "mysql-stable" deleted

通过delete可删除之前部署的mysql-stable服务

图片.png

5. helm install

[root@master ~]# helm install --name my-database stable/mysql

通过install安装部署package,服务名为my-database;由于pv回收策略为Retain,需手动回收,故删除pv并重建。

图片.png

6. helm upgrade

[root@master ~]# helm upgrade --force --set imageTag=5.7.15 my-database stable/mysql

mysql镜像由5.7.14升级到了5.7.15

图片.png

7. helm rollback

[root@master ~]# helm history my-database
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Wed Oct  9 17:28:51 2019        SUPERSEDED      mysql-1.4.0     Install complete
2               Wed Oct  9 17:31:09 2019        DEPLOYED        mysql-1.4.0     Upgrade complete
[root@master ~]# helm rollback my-database 1
Rollback was a success.
[root@master ~]# kubectl get deployments. -o wide
NAME                READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS          IMAGES         SELECTOR
my-database-mysql   1/1     1            1           16m   my-database-mysql   mysql:5.7.14   app=my-database-mysql,release=my-database

回滚至上一个版本,镜像版本回退为5.7.14

图片.png

8. helm fetch

[root@master ~]# helm fetch stable/mysql
[root@master ~]# ll|grep mysql
-rw-r--r--  1 root root    10657 10月 10 11:20 mysql-1.4.0.tgz

可通过helm fetch命令下载chart

五、Chart目录结构

[root@master ~]# helm fetch stable/wordpress   
[root@master ~]# tar -zxvf wordpress-7.3.9.tgz 

以wordpress为例介绍Charts目录结构

图片.png

文件名

说明

charts

可选,包含该Chart所依赖的其他Chart,依赖管理推荐采用requirements.yaml文件来进行

Chart.yaml

用于描述Chart信息的YAML文件

requirements.yaml

指明Chart可能依赖其他的Chart,与charts区别是charts需要提供整个Chart的文件,requirements仅需要注明依赖Chart的仓库信息

templates

可选,结合values.yaml,能够生成Kubernetes的manifest文件

templates/NOTES

可选,文本文件,用法描述

values.yaml

提供了Chart定制化安装是配置参数的默认值

六、搭建本地仓库

在master节点上启动httpd容器来搭建私有仓库,容器的volume采用Bind mounts方式,挂载点使用NFS共享存储,Docker Bind mounts实践详见:Docker实践(三):数据持久化及共享

1. 创建自定义chart并打包

[root@master ~]# helm create mychart
Creating mychart
[root@master ~]# helm package mychart/
Successfully packaged chart and saved it to: /root/mychart-0.1.0.tgz

Helm会自动创建目录mychart,并生成了各类chart文件,默认包含一个 nginx 应用示例。

图片.png

2. 挂载NFS共享目录

[root@master ~]# mkdir /repo
[root@master ~]# showmount -e 172.27.9.181
[root@master ~]# mount -t nfs 172.27.9.181:/helm-repo /repo

本地新建目录repo,挂载nfs共享目录/helm-repo

图片.png

3. 新建容器web-repo

[root@master ~]# docker run -d -p 81:80 -v /repo/:/usr/local/apache2/htdocs --name web-repo httpd

新建容器web-repo,端口映射为81

图片.png

4. 生成仓库的index文件

[root@master ~]# mkdir /repo/charts
[root@master ~]# mv mychart-0.1.0.tgz /repo/charts/
[root@master ~]# helm repo index /repo/charts --url http://172.27.9.131:81/charts

新建目录/repo/charts,Helm会扫描/repo/charts目录中的所有tgz包并生成index.yaml。--url指定的是新仓库的访问路径。新生成的 index.yaml记录了当前仓库中所有chart的信息

图片.png

5. 将新仓库添加到Helm

[root@master charts]# helm repo add pri-repo http://172.27.9.131:81/charts
"pri-repo" has been added to your repositories

新仓库命名为pri-repo

图片.png

6. 验证新仓库

[root@master charts]# helm install pri-repo/mychart

从新的仓库pri-repo中部署应用,访问nginx服务正常;当然,私有镜像也可以部署在其他节点或者专门的镜像服务器上

图片.png

7. 更新本地仓库

[root@master charts]# helm repo index /repo/charts --url http://172.27.9.131:81/charts
[root@master charts]# helm repo update 

当本地仓库有chart增减时,可通过执行update更新。

图片.png

本文所有脚本和配置文件已上传:https://github.com/loong576/k8s-Helm-and-Kubeapps.git

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&amp;Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick &#39;n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...