Helm介绍

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

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

  

  Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并将其安装部署到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无法下载,可以从上面的链接中获取。

2. 安装Tiller。

helm init

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

如果出现了“Error:Get https://10.96.0.1:443/version:dial tcp 10.96.0.1:443:i/o timeout.”的问题,可以参考我的回答来解决:

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 /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

查看结果

java服务:

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

7. 删除release

helm delete hello-test

kubectl get po

helm ls -a

hello-test还在,但状态是DELETED,表示可以重用。如果想彻底删除,可以通过helm delete hello-test --purge来删除

使用.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

Helm - Kubernetes服务编排的利器的更多相关文章

  1. (转)Terraform,自动化配置与编排必备利器

    本文来自作者 QingCloud实践课堂 在 GitChat 上分享 「Terraform,自动化配置与编排必备利器」 Terraform - Infrastructure as Code 什么是 T ...

  2. Helm - Kubernetes包管理专家

    What is Helm? - The package manager for kubernetes, Helm is the best way to find, share, and use sof ...

  3. Helm:kubernetes应用包管理工具

    概要 Helm:kubernetes应用包管理工具 K8s部署应用的时候,应用会通过yaml描述信息调用K8s-api:Helm即是管理这些Yaml的应用包管理工具 组成 Helm包含5个部分 Hel ...

  4. 将微服务部署到 Azure Kubernetes 服务 (AKS) 实践

    本文是对 <.NET Tutorial - Deploy a microservice to Azure> 的翻译和实践.入门级踩坑实践,k8s 大佬请回避,以免耽误您宝贵的时间. 介绍 ...

  5. 用集装箱装ASP。带有Docker和Azure Kubernetes服务的NET Core应用程序

    介绍 曾经有一个单一软件应用程序的时代,整个应用程序被打包并部署在作为单个进程运行的单个服务器上.我们都知道,在这个模型中,单点故障可能会导致整个应用程序崩溃. 微服务体系结构的发展是为了解决单片应用 ...

  6. Kubernetes服务pod的健康检测liveness和readiness详解

    Kubernetes服务pod的健康检测liveness和readiness详解 接下来给大家讲解下在K8S上,我们如果对我们的业务服务进行健康检测. Health Check.restartPoli ...

  7. VMware Tanzu Kubernetes Grid 1.3 发布 - VMware 构建、签名和支持的开源 Kubernetes 容器编排平台的完整分发版

    Tanzu Kubernetes 集群是由 VMware 构建.签名和支持的开源 Kubernetes 容器编排平台的完整分发版.可以通过使用 Tanzu Kubernetes Grid 服务在主管集 ...

  8. 微软开源Kubernetes服务网格项目Open Service Mesh​

    尽管微服务环境提供可移植性,允许更快更频繁的部署周期,甚至还能让组织创建关注于特定领域的团队,但这也伴随着对于流量管理.安全以及可观测性等需求的增长.在整个生态系统中,针对这些需求的服务网格模式的实现 ...

  9. Docker之Compose服务编排

    Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景. 说明:Comp ...

随机推荐

  1. Redis主从配置和哨兵监控配置——服务器端环境搭建

    一:介绍 公司用到的redis框架,主要分为cluster的缓存集群和sentinel中的哨兵主从.这种的选用方式一般需要更具业务场景来做区分,两种框架的配置图为:右图为哨兵主从框架和cliuster ...

  2. java 中使用RSA非对称性加密解密

    需要引入的jar包:bcprov-jdk15on-161.jar 下载地址:https://www.bouncycastle.org/latest_releases.html //公钥加密 publi ...

  3. vue DES 加密

    安装crypto-js cnpm install crypto-js --save 封装一个des.js ECB模式 import cryptoJs from 'crypto-js' // DES加密 ...

  4. 各种类型文件的Content-Type

    各种类型文件的Content-Type 2017年11月27日 10:00:56 thebigdipperbdx 阅读数:7360   版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  5. C#使用Selenium+PhantomJS抓取数据

    本文主要介绍了C#使用Selenium+PhantomJS抓取数据的方法步骤,具有很好的参考价值,下面跟着小编一起来看下吧 手头项目需要抓取一个用js渲染出来的网站中的数据.使用常用的httpclie ...

  6. 一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]

    看题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4] 这道题的关键是拿到True的索引值,最初我是用list的index方 ...

  7. postgresql设置主键

    replace(((uuid_generate_v4())::character varying)::text, '-'::text, ''::text)

  8. 模拟登陆github

    import requests from lxml import etree class Login(object): def __init__(self): self.headers = { 'Re ...

  9. go 【第二篇】包、变量、函数

    包 初试 每个 Go 程序都是由包组成的. 程序运行的入口是包 `main`. 这个程序使用并导入了包 "fmt" 和 `"math/rand"`. 按照惯例, ...

  10. hash(散列函数)

    一直对哈希不太理解,今天上网搜了一下,总结出以下几点,希望可以对大家的理解有所帮助 1)概念 哈希就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列 ...