【Kubernetes专项】K8s 包工具- Helm 入门到企业实战
Kubernetes 包工具- Helm 入门到企业实战20.1Helm概述20.1.1 基本介绍官网https://helm.sh/官方chart站点https://github.com/vmware-tanzu/kubeapps/Helm中的一些概念helm命令行客户端工具主要用于Kubernetes应用中的chart的创建、打包、发布和管理。Charthelm程序包一系列用于描述k8s资源相关文件的集合比方说我们部署nginx需要deployment的yaml需要service的yaml这两个清单文件就是一个helm程序包在k8s中把这些yaml清单文件叫做chart图表。Helm 是 Kubernetes 应用的包管理工具主要用来管理 Charts类似 Linux 系统的 yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata以便于应用程序的分发。对于应用发布者而言通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。对于使用者而言使用 Helm 后可以以简单的方式在 Kubernetes 上查找、安装、升级、回滚、卸载应用程序20.1.2K8s版本支持的各个helm版本对照表https://helm.sh/zh/docs/topics/version_skew/20.1.3helm常用操作命令描述create创建一个 chart 并指定名字dependency管理 chart 依赖get下载一个 release。可用子命令all、hooks、manifest、notes、valueshistory获取 release 历史install安装一个 chartlist列出 releasepackage将 chart 目录打包到 chart 存档文件中pull从远程仓库中下载 chart 并解压到本地 # helm pull stable/mysql – untarrepo添加列出移除更新和索引 chart 仓库。可用子命令add、index、 list、remove、updaterollback从之前版本回滚search根据关键字搜索 chart。可用子命令hub、reposhow查看 chart 详细信息。可用子命令all、chart、readme、valuesstatus显示已命名版本的状态template本地呈现模板uninstall卸载一个 releaseupgrade更新一个 releaseversion查看 helm 客户端版本20.2 部署Helm 4.00开源地址https://github.com/helm/helm/releases/tag/v4.0.020.2.1 安装helm软件[rootk8s-master1 ~]# wget https://get.helm.sh/helm-v4.0.0-linux-amd64.tar.gz[rootk8s-master1 ~]# tar zxf helm-v4.0.0-linux-amd64.tar.gz[rootk8s-master1 ~]# cp linux-amd64/helm /bin[rootk8s-master1 ~]# helm versionversion.BuildInfo{Version:v4.0.0, GitCommit:99cd1964357c793351be481d55abbe21c6b2f4ec, GitTreeState:clean, GoVersion:go1.25.3, KubeClientVersion:v1.34}20.2.2 添加/删除chart仓库地址阿里云仓库https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts微软仓库http://mirror.azure.cn/kubernetes/charts/[rootk8s-master1 ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts[rootk8s-master1 ~]# helm repo add microsoft http://mirror.azure.cn/kubernetes/charts/helm repo remove xxx20.2.3 查看仓库列表[rootk8s-master1 ~]# helm repo listNAME URL aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts microsoft http://mirror.azure.cn/kubernetes/charts/20.2.4 查看仓库存储helm清单[rootk8s-master1 ~]# helm search repo aliyun20.2.5 更新chart仓库[rootk8s-master1 ~]# helm repo updateHang tightwhilewe grab the latest from your chart repositories......Successfully got an update from thealiyunchart repository...Successfully got an update from themicrosoftchart repository Update Complete. ⎈Happy Helming!⎈20.3Helm基本使用20.3.1 搜索并下载chart[rootk8s-master1 ~]# helm search repo aliyun | grep memcachedaliyun/mcrouter0.1.00.36.0 aliyun/memcached2.0.1# 查看chart信息[rootk8s-master1 ~]# helm show chart aliyun/memcachedapiVersion: v1 description: Freeopensource, high-performance, distributed memory object caching system. home: http://memcached.org/ icon: https://upload.wikimedia.org/wikipedia/en/thumb/2/27/Memcached.svg/1024px-Memcached.svg.png keywords: - memcached - cache maintainers: - email: gtaylorgc-taylor.com name: Greg Taylor name: memcached sources: - https://github.com/docker-library/memcached version:2.0.1[rootk8s-master1 ~]# helm pull aliyun/memcached[rootk8s-master1 ~]# tar zxf memcached-2.0.1.tgz[rootk8s-master1 ~]# cd memcached/[rootk8s-master1 memcached]# lsChart.yaml README.md templates values.yaml1.Chart.yaml: chart的基本信息包括版本名字之类2.templates: 存放k8s的部署资源模板通过渲染变量得到部署文件3.values.yaml存放全局变量templates下的文件可以调用[rootk8s-master1 memcached]# cd templates/[rootk8s-master1 templates]# ls_helpers.tpl NOTES.txt pdb.yaml statefulset.yaml svc.yaml1._helpers.tpl 存放能够复用的模板2.NOTES.txt 为用户提供一个关于chart部署后使用说明的文件20.3.2 部署chart20.3.2.1helm部署memcached服务[rootk8s-node1 ~]# docker pull library/memcached:1.4.36[rootk8s-node1 ~]# docker save -o memcached-1.4.36.tar.gz memcached:1.4.36[rootk8s-node1 ~]# ctr -n k8s.io images import memcached-1.4.36.tar.gzunpacking docker.io/library/memcached:1.4.36# 也可以直接这样[rootk8s-master1 ~]# ctr -n k8s.io image pull docker.io/library/memcached:1.4.36-alpine[rootk8s-master1 ~]# cd memcached/[rootk8s-master1 memcached]# rm -rf templates/pdb.yaml# 修改一些东西apiversion,selector,affinity[rootk8s-master1 memcached]# vim templates/statefulset.yamlapiVersion: apps/v1 kind: StatefulSet metadata: name:{{templatememcached.fullname.}}labels: app:{{templatememcached.fullname.}}chart:{{ .Chart.Name }}-{{ .Chart.Version }}release:{{ .Release.Name }}heritage:{{ .Release.Service }}spec: selector: matchLabels: app:{{templatememcached.fullname.}}chart:{{ .Chart.Name }}-{{ .Chart.Version }}release:{{ .Release.Name }}heritage:{{ .Release.Service }}serviceName:{{templatememcached.fullname.}}replicas:{{.Values.replicaCount}}template: metadata: labels: app:{{templatememcached.fullname.}}chart:{{ .Chart.Name }}-{{ .Chart.Version }}release:{{ .Release.Name }}heritage:{{ .Release.Service }}spec: containers: - name:{{templatememcached.fullname.}}image:{{.Values.image}}imagePullPolicy:{{default.Values.imagePullPolicy|quote}}command: - memcached --m{{.Values.memcached.maxItemMemory}}{{-if.Values.memcached.extendedOptions}}--o-{{.Values.memcached.extendedOptions}}{{- end}}{{-if.Values.memcached.verbosity}}- -{{.Values.memcached.verbosity}}{{- end}}ports: - name: memcache containerPort:11211livenessProbe: tcpSocket: port: memcache initialDelaySeconds:30timeoutSeconds:5readinessProbe: tcpSocket: port: memcache initialDelaySeconds:5timeoutSeconds:1resources:{{toYaml .Values.resources|indent10}}[rootk8s-master1 memcached]# helm install memcached ./[rootk8s-master1 memcached]# kubectl get podsNAME READY STATUS RESTARTS AGE memcached-memcached-01/1 Running010m memcached-memcached-11/1 Running010m memcached-memcached-21/1 Running010m20.3.3release相关操作[rootk8s-master1 ~]# helm list[rootk8s-master1 ~]# helm delete memcached# 删除release会把release下对应的资源也删除[rootk8s-master1 ~]# kubectl get pods20.4 自定义Chart模版20.4.1 自定义Chart[rootk8s-master1 ~]# helm create myapp[rootk8s-master1 ~]# cd myapp/[rootk8s-master1 myapp]# lscharts Chart.yaml templates values.yaml[rootk8s-master1 myapp]# yum install -y tree[rootk8s-master1 myapp]# tree ././ ├── charts ├── Chart.yaml# 描述这个 Chart 的相关信息、包括名字、描述信息、版本等├── templates# 模板目录保留创建k8s的资源清单文件│ ├── deployment.yaml# deployment资源的go模板文件│ ├── _helpers.tpl# 模板助手文件定义的值可在模板中使用│ ├── hpa.yaml# 水平pod自动扩缩容go模板文件│ ├── httproute.yaml │ ├── ingress.yaml# 七层代理│ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml# 模板的值文件这些值会在安装时应用到 GO 模板生成部署文件20.4.2 部署release[rootk8s-node1 ~]# crictl pull nginx:latest[rootk8s-master1 myapp]# helm install nginx ./[rootk8s-master1 ~]# kubectl get podsNAME READY STATUS RESTARTS AGE nginx-myapp-7c4fd57446-glhq21/1 Running010m[rootk8s-master1 ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE kubernetes ClusterIP10.96.0.1none443/TCP 4h32m nginx-myapp ClusterIP10.104.207.50none80/TCP 11m20.4.2.2upgrade升级release及版本回滚rollback[rootk8s-master1 ~]# kubectl get svckubernetes ClusterIP10.96.0.1none443/TCP 4h32m nginx-myapp ClusterIP10.104.207.50none80/TCP 11m[rootk8s-master1 ~]# helm upgrade --set service.typeNodePort nginx myapp[rootk8s-master1 ~]# kubectl get svckubernetes ClusterIP10.96.0.1none443/TCP nginx-myapp NodePort10.104.207.50none80:31380/TCP[rootk8s-master1 ~]# helm history nginx[rootk8s-master1 ~]# helm rollback nginx 1[rootk8s-master1 ~]# helm history nginx20.4.2.3 打包Chart[rootk8s-master1 ~]# helm package /root/myapp/Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz[rootk8s-master1 ~]# ll myapp-0.1.0.tgz-rw-r--r--1root root4938Mar1821:16 myapp-0.1.0.tgz