14-K8S之helm入门到逃跑
helm入门
1.helm介绍
Helm相当于linux环境下的yum包管理工具,helm也是go语言开发的。
helm是一k8s中的一个命令行客户端工具,helm是tiller的客户端,tiller是一个守护进程,接收helm的请求
helm把请求交给tiller,tiler和apiserver交互,由apiserver负责完成创建,我们用哪个chart需要下载到本地,基于本地这个chart部署实例,这个部署的实例叫做release
chart:一个helm程序包,比方说我们部署nginx,需要deployment的yaml,需要service的yaml,这两个清单文件就是一个helm程序包,在k8s中把这些yaml清单文件叫做chart图表
vlues.yaml文件为模板中的文件赋值,可以实现我们自定义安装
如果是chart开发者需要自定义模板,如果是chart使用者只需要修改values.yaml即可
config
release
总结:
helm把kubernetes资源打包到一个chart中,制作并完成各个chart和chart本身依赖关系并利用chart仓库实现对外分发,而helm还可实现可配置的对外发布,通过values.yaml文件完成可配置的发布,如果chart版本更新了,helm自动支持滚更更新机制,还可以一键回滚,但是不是适合在生产环境使用,除非具有定义自制chart的能力
helm属于kubernetes一个项目:
2.helm核心术语
Chart: 一个helm程序包;
repository:存放chart图表的仓库,https/http服务器;提供部署k8s应用程序需要的那些yaml清单文件
release:特定的chart部署于目标集群上的一个实例;
Chart-->Config(value.yaml清单)->Release
程序架构:
helm:客户端,管理本地的Chart仓库,管理Chart,与Tiller服务器交互,发送Chart,实例安装、查询、卸载等操作
Tiller:服务端,接收helm发来的Charts与Config,合并生成release;
chart--->通过values.yaml这个文件赋值-->生成release实例
3.helm下载和安装
helm与k8s集群适配版本说明,由于当前k8s集群是1.22版本,需要安装3.7+版本的helm
Helm3.6下载地址
helm v2和helm v3的区别官方文档有说明,以及如何从v2迁移到v3版本,helm v3版本不再使用tiller服务端,只有helm客户端二进制。
3.1以helm3.6为测试实例
wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
tar xfz helm-v3.6.0-linux-amd64.tar.gz
cd linux-amd64/
mv helm /usr/local/bin/
# 查看helm版本
helm version
'''
version.BuildInfo{Version:"v3.6.0", GitCommit:"7f2df6467771a75f5646b7f12afb408590ed1755", GitTreeState:"clean", GoVersion:"go1.16.3"}
'''
3.2以helm3.7.2为例
和3.1安装方法一样
helm --help # 查看具体使用
在使用helm之前要确保k8s集群上有tiller可以用,使用 helm init就可以自动生成tiller;只要制定好获取的k8s集群。helm第一次init的时候,需要联系到apiserver,让apiserver指挥着安装tiller pod,所以意味着helm需要apiserver的认证,获取管理员权限。在运行helm,helm会获取当前系统上 kubectl的配置文件(~/.kube/config),此配置文件可以让helm像kubectl一样充当apiserver的客户端,在k8s集群之上完成初始化、进行应用程序的部署和安装。
tiller运行在k8s集群之上,需要获取集群的管理权限,否则无法完成应用程序的安装和卸载等管理操作。在启用RBAC的k8s集群上,需要设置RBAC的配置,通常依赖的用户名就叫做tiller,是个服务账号(ServiceAccount),如果想让Tiller拥有很大的管理权限的话,需要让它使用ClusterRoleBinding绑定在ClusterAdmin(k8s集群自带的角色)这个ClusterRole角色上。
helm v2版本在集群上部署Tiller
给Tiller 创建账号(ServiceAccount)并绑定到集群cluster-admin的角色ClusterRole,参考gitlab Tiller rbac
1.创建整个集群级别的tiller
可以管理所有名称空间内的资源
cat tiller-rbac-config.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
kubectl create -f rbac-config.yaml
helm init --service-account tiller --history-max 200
2.创建某个名称空间级别的tiller
只能管理SA账号所在的名称空间的资源对象
kubectl create namespace tiller-world
kubectl create serviceaccount tiller --namespace tiller-world
cat role-tiller.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-manager
namespace: tiller-world
rules:
- apiGroups: ["", "batch", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
kubectl create -f role-tiller.yaml
cat rolebinding-tiller.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: tiller-world
subjects:
- kind: ServiceAccount
name: tiller
namespace: tiller-world
roleRef:
kind: Role
name: tiller-manager
apiGroup: rbac.authorization.k8s.io
kubectl create -f rolebinding-tiller.yaml
helm init --service-account tiller --tiller-namespace tiller-world
3.创建当名称前空间tiller账号管理另一个名称空间资源对象
kubectl create namespace myorg-system
kubectl create serviceaccount tiller --namespace myorg-system
# Define a Role that allows Tiller to manage all resources in myorg-users like in role-tiller.yaml
cat role-tiller.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-manager
namespace: myorg-users
rules:
- apiGroups: ["", "batch", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
kubectl create -f role-tiller.yaml
# Bind the service account to that role. In rolebinding-tiller.yaml,
cat rolebinding-tiller.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: myorg-users
subjects:
- kind: ServiceAccount
name: tiller
namespace: myorg-system
roleRef:
kind: Role
name: tiller-manager
apiGroup: rbac.authorization.k8s.io
kubectl create -f rolebinding-tiller.yaml
# We'll also need to grant Tiller access to read configmaps in myorg-system so it can store release information. In role-tiller-myorg-system.yaml:
cat role-tiller-myorg-system.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: myorg-system
name: tiller-manager
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["configmaps"]
verbs: ["*"]
kubectl create -f role-tiller-myorg-system.yaml
# And the respective role binding. In rolebinding-tiller-myorg-system.yaml:
cat rolebinding-tiller-myorg-system.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: myorg-system
subjects:
- kind: ServiceAccount
name: tiller
namespace: myorg-system
roleRef:
kind: Role
name: tiller-manager
apiGroup: rbac.authorization.k8s.io
kubectl create -f rolebinding-tiller-myorg-system.yaml
4.Deploy Helm in a namespace, talking to Tiller in another namespace
#In this example, we will assume Tiller is running in a namespace called tiller-world and that the Helm client is running in a namespace called helm-world. By default, Tiller is running in the kube-system namespace.
cat helm-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: helm
namespace: helm-world
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: tiller-user
namespace: tiller-world
rules:
- apiGroups:
- ""
resources:
- pods/portforward
verbs:
- create
- apiGroups:
- ""
resources:
- pods
verbs:
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: tiller-user-binding
namespace: tiller-world
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: tiller-user
subjects:
- kind: ServiceAccount
name: helm
namespace: helm-world
kubectl create -f helm-user.yaml
serviceaccount "helm" created
role "tiller-user" created
rolebinding "tiller-user-binding" created
chart实例创建
1. helm create xiaochao
tree xiaochao
创建一个chart实例
helm create xianchao
tree xianchao
xiaochao
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
3 directories, 8 files
Chart.yaml 用来描述当前chart有哪属性信息,存放当前程序包的元数据信息,包的名字,版本等,跟部署k8s应用无关系,只是记录chart的信息的
templates 模板,定义k8s的yaml文件,大量调用go语言的语法,跟ansible的playbook一样,ansible的playbook也可以使用模板
README.md 帮助手册
values.yaml 为模板中的每一个属性提供值的
cd xiaochao
helm install . 使用刚才创建的chart部署k8s应用
kubectl get pods 可以看到通过helm成功安装了pod应用
2. helm list 查看有哪些release
3. helm package 打包chart
helm package xianchao
ls 可看到生成了一个tgz安装包
xianchao-0.1.0.tgz
生成的tgz包可以发送到任意服务器上,通过helm fetch就可以获取该chart
4. helm delete 删除指定的release(helm list查看到的),同时删除了部署在kubernetes上的服务
5. helm repo list 查看chart库
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
上面命令执行之后如果报错:
Error: Couldn't load repositories file (/root/.helm/repository/repositories.yaml).
You might need to run `helm init` (or `helm init --client-only` if tiller is already installed)
需要按照如下方法安装:
mkdir /root/.helm/repository/
把repositories.yaml文件拷贝到这个目录下就可以了
cat repositories.yaml
apiVersion: v1
generated: 2021-10-13T21:52:41.714422328-04:00
repositories:
- caFile: ""
cache: /root/.helm/repository/cache/bitnami-index.yaml
certFile: ""
keyFile: ""
name: bitnami
password: ""
url: https://charts.bitnami.com/bitnami
username: ""
- caFile: ""
cache: /root/.helm/repository/cache/stable-index.yaml
certFile: ""
keyFile: ""
name: stable
password: ""
url: https://cnych.github.io/kube-charts-mirror
username: ""
- caFile: ""
cache: /root/.helm/repository/cache/local-repo-index.yaml
certFile: ""
keyFile: ""
name: local-repo
password: ""
url: http://172.16.0.1:8879
username: ""
- caFile: ""
cache: /root/.helm/repository/cache/local-index.yaml
certFile: ""
keyFile: ""
name: local
password: ""
url: http://127.0.0.1:8879/charts
username: ""
6. helm repo add stable https://**** 添加repo,执行完毕后输入helm repo update进行更新
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update 更新chart仓库
执行helm repo add bitnami https://charts.bitnami.com/bitnami报错,解决如下
mkdir /root/.helm/repository/cache
把bitnami-index.yaml local-index.yaml local-repo-index.yaml stable-index.yaml文件蠢到这个目录即可
7. 查找chart
#helm search ###输出所有的chart
#helm search mysql ###搜索mysql chart
#helm inspect bitnami/mysql ###查看指定chart的详细信息
也可以helm search redis 搜索redis
helm search jenkins
helm inspect stable/jenkins 可以查看helm部署jenkins的详细信息
部署memcache
helm search memcached
helm install --name memcached stable/memcached
执行之后显示如下
NAME: memcached #名字
LAST DEPLOYED: Mon Oct 9 22:35:54 2021 #部署时间
NAMESPACE: default #名称空间
STATUS: DEPLOYED #状态是deploy状态
RESOURCES:
==> v1/Pod(related) #pod
NAME READY STATUS RESTARTS AGE
memcached-0 0/1 Pending 0 <invalid>
==> v1/Service #service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
memcached ClusterIP None <none> 11211/TCP <invalid>
==> v1beta1/PodDisruptionBudget #回收机制,不用管
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
memcached 2 N/A 0 <invalid>
==> v1beta1/StatefulSet
NAME READY AGE
memcached 0/3 <invalid>
NOTES:
Memcached can be accessed via port 11211 on the following DNS name from within your cluster:
memcached.default.svc.cluster.local
If you'd like to test your instance, forward the port locally:
export POD_NAME=$(kubectl get pods --namespace default -l "app=memcached" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 11211
In another tab, attempt to set a key:
$ echo -e 'set mykey 0 60 5\r\nhello\r' | nc localhost 11211
You should see:
STORED
# 部署rabbitmq
查看chart详细信息
helm inspect stable/rabbitmq-ha
helm fetch stable/rabbitmq-ha #把chart的压缩包下载到本地
解压,进到解压路径
helm install ./
在创建一个service.yaml
cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-management
labels:
app: rabbitmq-ha
spec:
ports:
- port: 15672
name: http
selector:
app: rabbitmq-ha
type: NodePort # Or LoadBalancer in production w/ proper security
kubectl apply -f service.yaml
kubectl get svc
rabbitmq-management NodePort 10.105.1.137 <none> 15672:30241/TCP 3m58s
在浏览器输入网址登录到rabbitmq的管理节点中
http://192.168.85.140:30241/
用户名: management
密码: E9R3fjZm4ejFkVFE
加密密码:
kubectl get secret --namespace default hipster-tarsier-rabbitmq-ha -o jsonpath="{.data.rabbitmq-password}" | base64 --decode
删除刚才创建的release
helm delete release名字
8.helm template语法
可以通过如下命令获取渲染后的yaml文件
cd rabbitmq-ha
helm install --debug --dry-run ./
chart官方仓库及helm常用命令
helm 的chart的官方站点:
https://hub.kubeapps.com/
另外,还有:https://artifacthub.io/
chart版本类型:
stable: 稳定版
incubator:类似prerelease,或者canary,还不太稳定。
常用命令
helm常用命令:
release管理:
install # 创建一个release实例
delete # 删除一个release
upgrade [RELEASE] [CHART] [flags] # 升级一个版本
rollback [flags] [RELEASE] [REVISION] # 回滚一个版本
list # 查看有哪些release
history # 查看release的历史信息
chart管理:
create
fetch:从远程仓库下载一个chart
get
inspect # 查看chart的详细信息
package:打包一个chart
verify
lint:chart语法检查
14-K8S之helm入门到逃跑的更多相关文章
- k8s之helm入门
1.概述 helm是k8s的另外一个项目,相当于linux的yum,在yum仓库中,yum不光要解决包之间的依赖关系,还要提供具体的程序包,helm仓库里面只有配置清单文件,而没有镜像,镜像还是由镜像 ...
- kubernetes实战(十):k8s使用Helm安装harbor
1.基本概念 对于复杂的应用中间件,需要设置镜像运行的需求.环境变量,并且需要定制存储.网络等设置,最后设计和编写Deployment.Configmap.Service及Ingress等相关yaml ...
- Kubernetes 学习24 helm入门
一.概述 1.我们此前在使用kubernetes中,无论我们使用无状态的应用程序,比如myapp,nginx.以及有状态的tomcat,redis,etcd,...等等,他们部署在k8s之上会有这样的 ...
- Kubernetes K8S之Helm部署、使用与示例
Kubernetes K8S之Helm部署.使用.常见操作与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...
- k8s 通过helm发布应用
什么是helm? Helm 是 Kubernetes 的包管理器.Helm 是查找.分享和使用软件构建 Kubernetes 的最优方式. 在红帽系的Linux中我们使用yum来管理RPM包,类似的, ...
- Docker K8s基本概念入门
原文地址:https://blog.csdn.net/TM6zNf87MDG7Bo/article/details/79621510 k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具 ...
- kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录
1.基本概念 上节在k8s中部署了harbor和ldap,本节将部署harbor使用openLDAP验证,部署方式与之前相同,只是改了adminserver-cm.yaml的AUTH_MODE: &q ...
- K8s基本概念入门
序言 没等到风来,绵绵小雨,所以写个随笔,聊聊k8s的基本概念. k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非 ...
- 云原生生态周报 Vol. 14 | K8s CVE 修复指南
业界要闻 Mesosphere 公司正式更名为 D2IQ, 关注云原生. Mesosophere 公司日前发布官方声明正式更名为:D2iQ(Day-Two-I-Q),称关注点转向 Kubernetes ...
- kubernetes 1.14安装部署helm插件
简单介绍: Helm其实就是一个基于Kubernetes的程序包(资源包)管理器,它将一个应用的相关资源组织成为Charts,并通过Charts管理程序包.再简单点说,可以当做RHEL/CentOS系 ...
随机推荐
- .bash_profile等配置文件
brew环境 mysql:数据库,装数据用. redis:缓存用. unrar:解压用. docker:虚拟环境用. node:某些项目依赖这个. python环境 command line tool ...
- css3自动滚动
<!DOCTYPE html> <html lang="en"><div class="wrap"> <ul clas ...
- IDEA 上传项目到 Gitee 小记
此方式可直接将 IDEA 中项目上传到 Gitee 仓库,无需打开 Gitee 手动创建空仓库. 前提环境 安装好 Git,并在 IDEA 中成功配置: 注册有 Gitee 账号,并记得账号密码: I ...
- LeetCode-2104 子数组范围和
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-subarray-ranges 题目描述 给你一个整数数组 nums .nums 中 ...
- ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- 关于js对象的键
面试的时候,多次被问到Object和Map的区别,我都没答上,我以为可能问原理的可能多一些... 于是今天就仔细地看了一下Object和Map的区别.网上各文章都说Object的键只能是字符串或Sym ...
- dot & pixel & point
dpi(dot per inch): 出版质量一般要求dpi在300-600之间. 100dpi = 39.37dpc(dot per cm) 在显示屏幕上,dot=pixel,对于100dpi分辨率 ...
- [C#]判断一个IP是否在某个IP段内
关于IP地址 IPv4地址是由4段0-255的数字组成的,例如:a.b.c.d(0≤a,b,c,d≤255),IPv4也叫32位地址,为什么是32位呢,因为把每一段转换成二进制后,它的取值范围就是00 ...
- java学习日记20230301-API文档
JAVA API java application programming interinterface 应用程序编程接口,是java提供的基本编程接口 在线文档:https://www.matoo ...
- random及循环
题目:使用两种方式求2-20之间偶数的和,分别使用for和while 1.使用for解法: sum=0 for i in range(2,21,2): sum+=i print ("2-20 ...