helm 安装配置
下载、安装、测试 helm
问题1
- 第一次发布的服务:A、C、E、H、K 等服务,需要新增配置参数等内容
- 第二次发布的服务:A、B、H、L、P 等服务,需要删除配置参数等内容
- 第三次发布的服务:A、Y、E、S、X 等服务,需要新增、删除、修改配置参数等内容
- ......
- 无论是发布和回滚(包含对多个环境的发布,比如测试环境、正式环境等),对于操作者,都是一个个噩梦
问题2
- 某些稍显复杂的软件对于容器(k8s)技术可能只有 charts 版,如果涉及高可用,可能仅提供 charts 版
说明
- Helm
- 对于复杂的应用或者中间件系统,在 Kubernetes 上进行容器化部署并非易事,通常需要研究 Docker 镜像的运行需求、环境变量等内容,为容器配置依赖的储存、网络等资源,并设计编写 Deployment、ConfigMap、Service、Volume、Ingress 等 YAML 文件,再将其一次提交给 Kubernetes 部署。总之,微服务架构和容器化复杂应用的部署和管理带来了很大的挑战。
- Helm 将 Kubernetes 的资源,如:Deployment、ConfigMap、Service、Volume、Ingress 等,打包到一个 Chart(图表)中,而 Chart 被保存到 Chart 仓库,由 Chart 仓库储存、分发和共享。
- Helm 支持应用 Chart 的版本管理,简化了 Kubernetes 应用部署的应用定义、打包、部署、更新、删除和回滚等操作。
- 快速入门指南
- Helm 组件
- Chart:Helm 软件包,包含一个应用所需资源对象的 YAML 文件,通常以 .tgz 压缩包的形式存在,也可以是文件夹形式
- Repository(仓库):用于存放和共享 Chart 的仓库
- Config(配置数据):部署时设置到 Chart 中的配置数据
- Release:基于 Chart 和 Config 部署到 Kubernetes 集群中运行的一个实例,一个 Chart 可以被部署多次,每次的 Release 都不相同
- 基于 Helm 的工作流
- 开发人员将开发好的 Chart 上传到 Chart 仓库。
- 运维人员基于 Chart 的定义,设置必要的配置数据(Config),使用 Helm 命令行工具应用一键部署到 Kubernetes 集群中,以 Release 概念管理后续的更新、回滚等。
- Chart 仓库中的 Chart 可以用于共享和分发。
- Helm
- Helm版本支持策略(2023-12-22 更新) 本文以 k8s 1.28.2、helm 3.13.3 为例
Helm 版本 | 支持的 Kubernetes 版本 |
---|---|
3.13.x | |
3.12.x | 1.27.x - 1.24.x |
3.11.x | 1.26.x - 1.23.x |
3.10.x | 1.25.x - 1.22.x |
3.9.x | 1.24.x - 1.21.x |
3.8.x | 1.23.x - 1.20.x |
3.7.x | 1.22.x - 1.19.x |
3.6.x | 1.21.x - 1.18.x |
3.5.x | 1.20.x - 1.17.x |
3.4.x | 1.19.x - 1.16.x |
3.3.x | 1.18.x - 1.15.x |
3.2.x | 1.18.x - 1.15.x |
3.1.x | 1.17.x - 1.14.x |
3.0.x | 1.16.x - 1.13.x |
2.16.x | 1.16.x - 1.15.x |
2.15.x | 1.15.x - 1.14.x |
2.14.x | 1.14.x - 1.13.x |
2.13.x | 1.13.x - 1.12.x |
2.12.x | 1.12.x - 1.11.x |
2.11.x | 1.11.x - 1.10.x |
2.10.x | 1.10.x - 1.9.x |
2.9.x | 1.10.x - 1.9.x |
2.8.x | 1.9.x - 1.8.x |
2.7.x | 1.8.x - 1.7.x |
2.6.x | 1.7.x - 1.6.x |
2.5.x | 1.6.x - 1.5.x |
2.4.x | 1.6.x - 1.5.x |
2.3.x | 1.5.x - 1.4.x |
2.2.x | 1.5.x - 1.4.x |
2.1.x | 1.5.x - 1.4.x |
2.0.x | 1.4.x - 1.3.x |
安装
根据上述 Helm版本支持策略 与 k8s 的版本,访问 github releases 下载所需的版本
shellHELM_VERSION=v3.13.3 wget https://get.helm.sh/helm-$HELM_VERSION-linux-amd64.tar.gz tar -zxvf helm-$HELM_VERSION-linux-amd64.tar.gz linux-amd64/helm version mv linux-amd64/helm /usr/local/bin/helm helm version
初始化
shell# 添加 bitnami 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami # 列举仓库 helm repo list # 搜索仓库 helm search repo bitnami # 搜索 drupal 最新版 helm search repo drupal # 搜索 drupal 更多版本 helm search repo drupal --versions # 更新仓库 helm repo update
安装Chart示例
shell# 卸载使用 uninstall # -n:指定命名空间 # --version 15.0.3:指定版本号 helm install mysite bitnami/drupal
执行结果
shellNAME: mysite LAST DEPLOYED: Mon Aug 21 11:56:34 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: drupal CHART VERSION: 15.0.4 APP VERSION: 10.1.2** Please be patient while the chart is being deployed ** 1. Get the Drupal URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w mysite-drupal' export SERVICE_IP=$(kubectl get svc --namespace default mysite-drupal --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo "Drupal URL: http://$SERVICE_IP/" 2. Get your Drupal login credentials by running: echo Username: user echo Password: $(kubectl get secret --namespace default mysite-drupal -o jsonpath="{.data.drupal-password}" | base64 -d)
shell# 卸载使用 uninstall # --generate-name:根据名称与当前时间戳自动生成 name # -n:指定命名空间 # --version 15.0.3:指定版本号 helm install bitnami/mysql --generate-name
执行结果
shellNAME: mysql-1689058203 LAST DEPLOYED: Tue Jul 11 14:50:05 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: mysql CHART VERSION: 9.10.5 APP VERSION: 8.0.33 ** Please be patient while the chart is being deployed ** Tip: Watch the deployment status using the command: kubectl get pods -w --namespace default Services: echo Primary: mysql-1689058203.default.svc.cluster.local:3306 Execute the following to get the administrator credentials: echo Username: root MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1689058203 -o jsonpath="{.data.mysql-root-password}" | base64 -d) To connect to your database: 1. Run a pod that you can use as a client: kubectl run mysql-1689058203-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mysql:8.0.33-debian-11-r28 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash 2. To connect to primary service (read/write): mysql -h mysql-1689058203.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
查看安装Chart示例
shell[root@anolis ~]# helm ls NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION mysite default 1 2023-08-21 11:56:34.977274536 +0800 CST deployed drupal-15.0.4 10.1.2 [root@anolis ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysite-drupal-7b8ff4447f-2cpvj 0/1 Pending 0 3m10s mysite-mariadb-0 0/1 Pending 0 3m10s [root@anolis ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-mysite-mariadb-0 Pending 3m31s mysite-drupal-drupal Pending 4m10s [root@anolis ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 177m mysite-drupal LoadBalancer 10.102.2.245 <pending> 80:32607/TCP,443:31528/TCP 13m mysite-mariadb ClusterIP 10.98.85.217 <none> 3306/TCP 13m [root@anolis ~]#
绑定安装Chart示例的 PVC
如果发现 pvc 没有绑定,可创建 PV 进行绑定
shellcat > mysite-pv-1.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: mysite-pv-1 spec: capacity: storage: 50Gi volumeMode: Filesystem accessModes: - ReadWriteMany - ReadWriteOnce # storageClassName: mysite-sc nfs: # 需要事先创建此文件夹 path: /nfs/mysite-pv-1/ server: 192.168.61.167 EOF cat mysite-pv-1.yaml kubectl apply -f mysite-pv-1.yaml kubectl get pv kubectl get pvc
shellcat > mysite-pv-2.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: mysite-pv-2 spec: capacity: storage: 50Gi volumeMode: Filesystem accessModes: - ReadWriteMany - ReadWriteOnce # storageClassName: mysite-sc nfs: # 需要事先创建此文件夹 path: /nfs/mysite-pv-2/ server: 192.168.61.167 EOF cat mysite-pv-2.yaml kubectl apply -f mysite-pv-2.yaml kubectl get pv kubectl get pvc
shell[root@anolis ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysite-drupal-7b8ff4447f-bk7r6 1/1 Running 1 (68s ago) 113s mysite-mariadb-0 1/1 Running 0 8m33s [root@anolis ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE mysite-pv-1 50Gi RWO,RWX Retain Bound default/mysite-drupal-drupal 6m52s mysite-pv-2 50Gi RWO,RWX Retain Bound default/data-mysite-mariadb-0 4m27s [root@anolis ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-mysite-mariadb-0 Bound mysite-pv-2 50Gi RWO,RWX 8m38s mysite-drupal-drupal Bound mysite-pv-1 50Gi RWO,RWX 8m52s [root@anolis ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 177m mysite-drupal LoadBalancer 10.102.2.245 <pending> 80:32607/TCP,443:31528/TCP 13m mysite-mariadb ClusterIP 10.98.85.217 <none> 3306/TCP 13m [root@anolis ~]#
访问 k8s IP + mysite-drupal 端口 32607(从上方 svc 中查看到的)即可
查看chart的基本信息
shellhelm show chart bitnami/mysql
查看chart的所有信息
shellhelm show all bitnami/mysql
列出所有可被部署的版本
shellhelm ls # helm list # -n:指定命名空间 # --all-namespaces:查看所有命名空间
卸载一个版本
shellhelm uninstall mysql-1612624192
查看版本信息
shellhelm status mysql-1612624192