• Helm


    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. 检查效果

    安装:

    删除:

    源码地址

    https://github.com/ErikXu/HelmTutorial

  • 相关阅读:
    Python xrange与range的区别返回的结果不一样
    matlab画立方体
    python查询数据类型
    Ubuntu下安装微信(electronic-wechat)
    python判断数组中是否有重复元素
    python构建数组
    Numpy中np.max(即np.amax)的用法
    你不知道C#只带有 get 访问器的属性是只读属性?
    Windows 平台安装配置 MongoDB
    一日一技:Ocelot网关使用IdentityServer4认证
  • 原文地址:https://www.cnblogs.com/Erik_Xu/p/8893725.html
Copyright © 2020-2023  润新知