在Kubernetes中部署容器云应用(容器或微服务编排)是一项有挑战性的工做,Helm就是为了简化在Kubernetes中安装部署容器云应用的一个客户端工具。经过Helm可以帮助开发者定义、安装和升级Kubernetes中的容器云应用。同时,也能够经过Helm进行容器云应用的分享。html
Helm的总体架构以下图(图片来源-Kubernetes中文社区)所示:java
Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并将其安装部署到Kubernetes集群中。 node
Helm是管理Kubernetes包的工具,Helm能提供如下能力:linux
在Helm中,有三个须要了解的重要概念:git
注:有些文件或镜像在国内可能没法下载,能够经过此地址获取:https://pan.baidu.com/s/1yVUCz7wGYie8hkzQaNc3eggithub
1. 在Master中下载安装Helm的客户端,可根据须要下载对应的版本,这里使用的版本是2.8.2。docker
curl -LO https://storage.googleapis.com/kubernetes-helm/helm-v2.8.2-linux-amd64.tar.gzapi
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
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 .
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完成上面两个微服务的部署。
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来删除
使用的组件是: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. 检查效果
安装:
删除: