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 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
查看結果
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. 檢查效果
安裝:
刪除: