为什么需要HELM
Docker解决了应用的打包问题以及部署问题使得程序更加轻便以及灵活 但无法实现应用调度和编排 需要借助K8S的deployment和statefullset service ingress等完成 但是通常一个应用系统不可能只由一个deployment或statefulset就能部署完成的 那么有没有一种方式能够去组织 deployment以及service 一条命令就完成整个应用系统的部署呢? 答案是有的 那就是HELM
总结来说就是
由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应用维护和更新等面临诸多的挑战,主要面临以下问题:
•如何将这些服务作为一个整体管理?
•这些资源文件如何高效复用?
•不支持应用级别的版本管理
需要HELM来拯救
什么是HELM
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。
Helm有3个重要概念:
•helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
•Chart:应用描述,一系列用于描述k8s 资源相关文件的集合。
•Release:基于Chart的部署实体,一个chart 被Helm 运行后将会生成对应的一个release;将在k8s中创建出真实运行的资源对象。
访问模式也很简单:
下载HELM客户端 该客户端会读取kubectl config配置文件($HOME/.kube/config)从而能够访问到 k8s群集 然后直接操作k8s群集
使用VMware BITNAMI HELM 仓库
这里就不演示自己构建HELM CHART创建应用了,因为现在公网有太多的公共仓库供使用了,这里我们演示使用VMware的TANZU Bitnami公共仓库
下载helm客户端
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz tar zxvf helm-v3.2.4-linux-amd64.tar.gz mv linux-amd64/helm /usr/bin/
添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami ### 更新 helm repo update
安装kubeapp 该应用汇提供bitnami的界面
### 为kubeapp创建namespace kubectl create namespace kubeapps ### 安装 kubeapp 使用刚刚添加的bitnami仓库 helm install --version 5.0.0 kubeapps bitnami/kubeapps -n kubeapps --set useHelm3=true --set frontend.service.type=LoadBalancer ### 验证 kubectl get pods,svc -n kubeapps -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubeapps LoadBalancer 10.99.8.255 <pending> 80:30624/TCP 18d app=kubeapps,release=kubeapps kubeapps-internal-assetsvc ClusterIP 10.98.48.108 <none> 8080/TCP 18d app=kubeapps-internal-assetsvc,release=kubeapps kubeapps-internal-dashboard ClusterIP 10.106.62.114 <none> 8080/TCP 18d app=kubeapps-internal-dashboard,release=kubeapps kubeapps-internal-kubeops ClusterIP 10.104.137.77 <none> 8080/TCP 18d app=kubeapps-internal-kubeops,release=kubeapps kubeapps-postgresql ClusterIP 10.98.126.33 <none> 5432/TCP 18d app.kubernetes.io/instance=kubeapps,app.kubernetes.io/name=postgresql,role=primary kubeapps-postgresql-headless ClusterIP None <none> 5432/TCP 18d app.kubernetes.io/instance=kubeapps,app.kubernetes.io/name=postgresql kubeapps-postgresql-read ClusterIP 10.102.159.14 <none> 5432/TCP 18d app.kubernetes.io/instance=kubeapps,app.kubernetes.io/name=postgresql,role=read ### 看到 service/kubeapps LoadBalancer 10.99.8.255 80:30624/TCP 我们可以通过Nodeport的方式来访问kubeapp
为用户授权访问kubeapp
### 创建 service account kubectl create serviceaccount kubeapps-operator ### 创建rolebonding kubectl create clusterrolebinding kubeapps-operator --clusterrole=cluster-admin --serviceaccount=default:kubeapps-operator ### 获取登录token kubectl get secret $(kubectl get serviceaccount kubeapps-operator -o jsonpath='{range .secrets[*]}{.name}{" "}{end}' | grep kubeapps-operator-token) -o jsonpath='{.data.token}' -o go-template='{{.data.token | base64decode}}' && echo
访问kubeapp(通过nodeport) 输入上步获取的token
登录成功
搜索WordPress 点击
选择最新版本
输入相关点击部署
部署进行中
部署成功
获取登录口令
[root@k8s-master03 deploy]# export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services delightful-produce-wordpress) [root@k8s-master03 deploy]# export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}") [root@k8s-master03 deploy]# echo "WordPress URL: http://$NODE_IP:$NODE_PORT/" WordPress URL: http://172.16.0.13:32319/ [root@k8s-master03 deploy]# echo "WordPress Admin URL: http://$NODE_IP:$NODE_PORT/admin" WordPress Admin URL: http://172.16.0.13:32319/admin [root@k8s-master03 deploy]#
登录成功