整体架构

1.为什么要用?

首先在原来项目中都是基于yaml文件来进行部署发布的,而目前项目大部分微服务化或者模块化,会分成很多个组件来部署,每个组件可能对应一个deployment.yaml,一个service.yaml,一个Ingress.yaml还可能存在各种依赖关系,这样一个项目如果有5个组件,很可能就有15个不同的yaml文件,这些yaml分散存放,如果某天进行项目恢复的话,很难知道部署顺序,依赖关系等,而所有这些包括

  • 基于yaml配置的集中存放
  • 基于项目的打包
  • 组件间的依赖

都可以通过helm来进行解决。

2.Helm 基本概念

Helm 可以理解为 Kubernetes 的包管理工具,可以方便地发现、共享和使用为Kubernetes构建的应用,它包含几个基本概念

  • Chart:一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义
  • Release: 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。
  • Repository:用于发布和存储 Chart 的仓库。

3.Helm 组件及架构

Helm 采用客户端/服务器架构,有如下组件组成:

  • Helm CLI 是 Helm 客户端,可以在本地执行
  • Tiller 是服务器端组件,在 Kubernetes 群集上运行,并管理 Kubernetes 应用程序的生命周期
  • Repository 是 Chart 仓库,Helm客户端通过HTTP协议来访问仓库中Chart的索引文件和压缩包。

4.Helm的安装

在下列网站下载helm的相关版本

  1. https://github.com/kubernetes/helm/releases
  2.  
  1. tar -xvzf $HELM.tar.gz
  2.  
  3. mv linux-amd64/helm /usr/local/bin/helm

在K8s节点上配置.kube/config(我是因为之前没搞这些,大家如果搞过就直接忽略)

  1. [root@k8s-node- ~]# kubectl config set-cluster kubernetes --server=http://192.168.0.104:8080
  2. Cluster "kubernetes" set.
  3.  
  4. [root@k8s-node- ~]# kubectl config set-credentials admin
  5. User "admin" set.
  6.  
  7. [root@k8s-node- ~]# kubectl config set-context kubernetes \
  8. > --cluster=kubernetes \
  9. > --user=admin
  10. Context "kubernetes" set.
  11.  
  12. [root@k8s-node- ~]# kubectl config use-context kubernetes
  13. Switched to context "kubernetes".
  • 运行安装

先创建用户和角色。

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: tiller
  5. namespace: kube-system
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1beta1
  8. kind: ClusterRoleBinding
  9. metadata:
  10. name: tiller
  11. roleRef:
  12. apiGroup: rbac.authorization.k8s.io
  13. kind: ClusterRole
  14. name: cluster-admin
  15. subjects:
  16. - kind: ServiceAccount
  17. name: tiller
  18. namespace: kube-system
  1. [root@k8s-node- ~]# helm init --service-account tiller --skip-refresh
  2. $HELM_HOME has been configured at /root/.helm.
  3.  
  4. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
  5. Happy Helming!

然后去查看

  1. [root@k8s-node- ~]# kubectl get pod -n kube-system -l app=helm
  2. NAME READY STATUS RESTARTS AGE
  3. tiller-deploy--dxpfj / ContainerCreating 26s
  1. [root@k8s-node- ~]# kubectl describe pods tiller-deploy--dxpfj -n kube-system
  2. Name: tiller-deploy--dxpfj
  3. Namespace: kube-system
  4. Node: k8s-node-/192.168.0.105
  5. Start Time: Fri, Feb :: +
  6. Labels: app=helm
  7. name=tiller
  8. pod-template-hash=
  9. Status: Pending
  10. IP:
  11. Controllers: ReplicaSet/tiller-deploy-
  12. Containers:
  13. tiller:
  14. Container ID:
  15. Image: gcr.io/kubernetes-helm/tiller:v2.8.1
  16. Image ID:
  17. Ports: /TCP, /TCP
  18. State: Waiting
  19. Reason: ContainerCreating
  20. Ready: False
  21. Restart Count:
  22. Liveness: http-get http://:44135/liveness delay=1s timeout=1s period=10s #success=1 #failure=3
  23. Readiness: http-get http://:44135/readiness delay=1s timeout=1s period=10s #success=1 #failure=3
  24. Volume Mounts:
  25. /var/run/secrets/kubernetes.io/serviceaccount from tiller-token-xng0h (ro)
  26. Environment Variables:
  27. TILLER_NAMESPACE: kube-system
  28. TILLER_HISTORY_MAX:
  29. Conditions:
  30. Type Status
  31. Initialized True
  32. Ready False
  33. PodScheduled True
  34. Volumes:
  35. tiller-token-xng0h:
  36. Type: Secret (a volume populated by a Secret)
  37. SecretName: tiller-token-xng0h
  38. QoS Class: BestEffort
  39. Tolerations: <none>
  40. Events:
  41. FirstSeen LastSeen Count From SubObjectPath Type Reason Message
  42. --------- -------- ----- ---- ------------- -------- ------ -------
  43. 1m 1m {default-scheduler } Normal Scheduled Successfully assigned tiller-deploy--dxpfj to k8s-node-
  44. 1m 1m {kubelet k8s-node-} spec.containers{tiller} Normal Pulling pulling image "gcr.io/kubernetes-helm/tiller:v2.8.1"

发现需要gcr.io/kubernetes-helm/tiller:v2.8.1

一番折腾后运行后完成,因为找不到2.8.1版本,所以最后搞了个2.6.0版本

  1. [root@k8s-master helm]# helm init --service-account tiller --upgrade -i index.tenxcloud.com/kubernetes-helm/tiller:v2.6.0 --skip-refresh
  2. Creating /root/.helm
  3. Creating /root/.helm/repository
  4. Creating /root/.helm/repository/cache
  5. Creating /root/.helm/repository/local
  6. Creating /root/.helm/plugins
  7. Creating /root/.helm/starters
  8. Creating /root/.helm/cache/archive
  9. Creating /root/.helm/repository/repositories.yaml
  10. Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
  11. Adding local repo with URL: http://127.0.0.1:8879/charts
  12. $HELM_HOME has been configured at /root/.helm.
  13.  
  14. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
  15. Happy Helming!
  • 问题解决

先解决两个错误:

  • unable to do port forwarding: socat not found.
  1. [root@k8s-master hello-svc]# helm version
  2. Client: &version.Version{SemVer:"v2.8.1", GitCommit:"6af75a8fd72e2aa18a2b278cfe5c7a1c5feca7f2", GitTreeState:"clean"}
  3. E0224 ::16.077226 portforward.go:] an error occurred forwarding -> : error forwarding port to pod 76a7312e49220a229e443546a4b32d3e0406f09fd9b3646b3d30f6833e121375, uid : unable to do port forwarding: socat not found.
  4. Error: cannot connect to Tiller

解决办法在node节点安装socat

yum install socat

  • 版本不一致

重新下载一致的版本包,和images的版本保持一致

5.项目中如何使用

  • 针对每个项目形成一个chart,最后形成一个Chart Package

比如下面针对hello-svc这个基于tomcat的项目,先生成一个chart的结构

  • 创建chart及部署
  1. [root@k8s-master ~]# helm create hello-svc
  2. Creating hello-svc

按照我们自己的需求修改模板中的deployment.yaml,service.yaml和values.yaml文件

  1. [root@k8s-master templates]# cat deployment.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Deployment
  4. metadata:
  5. name: tomcatjmx
  6. spec:
  7. replicas: {{.Values.replicas}}
  8. template:
  9. metadata:
  10. labels:
  11. tomcat-app: "tomcatjmx"
  12. version: ""
  13. spec:
  14. containers:
  15. - name: tomcatjmx
  16. image: tomcat:{{.Values.images.dockerTag}}
  17. ports:
  18. - containerPort: {{.Values.images.Port}}
  19. name: tomcatport
  20. - containerPort:
  21. name: jmx
  1. [root@k8s-master templates]# cat service.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: {{.Values.service.name}}
  6. labels:
  7. tomcat-app: tomcatjmx
  8. spec:
  9. ports:
  10. - port: {{.Values.service.Port}}
  11. protocol: TCP
  12. targetPort:
  13. name: http
  14. - name: jmx
  15. protocol: TCP
  16. port:
  17. targetPort: {{.Values.service.targetPort}}
  18. type: NodePort
  19. selector:
  20. tomcat-app: tomcatjmx
  1. [root@k8s-master hello-svc]# cat values.yaml
  2. # Default values for hello-svc.
  3. # This is a YAML-formatted file.
  4. # Declare variables to be passed into your templates.
  5.  
  6. replicas:
  7.  
  8. images:
  9. dockerTag: jmxv4
  10. Port:
  11.  
  12. service:
  13. name: tomcatjmxsvc
  14. Port:
  15. targetPort:

相应的NOTES.txt也进行调整直到验证没有问题,验证完成通过install安装

  1. helm install --dry-run --debug ./
  1. [root@k8s-master hello-svc]# helm install ./
  2. NAME: kindly-worm
  3. LAST DEPLOYED: Sat Feb ::
  4. NAMESPACE: default
  5. STATUS: DEPLOYED
  6.  
  7. RESOURCES:
  8. ==> v1/Service
  9. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  10. tomcatjmxsvc 10.254.25.181 <nodes> :/TCP,:/TCP 1s
  11.  
  12. ==> v1beta1/Deployment
  13. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  14. tomcatjmx 1s
  15.  
  16. NOTES:
  17. . Get the application URL by running these commands:
  18. export POD_NAME=$(kubectl get pods -l "app=hello-svc,release=kindly-worm" -o jsonpath="{.items[0].metadata.name}")
  19. echo "Visit http://127.0.0.1:8080 to use your application"
  20. kubectl port-forward $POD_NAME :
  21.  
  22. [root@k8s-master hello-svc]# helm list
  23. NAME REVISION UPDATED STATUS CHART NAMESPACE
  24. kindly-worm Sat Feb :: DEPLOYED hello-svc-0.1. default
  • 形成一个chart Package

打包形成一个tgz文件,估计是每个项目一个chart,对应一个tgz

  1. helm package ./
  • Chart Package的集中管理和存放

上面我们是从本地的目录结构中的chart去进行部署,如果要集中管理chart,就需要涉及到repository的问题,因为helm repository都是指到外面的地址,接下来我们可以通过minio建立一个企业私有的存放仓库。

Minio提供对象存储服务。它的应用场景被设定在了非结构化的数据的存储之上了。众所周知,非结构化对象诸如图像/音频/视频/log文件/系统备份/镜像文件…等等保存起来管理总是不那么方便,size变化很大,类型很多,再有云端的结合会使得情况更加复杂,minio就是解决此种场景的一个解决方案。Minio号称其能很好的适应非结构化的数据,支持AWS的S3,非结构化的文件从数KB到5TB都能很好的支持。

Minio的使用比较简单,只有两个文件,服务端minio,客户访问端mc,比较简单。

在项目中,我们可以直接找一台虚拟机作为Minio Server,提供服务,当然minio也支持作为Pod部署。

1.安装配置Minio

下载

在https://dl.minio.io/client/mc/release/linux-amd64/ 下载客户端程序mc和服务端程序minio

启动minio服务

  1. minio server ./repository

针对使用得客户端加入security和token信息

  1. ./mc config host add myminio http://192.168.44.108:9000 B0SW3MZ00J7OCG2JCG5D nZrG2olrz+aDbhbzVhft6JivkkoPQe2gp5JaG+XO

创建一个bucket同时设置权限

  1. mc mb myminio/minio-helm-repo
  2. mc policy download myminio/minio-helm-repo

安装完成后通过浏览器访问minio的界面,http://192.168.44.108:9000/

2.将我们上面创建的chart Package传入Minio的Repository

index.yaml为了让helm对里面的包进行索引,找到各种entry,每个entry是一个项目,每个项目对应一个chart Package.

在本地建立一个index.yaml,然后上传,将来在使用的时候可以通过程序实现自动添加。

  1. [root@k8s-master minio-helm-repo]# cat index.yaml
  2. apiVersion: v1
  3. entries:
  4. hello-svc:
  5. - apiVersion: v1
  6. description: Distributed object storage server built for cloud applications and devops.
  7. digest: 8440f6f064ed91a75194e77d4b2be99c491c1cb04fb34bca4a36a5be67e1ef2c
  8. name: hello-svc
  9. urls:
  10. - http://192.168.44.108:9000/minio-helm-repo/hello-svc-0.1.0.tgz
  11. version: 0.1.

将之前的tgz package和index文件都传入。

  1. ./mc cp ./index.yaml myminio/minio-helm-repo
  2. ./index.yaml: B / B ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 47.73 KB/s 0s

  3. ./mc cp /root/hello-svc/hello-svc-0.1..tgz myminio/minio-helm-repo
  4. ...-svc-0.1..tgz: 1.50 KB / 1.50 KB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 100.00% 48.00 KB/s 0s

3.设置Helm

在helm中加入repository,加入完成后可以通过helm repo list进行罗列。修改了index.yaml后也需要用helm repo update进行更新。

  1. [root@k8s-master helm]# helm repo add myrepo http://192.168.44.108:9000/minio-helm-repo
  2. "myrepo" has been added to your repositories
  3.  
  4. [root@k8s-master helm]# helm repo update
  5. Hang tight while we grab the latest from your chart repositories...
  6. ...Skip local chart repository
  7. ...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com):
  8. Get https://kubernetes-charts.storage.googleapis.com/index.yaml: dial tcp: lookup kubernetes-charts.storage.googleapis.com on [::1]:53: read udp [::1]:59458->[::1]:53: read: connection refused
  9. ...Successfully got an update from the "myrepo" chart repository
  10. Update Complete. Happy Helming!⎈
  • 基于Minio的Repository进行Helm的部署

好了,一切就绪,先search一下

  1. [root@k8s-master helm]# helm search hello
  2. WARNING: Repo "stable" is corrupt or missing. Try 'helm repo update'.NAME VERSION DESCRIPTION
  3. local/hello-svc 0.1. A Helm chart for Kubernetes
  4. myrepo/hello-svc 0.1. Distributed object storage server built for clo...
  5.  
  6. [root@k8s-master helm]# helm install myrepo/hello-svc
  7. NAME: quelling-hound
  8. LAST DEPLOYED: Sat Feb ::
  9. NAMESPACE: default
  10. STATUS: DEPLOYED
  11.  
  12. RESOURCES:
  13. ==> v1/Service
  14. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  15. tomcatjmxsvc 10.254.180.188 <nodes> :/TCP,:/TCP 2s
  16.  
  17. ==> v1beta1/Deployment
  18. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  19. tomcatjmx 2s
  20.  
  21. NOTES:
  22. . Get the application URL by running these commands:
  23. export POD_NAME=$(kubectl get pods -l "app=hello-svc,release=quelling-hound" -o jsonpath="{.items[0].metadata.name}")
  24. echo "Visit http://127.0.0.1:8080 to use your application"
  25. kubectl port-forward $POD_NAME :

这里search能搜索到但是部署不上去的问题折腾了一下,最后原因是那个Index.yaml文件写得有问题。再度更新后成功部署。

Helm安装和项目使用的更多相关文章

  1. kubernetes实战(十):k8s使用Helm安装harbor

    1.基本概念 对于复杂的应用中间件,需要设置镜像运行的需求.环境变量,并且需要定制存储.网络等设置,最后设计和编写Deployment.Configmap.Service及Ingress等相关yaml ...

  2. K8s Helm安装配置入门

    作为k8s现在主流的一种包部署方式,尽管不用,也需要进行一些了解.因为,它确实太流行了. 这一套太极拳打下来,感觉helm这种部署,目前还不太适合于我们公司的应用场景.它更适合需要手工编程各种yaml ...

  3. Helm 安装使用

    简介 很多人都使用过Ubuntu下的ap-get或者CentOS下的yum, 这两者都是Linux系统下的包管理工具.采用apt-get/yum,应用开发者可以管理应用包之间的依赖关系,发布应用:用户 ...

  4. kubernetes系列(十六) - Helm安装和入门

    1. helm简介 1.1 为什么需要helm 1.2 helm中几个概念 1.3 helm用途 2. helm安装 3. helm的基本使用 3.1 安装chart仓库里面的chart 3.2 创建 ...

  5. git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

     一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目  3.安装依赖包(进入到命令行) # 安装依赖包 $ ...

  6. VS2013安装部署项目

    打开vs2013/2015菜单扩展和更新,查找Installer,找到Microsoft Visual Studio 2015 Installer Projects并下载安装. 安装之后模板中即有“安 ...

  7. npm install含义 及vue安装启动项目时报错解决及vue建项目时各文件间的依赖关系

    全局安装vue-cli,使用命令npm install -g vue-cli. 下载模板代码,使用命令vue init webpack my-project,之后会有一些询问,按需填写即可. 最后会看 ...

  8. kubernetes包管理工具Helm安装

    helm官方建议使用tls,首先生成证书. openssl genrsa -out ca.key.pem openssl req -key ca.key.pem -new -x509 -days -s ...

  9. mac上安装vue项目

    mac上如何安装vue项目 一, mac系统安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...

随机推荐

  1. linux命令(4):vmstat命令

    CPU监控如下: vmstat 2 10  //表示每隔2秒运行10次 内存监控如下: vmstat –s 监控进程及CPU.内存状态 如下: top

  2. window下线程同步之(Critical Sections(关键代码段、关键区域、临界区域)

    关键区域(CriticalSection) 临界区是为了确保同一个代码片段在同一时间只能被一个线程访问,与原子锁不同的是临界区是多条指令的锁定,而原子锁仅仅对单条操作指令有效;临界区和原子锁只能控制同 ...

  3. AC日记——「SCOI2016」美味 LiBreOJ 2016

    #2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...

  4. Ext 目录

    adapter:负责将里面提供第三方底层库(包括Ext自带的底层库)映射为Ext所支持的底层库. build: 压缩后的ext全部源码(里面分类存放). docs: API帮助文档. exmaples ...

  5. 关于在C#中对函数重载理解

    函数重载是个什么概念,才接触的这个概念的时候我也是完全昏了,还在自己看看了书后就理解了.那什么是函数重载呢?我个人理解的是在同一个作用域下有多个同名的函数,但是他们的形参的类型是不同的,或者参数个数是 ...

  6. C++中正确使用PRId64

    http://blog.csdn.net/win_lin/article/details/7912693

  7. 将cmake文件转化为vs方便代码阅读与分析

    下面通过“chengxuyuancc”同学的图来说明.通过cmake将winafl cmake编译方式转化为vs2015,方便源码阅读与分析. 1.到官网下载cmake软件.启动图形版 2.选择源码目 ...

  8. (5) go 控制台输入输出、进制转换、原反补码、位运算

    一.控制台接受输入 二.原反补码 三.位运算 四.移位运算

  9. B. Black Square(字符串)

    B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  10. 使用supervisor管理后台进程

    在linux中supervisor是用来管理后台进程的,是一个用python写的进程管理工具,可以让宕机的进程重启.这里我们大概讲一下用他来管理uWSGI. 一.安装supervisor 1.pyth ...