整体架构

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的相关版本

https://github.com/kubernetes/helm/releases

tar -xvzf  $HELM.tar.gz 

mv linux-amd64/helm /usr/local/bin/helm

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

[root@k8s-node- ~]# kubectl config set-cluster kubernetes --server=http://192.168.0.104:8080
Cluster "kubernetes" set. [root@k8s-node- ~]# kubectl config set-credentials admin
User "admin" set. [root@k8s-node- ~]# kubectl config set-context kubernetes \
> --cluster=kubernetes \
> --user=admin
Context "kubernetes" set. [root@k8s-node- ~]# kubectl config use-context kubernetes
Switched to context "kubernetes".
  • 运行安装

先创建用户和角色。

apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
[root@k8s-node- ~]# helm init --service-account tiller --skip-refresh
$HELM_HOME has been configured at /root/.helm. Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

然后去查看

[root@k8s-node- ~]# kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy--dxpfj / ContainerCreating 26s
[root@k8s-node- ~]# kubectl describe pods tiller-deploy--dxpfj -n kube-system
Name: tiller-deploy--dxpfj
Namespace: kube-system
Node: k8s-node-/192.168.0.105
Start Time: Fri, Feb :: +
Labels: app=helm
name=tiller
pod-template-hash=
Status: Pending
IP:
Controllers: ReplicaSet/tiller-deploy-
Containers:
tiller:
Container ID:
Image: gcr.io/kubernetes-helm/tiller:v2.8.1
Image ID:
Ports: /TCP, /TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count:
Liveness: http-get http://:44135/liveness delay=1s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:44135/readiness delay=1s timeout=1s period=10s #success=1 #failure=3
Volume Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from tiller-token-xng0h (ro)
Environment Variables:
TILLER_NAMESPACE: kube-system
TILLER_HISTORY_MAX:
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Volumes:
tiller-token-xng0h:
Type: Secret (a volume populated by a Secret)
SecretName: tiller-token-xng0h
QoS Class: BestEffort
Tolerations: <none>
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 1m {default-scheduler } Normal Scheduled Successfully assigned tiller-deploy--dxpfj to k8s-node-
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版本

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

先解决两个错误:

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

解决办法在node节点安装socat

yum install socat

  • 版本不一致

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

5.项目中如何使用

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

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

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

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

[root@k8s-master templates]# cat deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcatjmx
spec:
replicas: {{.Values.replicas}}
template:
metadata:
labels:
tomcat-app: "tomcatjmx"
version: ""
spec:
containers:
- name: tomcatjmx
image: tomcat:{{.Values.images.dockerTag}}
ports:
- containerPort: {{.Values.images.Port}}
name: tomcatport
- containerPort:
name: jmx
[root@k8s-master templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: {{.Values.service.name}}
labels:
tomcat-app: tomcatjmx
spec:
ports:
- port: {{.Values.service.Port}}
protocol: TCP
targetPort:
name: http
- name: jmx
protocol: TCP
port:
targetPort: {{.Values.service.targetPort}}
type: NodePort
selector:
tomcat-app: tomcatjmx
[root@k8s-master hello-svc]# cat values.yaml
# Default values for hello-svc.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates. replicas: images:
dockerTag: jmxv4
Port: service:
name: tomcatjmxsvc
Port:
targetPort:

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

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

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

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服务

minio server ./repository

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

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

创建一个bucket同时设置权限

mc mb myminio/minio-helm-repo
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,然后上传,将来在使用的时候可以通过程序实现自动添加。

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

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

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

./mc cp /root/hello-svc/hello-svc-0.1..tgz myminio/minio-helm-repo
...-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进行更新。

[root@k8s-master helm]# helm repo add myrepo http://192.168.44.108:9000/minio-helm-repo
"myrepo" has been added to your repositories [root@k8s-master helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com):
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
...Successfully got an update from the "myrepo" chart repository
Update Complete. ⎈ Happy Helming!⎈
  • 基于Minio的Repository进行Helm的部署

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

[root@k8s-master helm]# helm search hello
WARNING: Repo "stable" is corrupt or missing. Try 'helm repo update'.NAME VERSION DESCRIPTION
local/hello-svc 0.1. A Helm chart for Kubernetes
myrepo/hello-svc 0.1. Distributed object storage server built for clo... [root@k8s-master helm]# helm install myrepo/hello-svc
NAME: quelling-hound
LAST DEPLOYED: Sat Feb ::
NAMESPACE: default
STATUS: DEPLOYED RESOURCES:
==> v1/Service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcatjmxsvc 10.254.180.188 <nodes> :/TCP,:/TCP 2s ==> v1beta1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
tomcatjmx 2s NOTES:
. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods -l "app=hello-svc,release=quelling-hound" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
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. Mybatis学习—入门

    总结自 Mybatis官方中文文档 什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手 ...

  2. jps命令学习

    jps命令学习 标签(空格分隔): jvm jps介绍 ( JVM Process Status Tool ) 网文 jps命令用于查看当前Java进程及其pid等相关信息,同ps -ef | gre ...

  3. 理解JWT(Json Web Token)

    这篇文章写得不错: 理解JWT(JSON Web Token)认证及python实践,这里不做转载,仅摘要如下,有删改,仅做个人学习,感谢原作者. 常用认证机制: 1)HTTP basic Auth: ...

  4. ELK日志处理

    ELK的工作原理: 使用多播进行机器发现同一个集群内的节点,并汇总各个节点的返回组成一个集群,主节点要读取各个节点的状态,在关键时候进行数据的恢复,主节点会坚持各个节点的状态,并决定每个分片的位置,通 ...

  5. SEO:查找网站的百度收录情况和如何让百度快速收录

    查询收录的工具地址: http://tool.chinaz.com/baidu/entry/ 如何让百度快速收录: 一.大家都熟知的百度网站提交,只需要提交网站的首页即可.以前做完这一步就被百度收录的 ...

  6. file '/grub/i386-pc/normal.mod' not found.解决方案

    前言: 因为之前装的Ubuntu出了点问题,本想直接清除Ubuntu数据重新装一下,结果蹦出这么个BUG来,揪心,弄了大半天终于弄好了. 废话不多说,直接按教程走吧. GRUB启动: 在grub启动界 ...

  7. python基础day4

    1.列表生成式,迭代器&生成器 列表生成式 将列表[0,1,2,3,4,5,6,7,8]中的每个值加1,如何实现?常用的几种方法 方法一: a=[0,1,2,3,4,5,6,7,8] for ...

  8. Ghostscript 中 ps2pdf 命令在 windows msys 下的运行错误问题。

    前两天看到了 miloyip/game-programmer 这个项目觉得特别有用,真是好东西,明确了指出了学习路线,尤其是新手.不过打开看,有些书对应的亚马逊链接是无效的,比如<Tricks ...

  9. Spring MVC源码——Root WebApplicationContext

    目录 Spring MVC源码--Root WebApplicationContext 上下文层次结构 Root WebApplicationContext 初始化和销毁 ContextLoaderL ...

  10. 洛谷——P1609 最小回文数

    题目描述 回文数是从左向右读和从右向左读结果一样的数字串. 例如:121.44 和3是回文数,175和36不是. 对于一个给定的N,请你寻找一个回文数P,满足P>N. 满足这样条件的回文数很多, ...