Helm - Kubernetes服務編排的利器

Helm介紹

  在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

  • 建立新的charts
  • 將charts打包成tgz文件
  • 與chart倉庫交互
  • 安裝和卸載Kubernetes的應用
  • 管理使用Helm安裝的charts的生命週期

 

在Helm中,有三個須要瞭解的重要概念:git

  • chart:是建立Kubernetes應用實例的信息集合
  • config:建立發佈對象的chart的配置信息
  • release:chart的運行實例,包含特定的config

 

安裝Helm

注:有些文件或鏡像在國內可能沒法下載,能夠經過此地址獲取: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

 

準備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. 檢查效果

安裝:

 

刪除:

 

源碼地址

https://github.com/ErikXu/HelmTutorial

相關文章
相關標籤/搜索