K8S-Helm


前言:

随着容器技术和微服务架构逐渐被企业接受,在kubernetes上已经可以便捷的部署服务了,但对于复杂的应用或者中间件系统,在k8s上部署并非易事,通常需要研究docker镜像的运行需求,环境变量等内容,为容器配置依赖的存储、网络等资源,并设计编写deployment,configmap,service,volume,ingress等yaml文件,再将其一次提交给kubernetes管理部署。总之,微服务架构和容器化给复杂应用的部署和管理都带来了很大的挑战。

Helm用于需要在kubernetes部署的复杂应用进行定义,安装和更新,Helm将kubernetes的yaml资源进行打包为chart,而chart被保存到chart 仓库,由chart仓库存储,分发和共享;

Herlm支持应用的chart版本管理,简化了kubernetes用用部署的应用定义,打包和部署,更新,删除和回滚等操作。

Helm主要包含以下组件:

Chart:Helm软件包,包含一个用用所需资源对象的YAML文件,通常以tar.gz压缩包提供,也可以是文件夹形式。

Repository(仓库):用于存放和共享chart的仓库。

config(配置数据):部署时设置到chart中的配置数据。

release:基于chart和config部署到kubernetes集群中运行的一个实例,一个chart可以被部署多次,每次的release不同。

基于Helm的工作流程如下:

1.  开发人员将开发好的chart上传到chart仓库。

2.  运维人员基于chart的定义,设置必要的配置数据(configmap),使用Helm命令行工具将应用一键部署到kubernetes集群中,以release概念管理后续的更新,回滚等。

3.  chart仓库中的chart可以用于共享和开发。

部署

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
$ tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
$ cd linux-amd64/
$ cp helm /usr/local/bin/

查看clusterrole

helm]# kubectl  get clusterrole
NAME                                                                   AGE
admin                                                                  5d3h
cluster-admin                                                          5d3h
edit                                                                   5d3h
flannel                                                                5d3h
...

为了安装服务端 tiller,还需要在这台机器上配置好 kubectl 工具和 kubeconfig 文件,确保 kubectl 工具可以在这台机器上访问 apiserver 且正常使用。 这里的 node1 节点以及配置好了 kubectl

 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。 详细内容可以查看helm文档中的 [Role-based Access Control](https://docs.helm.sh/using_helm/#role-based-access-control)。 这里简单起见直接分配 cluster- admin 这个集群内置的 ClusterRole 给它。

创建 rbac-config.yaml 文件:

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

 创建

kubectl create -f rbac-config.yaml 
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

 helm初始化

helm init --service-account tiller --skip-refresh

 tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下

kubectl get pod -n kube-system -l app=helm
tiller-deploy-c4fd4cd68-dwkhv   1/1     Running   0          83s

查看版本

helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

 添加阿里云的repo源

[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts            //添加阿里云的repo源

 安装指定的mysql软件包,并命名为mysql

helm install stable/mysql -n mysql

  查看当前安装的Chart包

helm list 

  查看mysql的状态信息

helm status mysql

helm 其他常用命令

helm ls   //列出已经部署的 Release
helm status RELEASE_NAME   //查询一个特定的 Release 的状态
helm delete cautious-shrimp   //移除所有与这个 Release 相关的 Kubernetes 资源
helm rollback RELEASE_NAME  REVISION_NUMBER   //回滚到指定版本
helm rollback cautious-shrimp   1
helm search mysql         //查看与mysql相关的chart包
helm fetch stable/mysql            //将mysql软件包下载到本地
helm inspect stable/mysql       //查看该软件包的详细信息
helm delete --purge  mysql       //删除mysql,并将本地的缓存也进行删除
helm repo update              //更新repo仓库资源
helm create helm_charts       //创建一个chart,名称为helm_charts
cd helm_charts/ && helm lint       //测试charts语法
helm package helm_charts           //打包charts
helm template helm_charts-0.1.0.tgz       //查看该软件包生成的yaml文件

配置体现在配置文件 values.yaml

cat <<'EOF' > ./values.yaml
image:
  repository: gcr.io/google-samples/node-hello
  tag: '1.0'
EOF

这个文件中定义的值,在模板文件中可以通过 .VAlues对象访问到

cat <<'EOF' > ./templates/deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - name: hello-world
          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}    //调用values.yml的image.repository与tag
          ports:
            - containerPort: 8080
              protocol: TCP
EOF

在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉

升级版本

helm install --set image.tag='v2' .

升级版本

helm upgrade  -f values.yaml test .

Debug

使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。
使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署

helm install . --dry-run --debug --set image.tag=latest
k8s