Kubernetes集群部署Helm

随着业务容器化与向微服务架构转变,把庞大的单一应用为多个小的单体,使每个单体都可以独立部署和扩展,实现了敏捷开发、快速迭代和部署。微服务带来诸多便利的同时,也导致单体数量大幅增多,带来了诸多挑战。用户希望拥有以下功能,来消除面临的挑战:
快速获取大量常用的基础应用模板方便管理、编辑与更新大量的Kubernetes配置文件快捷分享和复用Kubernetes配置和应用简单管理应用的发布:回滚、查看发布历史
Helm应运而生,作为一个包管理工具,可以完美应对以上Kubernetes做大规模应用编排带来了的挑战。产品简介

1. Helm简介
Helm是一个包管理工具, 把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中,方便将其chart保存到chart仓库用来存储和分享, Helm支持发布应用配置的版本管理, 使发布可配置, 简化了Kubernetes部署应用的版本控制、打包、发布、删除、更新等操作。
Kubernetes所发布的调查报告显示,其中有64%都是利用Helm,管理Kubernetes环境中执行的应用。
2. Helm架构图
Helm架构由Helm客户端、Tiller服务器端和Chart仓库所组成;Tiller部署在Kubernetes中,Helm客户端从Chart仓库中获取Chart安装包,并将其安装部署到Kubernetes集群中。

3. 产品功能
Helm是管理Kubernetes包的工具,Helm能提供下面的能力:

购买新的charts将charts打包成tgz文件与chart仓库交互安装和卸载Kubernetes的应用管理使用Helm安装的charts的生命周期
4. Helm组件
在Helm中有两个主要的组件,既Helm客户端和Tiller服务器:
Helm客户端:这是一个供终端用户使用的命令行工具,客户端负责如下的工作:本地chart开发管理仓库与Tiller服务器交互发送需要被安装的charts请求关于发布版本的信息请求更新或者卸载已安装的发布版本
Tiller服务器: Tiller服务部署在Kubernetes集群中,Helm客户端通过与Tiller服务器进行交互,并最终与Kubernetes API服务器进行交互。 Tiller服务器负责如下的工作:监听来自于Helm客户端的请求组合chart和配置来构建一个发布在Kubernetes中安装,并跟踪后续的发布通过与Kubernetes交互,更新或者chart
客户端负责管理chart,服务器负责管理发布前提条件已经购买Kubernetes集群,请参考阿里云Kubernetes集群入门指南购买集群以Centos7.4 64位为例进行部署,安装了Kubectl并连接Kubernetes集群,请参考入门指南连接集群安装部署下载对应版本,目前阿里云Kubernetes版本为1.8.12,请选择Helm版本为2.7.2
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.7.2-linux-amd64.tar.gz解压缩
tar -zxvf helm-v2.7.2-linux-amd64.tar.gz在解压后的目录中找到二进制文件,并将其移动到所需的位置
mv linux-amd64/helm /usr/local/bin/helm运行以下命令
helm help为Tiller添加权限,详见Role-based Access Control,新建rbac-config.yaml,内容如下: apiVersion: v1kind: ServiceAccountmetadata: name: tiller namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: tillerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects: - kind: ServiceAccount name: tiller namespace: kube-system 执行如下命令:

kubectl create -f rbac-config.yaml
6. 初始化 Helm 并安装 Tiller 服务

helm init --upgrade --service-account tiller --tiller-image registry.docker-cn.com/rancher/tiller:v2.7.27. 运行以下命令

helm version
出现以下信息,确认安装成功

Client: version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}Server: version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}## 使用Helm首次安装Helm时,已预配置为与官方Kubernetes chart存储库repo。该repo包含许多精心策划和维护的charts。此charts repo默认以stable命名。更新chart列表
helm repo update
查找所有可用的chart:
helm search NAME VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.0 Scales worker nodes within agent pools stable/aerospike 0.1.7 A Helm chart for Aerospike in Kubernetes stable/anchore-engine 0.2.6 Anchore container analysis and policy evaluatio...stable/apm-server 0.1.0 The server receives data from the Elastic APM a...stable/ark 1.2.2 A Helm chart for ark ...搜索mysql相关的chart

helm search mysql

NAME VERSIONDESCRIPTION stable/mysql 0.10.2 Fast, reliable, scalable, and easy to use open-...stable/mysqldump 1.0.0 A Helm chart to help backup MySQL databases usi...stable/prometheus-mysql-exporter0.2.1 A Helm chart for prometheus mysql exporter with...stable/percona 0.3.3 free, fully compatible, enhanced, open source d...stable/percona-xtradb-cluster 0.3.0 free, fully compatible, enhanced, open source d...stable/phpmyadmin 1.3.0 phpMyAdmin is an mysql administration frontend stable/gcloud-sqlproxy 0.6.0 Google Cloud SQL Proxy stable/mariadb 5.2.3 Fast, reliable, scalable, and easy to use open-...查看chart信息

helm inspect stable/mysql

appVersion: 5.7.14description: Fast, reliable, scalable, and easy to use open-source relational database system.engine: gotplhome: https://www.mysql.com/icon: https://www.mysql.com/common/logos/logo-mysql-170x115.pngkeywords:- mysql- database- sqlmaintainers:- email: o.with@sportradar.com name: olemarkus- email: viglesias@google.com name: viglesiascename: mysqlsources:- https://github.com/kubernetes/charts- https://github.com/docker-library/mysqlversion: 0.10.2...2. 安装部署应用

以WordPress、Nginx-Ingress为例进行演示。

例1:部署WordPress
WordPress是使用PHP语言开发的博客平台,逐渐发展成为世界上使用最多的自助博客工具;同时也作为一个内容管理系统(CMS)来使用。WordPress有以下两点优势:

简单易学,无法代码环境、易于理解的工具和功能。功能强大,发布网站:如公司官网、购买博客、在线商店、社交网站、帮主论坛、视频网站等。
以下讲述如何通过Helm快速购买WordPress:执行以下命令:
helm install stable/wordpress
输出以下信息: NAME: boisterous-aardwolfLAST DEPLOYED: Thu Nov 8 16:24:36 2018NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:== v1beta1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEboisterous-aardwolf-wordpress 1 1 1 0 1s== v1beta1/StatefulSetNAME DESIRED CURRENT AGEboisterous-aardwolf-mariadb 1 1 1s...- 由于该部署需要云硬盘,需要购买PVC。阿里云Kubernetes集群服务集成了阿里云云硬盘,你可以在集群中使用阿里云云硬盘作为持久化存储,详见[部署持久化存储](https://docs.jdcloud.com/cn/jcs-for-kubernetes/deploy-pv)

输入以下命令:
kubectl get pvc
输出以下信息,显示为pending状态:

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEboisterous-aardwolf-wordpress Pending default 2mdata-boisterous-aardwolf-mariadb-0 Pending default 2m购买名称为boisterous-aardwolf-wordpress、data-boisterous-aardwolf-mariadb-0 的PVC:

以boisterous-aardwolf-wordpress为例,购买boisterous-aardwolf-wordpress.yaml文件内容分别如下:

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: boisterous-aardwolf-wordpressspec: accessModes: - ReadWriteOnce storageClassName: jdcloud-ssd resources: requests: storage: 20Gi删除原有的boisterous-aardwolf-wordpress:

kubectl delete pvc boisterous-aardwolf-wordpress
执行购买:
kubectl create -f boisterous-aardwolf-wordpress.yaml
按照该方式购买命名为data-boisterous-aardwolf-mariadb-0的PVC。

稍等几分钟,执行以下命令:
kubectl get pod
输出以下信息,为running状态,表示部署成功。 NAME READY STATUS RESTARTS AGEboisterous-aardwolf-mariadb-0 1/1 Running 0 57mboisterous-aardwolf-wordpress-7b94db45db-s4g8f 1/1 Running 0 57m- 执行以下命令

kubectl get svc
输出以下信息

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEboisterous-aardwolf-mariadb ClusterIP 192.168.57.31 none 3306/TCP 1hboisterous-aardwolf-wordpress LoadBalancer 192.168.60.113 114.67.94.77 80:31860/TCP,443:30346/TCP 1hkubernetes ClusterIP 192.168.56.1 none 443/TCP 2d- 其中114.67.94.77为外部访问IP,访问地址为:WordPress URL: http://114.67.94.77

显示以下信息:

WordPress Admin URL: http://114.67.94.77/admin

用户名:user
密码:$(kubectl get secret --namespace default boisterous-aardwolf-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

删除应用,执行以下命令:
helm delete boisterous-aardwolf

例2:部署Nginx-Ingress
Ingress是Kubernetes集群对外暴露服务的方式之一,使用开源的反向代理负载均衡器来实现对外暴漏服务,如Nginx。它可以给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。
以下讲述如何通过Helm快速购买Nginx-Ingress:

下载chart,并解压缩 helm fetch stable/nginx-ingresstar -zxvf nginx-ingress-0.30.0.tgz修改values.yaml的以下内容,repository由k8s.gcr.io/defaultbackend 修改为googlecontainer/defaultbackend-amd64 name: default-backend image: repository: googlecontainer/defaultbackend-amd64 tag: "1.4" pullPolicy: IfNotPresent- 执行以下命名,进行安装:

helm install nginx-ingress
输出以下信息:

NAME: fallacious-lionfishLAST DEPLOYED: Fri Nov 9 14:26:00 2018NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:== v1beta1/ClusterRoleBindingNAME AGEfallacious-lionfish-nginx-ingress 1s...- 检查执行状态:

helm install nginx-ingress
输出以下信息,状态为running,表示部署成功:

NAME READY STATUS RESTARTS AGEfallacious-lionfish-nginx-ingress-controller-6499bbb6c5-76t9v 1/1 Running 0 8mfallacious-lionfish-nginx-ingress-default-backend-674cb8879rds9 1/1 Running 0 8m- 执行以下命令:

kubectl get service
输出以下信息:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEfallacious-lionfish-nginx-ingress-controller LoadBalancer 192.168.59.194 114.67.95.42 80:30296/TCP,443:30161/TCP 9mfallacious-lionfish-nginx-ingress-default-backend ClusterIP 192.168.61.72 none 80/TCP 9mkubernetes ClusterIP 192.168.56.1 none 443/TCP 2d- 删除应用,执行以下命令:

helm delete fallacious-lionfish

关于Helm的详细内容,还请Helm官网Kubeapps Hub作为公共的chart应用仓库,目前以chart的格式提供Nginx、Jenkins、Redis等常用应用