• 小白学k8s(7)helm[v3]使用了解


    helm使用

    什么是helm

    HelmDeis开发的一个用于Kubernetes应用的包管理工具,主要用来管理Charts。有点类似于Ubuntu中的APTCentOS中的YUM

    Helm chart是用来封装Kubernetes原生应用程序的YAML文件,可以在你部署应用的时候自定义应用程序的一些metadata,便与应用程序的分发。

    安装helm

    Helm V2 & V3 架构设计

    Helm V2V3经历了较大的变革,其中最大的改动就是移除了Tiller组件,所有功能都通过Helm CLIApiServer直接交互。TillerV2的架构中扮演着重要的角色,但是它与K8S的设计理念是冲突的。

    • 1、围绕 Tiller 管理应用的生命周期不利于扩展。

    • 2、增加用户的使用壁垒,服务端需要部署 Tiller 组件才可以使用,侵入性强。

    • 3、K8S 的 RBAC 变得毫无用处,Tiller 拥有过大的 RBAC 权限存在安全风险。

    • 4、造成多租户场景下架构设计与实现复杂。

    所以对应v3版本的helm直接安装客户端就好了。

    关于helm版本的安装选择需要根据自己的k8s版本做选择,具体的版本策略Helm版本支持策略

    具体的安装参考安装Helm就好了

    我的k8s版本是v1.19.9,所以本次我选择的helm版本是v3.4.2

    需要借助于kubectl中的Kubeconfig,来实现对远端k8s集群的访问操作

    配置kube config

    1、配置KUBECONFIG变量

    $ KUBECONFIG=~/.kube/config
    

    2、完成Kubeconfig配置后,依次执行以下命令查看并切换context以访问本集群

    $ kubectl config get-contexts
    $ kubectl config use-context cls-3jju4zdc-context-default
    

    3、执行以下命令,测试是否可正常访问集群

    $ kubectl get node
    

    helm使用

    上面helm安装好之后,以及配置好本地的kubectl之后,我们就可以对远端k8s集群,使用helm进行操作了

    查看版本

    $ helm version
    version.BuildInfo{Version:"v3.4.2", GitCommit:"23dd3af5e19a02d4f4baa5b2f242645a1a3af629", GitTreeState:"clean", GoVersion:"go1.14.13"}
    

    添加仓库

    Helm中默认是不会添加Chart仓库,所以这里我们需要手动添加,下面是添加一些常用的Charts库,命令如下:

    helm repo add  elastic    https://helm.elastic.co       
    helm repo add  gitlab     https://charts.gitlab.io       
    helm repo add  harbor     https://helm.goharbor.io       
    helm repo add  bitnami    https://charts.bitnami.com/bitnami       
    helm repo add  incubator  https://kubernetes-charts-incubator.storage.googleapis.com       
    helm repo add  stable     https://kubernetes-charts.storage.googleapis.com       
    
    # 添加国内仓库       
    helm repo add stable http://mirror.azure.cn/kubernetes/charts       
    helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts     
      
    # 执行更新命令,将仓库中的信息进行同步:
    helm repo update       
    
    # 查看仓库信息
    helm repo list   
    

    helm安装nginx

    通过HelmRepo中查询可安装的Nginx

    $ helm search repo nginx
    NAME                            	CHART VERSION	APP VERSION	DESCRIPTION                                       
    bitnami/nginx                   	8.9.0        	1.19.10    	Chart for the nginx server                        
    bitnami/nginx-ingress-controller	7.6.6        	0.46.0     	Chart for the nginx Ingress controller            
    stable/nginx-ingress            	1.41.2       	v0.34.1    	An nginx Ingress controller that uses ConfigMap...
    stable/nginx-ldapauth-proxy     	0.1.6        	1.13.5     	DEPRECATED - nginx proxy with ldapauth            
    stable/nginx-lego               	0.3.1        	           	Chart for nginx-ingress-controller and kube-lego  
    bitnami/kong                    	3.7.3        	2.4.1      	Kong is a scalable, open source API layer (aka ...
    

    创建Namespace并且部署应用

    #  创建命名空间test
    $ kubectl create namespace test
    
    # 查看创建的命名空间
    $ kubectl get ns
    
    # 选择一个chart在k8s上部署我们的应用
    $ helm install nginx bitnami/nginx -n test
    
    # 查看应用状态
    $ helm status nginx -n test
    $ helm list -n test
    
    # 查看pod的状态
    $ kubectl get pods -n test
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-7b9d7c59ff-69mgz   1/1     Running   0          2m39s
    

    查看部署的结果

    $ kubectl get svc -n test
    NAME    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    nginx   LoadBalancer   xx.xxx.xxx.xx   <pending>     80:31998/TCP   6m3s
    

    访问结果

    helm的核心概念

    Chart

    Helm采用Chart的格式来标准化描述一个应用(K8S 资源文件集合),Chart有自身标准的目录结构,可以将目录打包成版本化的压缩包进行部署。就像我们下载一个软件包之后,就可以在电脑上直接安装一样,同理Chart包可以通过Helm部署到任意的K8S集群中。

    Config

    Config指应用配置参数,在Chart中由values.yaml和命令行参数组成。Chart采用Go Template的特性 + values.yaml对部署的模板文件进行参数渲染,也可以通过Helm Client的命令–set key=value的方式进行参数赋值。

    Repository

    类似于Docker HubHelm官方、阿里云等社区都提供了Helm Repository,我们可以通过helm repo add导入仓库地址,便可以检索仓库并选择别人已经制作好的Chart包,开箱即用。

    Release

    Release代表Chart在集群中的运行实例,同一个集群的同一个NamespaceRelease名称是唯一的。Helm围绕Release对应用提供了强大的生命周期管理能力,包括Release的查询、安装、更新、删除、回滚等。

    基本使用

    chart的目录

    chart-demo/
    ├── Chart.yaml # chart原数据信息
    ├── charts # 应用依赖集合
    ├── templates # k8s资源模板集合
    │   ├── NOTES.txt
    │   ├── _helpers.tpl
    │   ├── deployment.yaml
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── service.yaml
    │   ├── serviceaccount.yaml
    │   └── tests
    │       └── test-connection.yaml
    └── values.yaml # 资源配置文件
    

    模板管理

    创建 Chart 骨架

    helm create ./chart-demo
    

    Chart 打包

    helm package ./chart-demo
    

    获取 Chart 包元数据信息

    helm inspect chart ./chart-demo
    

    本地渲染模板文件

    helm template ${chart-demo-release-name} --namespace ${namespace} ./chart-demo
    

    查询 Chart 依赖信息

    helm dependency list ./chart-demo
    

    检查依赖和模板配置是否正确

    $ helm lint chart-demo
    ==> Linting charts/chart-demo/
    [INFO] Chart.yaml: icon is recommended
    
    1 chart(s) linted, 0 chart(s) failed
    

    模板部署

    查询 Release 列表

    helm list --namespace xxxx
    

    Chart 安装

    helm install ${chart-demo-release-name} ./chart-demo --namespace ${namespace}
    

    Chart 版本升级

    helm upgrade ${chart-demo-release-name} ./chart-demo-new-version --namespace ${namespace}
    

    Chart 版本回滚

    helm rollback ${chart-demo-release-name} ${revision} --namespace ${namespace}
    

    查看 Release 历史版本

    helm history ${chart-demo-release-name} --namespace ${namespace}
    

    卸载应用

    卸载应用,并保留安装记录

    helm uninstall ${chart-demo-release-name} -n ${namespace} --keep-history
    

    查看全部应用(包含安装和卸载的应用)

    helm list -n ${namespace} --all
    

    卸载应用,不保留安装记录

    helm delete ${chart-demo-release-name} -n ${namespace}
    

    ${}中的替换成自己的名字

    自定义参数安装应用

    Helm中支持使用自定义yaml文件和--set命令参数对要安装的应用进行参数配置,使用如下:

    方式一:使用自定义values.yaml文件安装应用

    我们知道chart的目录结构中有一个values.yaml,里面就是用来放参数的配置文件,修改对应的values.yaml就可以了

    # 展示对应配置参数信息
    $ helm show values bitnami/nginx
    image:
      registry: docker.io
      repository: bitnami/nginx
      tag: 1.19.10-debian-10-r14
    ...
    

    方式二:使用--set配置参数进行安装

    --set参数是在使用helm命令时候添加的参数,可以在执行helm安装与更新应用时使用,多个参数间用,隔开,使用如下:

    注意:如果配置文件和--set同时使用,则--set设置的参数会覆盖配置文件中的参数配置。

    # 使用set创建一个release
    helm install --set 'registry.registry=docker.io,registry.repository=bitnami/nginx' nginx bitnami/nginx -n blog
    
    # 更新一个release
    helm upgrade --set 'servers[0].port=8080' nginx bitnami/nginx -n blog
    

    应用发布顺序依赖

    虽然Chart可以通过requirements.yaml来管理依赖关系,并按照顺序下发模板资源,但是并无法控制子Chart之间的发布顺序。例如服务 B 部署必须依赖服务 A 的资源全部Ready。可以通过自定义子Chart之间的依赖顺序,在产品层控制每个子Chart的发布过程。

    发布应用

    上面我们使用helm初始化了一个charts结构,我们使用上面初始化的好的结构,把我之前打包的一个镜像,发布到k8s环境中

    镜像liz2019/main-test:1.1.72

    开始部署,为了方便查看结果,我们使用NodePort的类型部署,修改values.yaml

    service:
    #  type: ClusterIP
    #  port: 80
      type: NodePort
      port: 80
    

    部署

    $ helm upgrade --install --force --wait --namespace test  --set image.repository=liz2019/main-test --set image.tag=1.1.72 chart-demo  ./chart-demo
    
    Release "chart-demo" does not exist. Installing it now.
    NAME: chart-demo
    LAST DEPLOYED: Tue Jun 15 16:27:22 2021
    NAMESPACE: test
    STATUS: deployed
    REVISION: 1
    NOTES:
    1. Get the application URL by running these commands:
      export NODE_PORT=$(kubectl get --namespace test -o jsonpath="{.spec.ports[0].nodePort}" services chart-demo)
      export NODE_IP=$(kubectl get nodes --namespace test -o jsonpath="{.items[0].status.addresses[0].address}")
      echo http://$NODE_IP:$NODE_PORT
    
    helm

    查看下结果

    helm

    可以看到已经成功部署了

    遇到的问题

    UPGRADE FAILED: failed to replace object: Service "chart-demo" is invalid: spec.clusterIP: Invalid value: "": field is immutable
    

    这种尝试设置不可变字段为空值的Chart,在Helm 2中可能正常工作,因为Helm 2仅仅比对新旧配置。只要你没有后续设置clusterIP为非空就不会出问题。但是到了Helm 3中则肯定会出现问题。

    强制更新的行为

    指定--force标记时,可以在升级时,进行必要的强制更新:

    • 对于Helm 2,当PATCH操作失败时,会删除、再重建目标资源

    • 对于Helm 3,会用PUT操作来替换(replace/overwrite)目标资源

    如果三方合并出现问题,有可能通过强制更新解决。对于Helm 3来说,更多情况下无济于事,主要是K8S限制某些字段一旦创建即不可变更。

    Helm 3中,即使强制更新,你也可能遇到类似下面的错误:

    1、ersistentVolumeClaim "ng" is invalid: spec: Forbidden: is immutable after creation except resources.requests for bound claims

    2、failed to replace object: Service "ng" is invalid: spec.clusterIP: Invalid value: "": field is immutable

    PUT操作解决不了不可变字段的问题,然而Helm 2删除后再创建,则规避了不可变字段问题,但会引发其它问题:

    • PVC删除,PV级联删除么?数据怎么办

    • Service删除,会导致暂时的服务不可用么?

    参考

    【YAML 模版老去?Helm Chart 或将应用分发事实标准】https://www.infoq.cn/article/dwc0ipnguogq4kbap*9g
    【Helm V3使用指北】http://www.wangyapu.com/2020/04/10/helm_user_guide/
    【Helm v3安装与应用】https://blog.51cto.com/wutengfei/2569465
    【基于Helm的Kubernetes资源管理】https://blog.gmem.cc/helm

  • 相关阅读:
    java -jar 远程调试
    正则
    python2和3的区别
    javaw 运行jar 指定编码
    windows kill 结束指定端口进程
    linux 查看nginx 安装目录
    node-mysql中防止SQL注入
    实用资源库和工具,极大缩减开发时间
    浏览器地址栏运行JavaScript代码
    css垂直居中方案
  • 原文地址:https://www.cnblogs.com/ricklz/p/14812642.html
Copyright © 2020-2023  润新知