Helm - Kubernetes服务编排的利器

匿名 (未验证) 提交于 2019-12-03 00:41:02

Helm介绍

  在Kubernetes中部署容器云应用(容器或微服务编排)是一项有挑战性的工作,Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具。通过Helm能够帮助开发者定义、安装和升级Kubernetes中的容器云应用。同时,也可以通过Helm进行容器云应用的分享。

  Helm的整体架构如下图(图片来源-Kubernetes中文社区)所示:

  

Helm是管理Kubernetes包的工具,Helm能提供以下能力:

  • 创建新的charts
  • 将charts打包成tgz文件
  • 与chart仓库交互
  • 安装和卸载Kubernetes的应用
  • 管理使用Helm安装的charts的生命周期

在Helm中,有三个需要了解的重要概念:

  • chart:是创建Kubernetes应用实例的信息集合
  • config:创建发布对象的chart的配置信息
  • release:chart的运行实例,包含特定的config

安装Helm

注:有些文件或镜像在国内可能无法下载,可以通过此地址获取:https://pan.baidu.com/s/1yVUCz7wGYie8hkzQaNc3eg

1. 在Master中下载安装Helm的客户端,可根据需要下载对应的版本,这里使用的版本是2.8.2。

curl -LO https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gz

tar xzf helm-v2.8.2-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin

helm version查看信息:

服务端Tiller还未安装,因此无法获取信息。

注:如果helm-v2.8.2-linux-amd64.tar.gz无法下载,可以从上面的链接中获取。

helm init

注:如果初始化失败,可以把上面的链接中的.helm目录拷贝到master的root目录下。tiller的镜像文件也可以从目录获取。

https://github.com/kubernetes/helm/issues/3347#issuecomment-385468128

使用helm version查看Helm版本,如下表示客户端、服务端都安装完成:

Kubernetes 1.6+版本加入了RBAC的机制,因此需要添加Role Binding:

kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default

准备Java微服务

1. 打包jar

mvn package

2. 准备Dockerfile

FROM java:8u111-jre RUN mkdir /app COPY . /app WORKDIR /app CMD ["java","-Xmx4g","-Djava.security.egd=file:/dev/./urandom","-jar","hello-1.0.0.jar"]

3. 拷贝打包好的jar包以及Dockerfile到node虚拟机

4. 打包docker镜像

docker build -t hello:1.0.0 .

准备.Net Core微服务

1. 发布项目

dotnet publish -c Release

2. 准备Dockerfile

FROM microsoft/aspnetcore:2.0 COPY . /app WORKDIR /app  EXPOSE 5000/tcp ENV ASPNETCORE_URLS http://*:5000  ENTRYPOINT ["dotnet", "HelloTest.dll"]

3. 拷贝打包好的程序包以及Dockerfile到node虚拟机

4. 打包docker镜像

docker build -t hello-test:1.0.0 .

使用Helm部署蓝图(Chart)

这里演示如何通过helm完成上面两个微服务的部署。

1. 创建chart

helm create hello-test

2. 在templates目录中放入相应的部署脚本

3. 打包chart

helm package hello-test

4. 检查chart

helm lint hello-test

缺少chart的图标,但不影响,可以忽略。

5. 调试chart

helm install ./hello-test-0.1.0.tgz --debug --dry-run

调试模式不会真的部署,通过helm list来查看:

6. 通过chart部署release

helm install --name hello-test ./hello-test-0.1.0.tgz

helm ls

kubectl get po

查看结果

.Net Core服务(调用java服务):

7. 删除release

helm delete hello-test

kubectl get po

helm ls -a

使用.Net Core来进行部署

使用的组件是:https://github.com/qmfrederik/helm/

1. 核心代码:

[Route("api/releases")] public class ReleaseController : Controller {     [HttpPost("{name}")]     public async Task<IActionResult> Install(string name, IFormFile file)     {         var client = await GetClient();          using (var stream = new MemoryStream())         {             await file.CopyToAsync(stream);             var chart = ChartPackage.Open(stream);             var release = await client.InstallRelease(chart.Serialize(), string.Empty, name, true);             return Ok(release.Manifest);         }     }      [HttpDelete("{name}/{purge}")]     public async Task<IActionResult> Uninstall(string name, bool purge)     {         var client = await GetClient();         var result = await client.UninstallRelease(name, purge);         return Ok(result.Info);     }      [HttpPut("{name}")]     public async Task<IActionResult> Update(string name, IFormFile file)     {         var client = await GetClient();          using (var stream = new MemoryStream())         {             await file.CopyToAsync(stream);             var chart = ChartPackage.Open(stream);             var release = await client.UpdateRelease(chart.Serialize(), string.Empty, name);             return Ok(release.Manifest);         }     }      [HttpPut("{name}/{version}")]     public async Task<IActionResult> Rollback(string name, int version)     {         var client = await GetClient();         var result = await client.RollbackRelease(name, version);         return Ok(result.Info);     }      private static async Task<TillerClient> GetClient()     {         var kubeconfig = System.IO.File.ReadAllText("admin.conf");         var config = KubernetesClientConfiguration.BuildConfigFromConfigFile(kubeconfig: kubeconfig);         var kubernetes = new Kubernetes(config);          var locator = new TillerLocator(kubernetes);         var endPoint = await locator.Locate();         var client = new TillerClient(endPoint.ToString());         return client;     } }

注:这里需要获取Kubernetes的admin.config的证书,该证书在master节点上:/etc/kubernetes/admin.conf。

2. 参考上述准备.Net Core微服务的步骤,完成helm-client的镜像打包及部署。

注:需要把admin.conf拷贝到镜像中:

3. 准备yaml文件helm-client.yaml并完成部署

apiVersion: extensions/v1beta1 kind: Deployment metadata:   name: helm-client   labels:     app: helm-client   namespace: default spec:   replicas: 1   template:     metadata:       labels:         app: helm-client     spec:       nodeSelector:         kubernetes.io/role: node       containers:       - name: helm-client         image: helm-client:1.0.0         ports:         - containerPort: 5000  ---  kind: Service apiVersion: v1 metadata:   name: helm-client   labels:     app: helm-client   namespace: default spec:   selector:     app: helm-client   type: NodePort   ports:   - name: helm-client     nodePort: 30000     port: 5000     protocol: TCP     targetPort: 5000

4. 检查效果

安装:

删除:

源码地址

https://github.com/ErikXu/HelmTutorial

原文:https://www.cnblogs.com/Erik_Xu/p/8893725.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!