丰镇网站建设,百度站长工具网站认证,成都网站设计得多少钱,太原再次发出通告什么是 Helm 每个成功的软件平台都有一个优秀的打包系统#xff0c;比如Debian、Ubuntu 的 apt#xff0c;RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器#xff0c;方便我们更好的管理应用。
在没使用 helm 之前#xff0c;向 kubernetes 部署应用#xff… 什么是 Helm 每个成功的软件平台都有一个优秀的打包系统比如Debian、Ubuntu 的 aptRedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器方便我们更好的管理应用。
在没使用 helm 之前向 kubernetes 部署应用我们要依次部署 deployment、svc 等步骤较繁琐。 况且随着很多项目微服务化复杂的应用在容器中部署以及管理显得较为复杂helm 通过打包的方式支持发布的版本管理和控制 很大程度上简化了 Kubernetes 应用的部署和管理。
Helm本质就是让K8s的应用管理Deployment、Service等可配置可以通过类似于传递环境变量的方式能动态生成。通过动态生成K8s资源清单文件deployment.yaml、service.yaml。 然后调用 Kubectl 自动执行 K8s 资源部署。 Helm 是官方提供的类似于 YUM 的包管理器是部署环境的流程封装。Helm 有三个重要的概念Chart 、Repository 和 Release ●ChartHelm 的软件包采用 TAR 格式。是创建一个应用的信息集合包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。 可以将 chart 想象成 apt、yum 中的软件安装包。
●Release是 chart 的运行实例代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群就生成一个 release。chart 能够多次安装到同一个集群每次安装都是一个 release。
●Repository仓库Charts 仓库用于集中存储和分发 Charts。Repository 本质上是一个 Web 服务器该服务器保存了一系列的 Chart 软件包以供用户下载并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
总结Helm 安装 charts 到 Kubernetes 集群中每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。
//Helm3 与 Helm2 的区别 Helm2 是 C/S 架构主要分为客户端 helm 和服务端 Tiller。在 Helm 2 中Tiller 是作为一个 Deployment 部署在 kube-system 命名空间中很多情况下我们会为 Tiller 准备一个 ServiceAccount 这个 ServiceAccount 通常拥有集群的所有权限。 用户可以使用本地 Helm 命令自由地连接到 Tiller 中并通过 Tiller 创建、修改、删除任意命名空间下的任意资源。
在 Helm 3 中Tiller 被移除了。新的 Helm 客户端会像 kubectl 命令一样读取本地的 kubeconfig 文件使用我们在 kubeconfig 中预先定义好的权限来进行一系列操作。
Helm 的官方网站 https://helm.sh/
------------------- Helm 部署 ------------------- 1、安装 helm //下载二进制 Helm client 安装包 https://github.com/helm/helm/tags
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz mv linux-amd64/helm /usr/local/bin/helm helm version
//命令补全 source (helm completion bash)
2、使用 helm 安装 Chart //添加常用的 chart 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo add incubator https://charts.helm.sh/incubator
//更新 charts 列表 helm repo update helm repo list
//查看 stable 仓库可用的 charts 列表 helm search repo stable
//删除 incubator 仓库 helm repo remove incubator
//查看 chart 信息 helm show chart stable/mysql #查看指定 chart 的基本信息
helm show all stable/mysql #获取指定 chart 的所有信息
//安装 chart helm install my-redis bitnami/redis [-n default] #指定 release 的名字为 my-redis-n 指定部署到 k8s 的 namespace
helm install bitnami/redis --generate-name #不指定 release 的名字时需使用 –generate-name 随机生成一个名字
//查看所有 release helm ls helm list
//查看指定的 release 状态 helm status my-redis
//删除指定的 release helm uninstall my-redis ------------------- Helm 自定义模板 ------------------- charts 除了可以在 repo 中下载还可以自己自定义创建完成后通过 helm 部署到 k8s。
//拉取 chart mkdir /opt/helm cd /opt/helm
helm pull stable/mysql
ls mysql-1.6.9.tgz
tar xf mysql-1.6.9.tgz
yum install -y tree
tree mysql mysql ├── Chart.yaml ├── README.md ├── templates │ ├── configurationFiles-configmap.yaml │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── initializationFiles-configmap.yaml │ ├── NOTES.txt │ ├── pvc.yaml │ ├── secrets.yaml │ ├── serviceaccount.yaml │ ├── servicemonitor.yaml │ ├── service.yaml │ ├── ingress.yaml │ └── tests │ ├── test-configmap.yaml │ └── test.yaml └── values.yaml
可以看到一个 chart 包就是一个文件夹的集合文件夹名称就是 chart 包的名称。
#chart 是包含至少两项内容的helm软件包 1软件包自描述文件 Chart.yaml这个文件必须有 name 和 versionchart版本 的定义 2一个或多个模板其中包含 Kubernetes 清单文件 ●NOTES.txtchart 的“帮助文本”在用户运行 helm install 时显示给用户 ●deployment.yaml创建 deployment 的资源清单文件 ●service.yaml为 deployment 创建 service 的资源清单文件 ●ingress.yaml: 创建 ingress 对象的资源清单文件 ●_helpers.tpl放置模板助手的地方可以在整个 chart 中重复使用
//创建自定义的 chart helm create nginx
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
cat nginx/templates/deployment.yaml #在 templates 目录下 yaml 文件模板中的变量go template语法的值默认是在 nginx/values.yaml 中定义的只需要修改 nginx/values.yaml 的内容也就完成了 templates 目录下 yaml 文件的配置。 比如在 deployment.yaml 中定义的容器镜像 image: {{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}
cat nginx/values.yaml | grep repository repository: nginx #以上变量值是在 create chart 的时候就自动生成的默认值你可以根据实际情况进行修改。
//修改 chart vim nginx/Chart.yaml
apiVersion: v2
name: nginx #chart名字
description: A Helm chart for Kubernetes
type: application #chart类型application或library
version: 0.1.0 #chart版本
appVersion: 1.16.0 #application部署版本 vim nginx/values.yaml
//打包 chart helm lint nginx #检查依赖和模版配置是否正确
helm package nginx #打包 chart会在当前目录下生成压缩包 nginx-0.1.0.tgz
//部署 chart helm install nginx ./nginx --dry-run --debug #使用 --dry-run 参数验证 Chart 的配置并不执行安装
helm install nginx ./nginx -n default #部署 chartrelease 版本默认为 1 或者 helm install nginx ./nginx-0.1.0.tgz
#可根据不同的配置来 install默认是 values.yaml helm install nginx ./nginx -f ./nginx/values-prod.yaml
helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION nginx default 1 2022-01-18 23:43:06.170248683 0800 CST deployed nginx-0.1.0 1.16.0
kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-67779bd969-kq2fm 1/1 Running 0 58m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 none 443/TCP 37h service/nginx ClusterIP 10.100.0.171 none 80/TCP 58s
#部署 ingress wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml kubectl apply -f mandatory.yaml kubectl apply -f service-nodeport.yaml
kubectl get pod,svc -n ingress-nginx NAME READY STATUS RESTARTS AGE pod/nginx-ingress-controller-54b86f8f7b-jjlnj 1/1 Running 0 79s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/ingress-nginx NodePort 10.101.36.34 none 80:30665/TCP,443:30363/TCP 6s
kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE nginx none www.xny.com 10.101.36.34 80 58m
vim /etc/hosts ..... 192.168.80.12 node02 www.xny.com
curl http://www.xny.com:30665 //修改为 NodePort 访问后升级 vim nginx/values.yaml service: type: NodePort port: 80 nodePort: 30080
ingress: enabled: false
replicaCount: 1image:repository: nginxpullPolicy: IfNotPresenttag: latest #设置镜像标签imagePullSecrets: []
nameOverride:
fullnameOverride: serviceAccount:create: trueannotations: {}name: podAnnotations: {}podSecurityContext: {}# fsGroup: 2000securityContext: {}# capabilities:# drop:# - ALL# readOnlyRootFilesystem: true# runAsNonRoot: true# runAsUser: 1000service:type: ClusterIPport: 80ingress:enabled: true #开启 ingressclassName: annotations: {}# kubernetes.io/ingress.class: nginx# kubernetes.io/tls-acme: truehosts:- host: www.xny.com #指定ingress域名paths:- path: /pathType: Prefix #指定ingress路径类型tls: []# - secretName: chart-example-tls# hosts:# - chart-example.localresources:limits:cpu: 100mmemory: 128Mirequests:cpu: 100mmemory: 128Miautoscaling:enabled: falseminReplicas: 1maxReplicas: 100targetCPUUtilizationPercentage: 80# targetMemoryUtilizationPercentage: 80nodeSelector: {}tolerations: []affinity: {}
vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ include nginx.fullname . }}labels:{{- include nginx.labels . | nindent 4 }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: httpprotocol: TCPname: httpnodePort: {{ .Values.service.nodePort }} #指定 nodePortselector:{{- include nginx.selectorLabels . | nindent 4 }}
升级 releaserelease 版本加 1 helm upgrade nginx nginx
kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 none 443/TCP 38h nginx NodePort 10.100.0.171 none 80:30080/TCP 79m
curl 192.168.80.14:30080 //回滚 #根据 release 版本回滚 helm history nginx #查看 release 版本历史
helm rollback nginx 1 #回滚 release 到版本1
helm history nginx #nginx release 已经回滚到版本 1 REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Tue Jan 18 23:43:06 2022 superseded nginx-0.1.0 1.16.0 Install complete 2 Wed Jan 19 01:02:42 2022 superseded nginx-0.1.0 1.16.0 Upgrade complete 3 Wed Jan 19 01:04:52 2022 deployed nginx-0.1.0 1.16.0 Rollback to 1
#通常情况下在配置好 templates 目录下的 kubernetes 清单文件后后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。 //在命令行使用 --set 指定参数来部署install,upgraderelease #注此参数值会覆盖掉在 values.yaml 中的值如需了解其它的预定义变量参数可查看 helm 官方文档。 helm upgrade nginx nginx --set image.tag1.15 ------------------- Helm 仓库 ------------------- helm 可以使用 harbor 作为本地仓库将自定义的 chart 推送至 harbor 仓库。
//安装 harbor #上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录 cd /opt cp docker-compose /usr/local/bin/ chmod x /usr/local/bin/docker-compose
tar zxf harbor-offline-installer-v1.9.1.tgz cd harbor/
vim harbor.yml hostname: 192.168.80.13 harbor_admin_password: Harbor12345 #admin用户初始密码 data_volume: /data #数据存储路径自动创建 chart: absolute_url: enabled #在chart中启用绝对url log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor #日志路径
#安装带有 Clair service 和 chart 仓库服务的 Harbor ./install.sh --with-clair --with-chartmuseum
//安装 push 插件 #在线安装 helm plugin install https://github.com/chartmuseum/helm-push
#离线安装 wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
mkdir ~/.local/share/helm/plugins/helm-push tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
helm repo ls
#登录 Harbor WEB UI 界面创建一个新项目 浏览器访问http://192.168.80.10 默认的管理员用户名和密码是 admin/Harbor12345 点击 “新建项目” 按钮 填写项目名称为 “chart_repo”访问级别勾选 “公开”点击 “确定” 按钮创建新项目
#添加仓库 helm repo add harbor http://192.168.80.13/chartrepo/chart_repo --usernameadmin --passwordHarbor12345 #注这里的 repo 的地址是Harbor URL/chartrepo/项目名称Harbor 中每个项目是分开的 repo。如果不提供项目名称 则默认使用 library 这个项目。
#推送 chart 到 harbor 中 cd /opt/helm helm push nginx harbor
#查看 chart_repo 项目中的 Helm Charts