使用helm部署k8s应用

0 阅读

Helm是k8s上的包管理工具,扮演centos中yum一样的角色,使得普通用户使用简单的一条指令就可以在k8s上安装应用,而无需编写复杂的yml文件,和k8s类似,在国内环境安装和部署Helm会遇到一点麻烦,本文提供了在国内环境安装和使用Helm的方法。文中的步骤在k8s v1.11.2和helm v2.10.0进行验证。

1. 搭建k8s集群

参考《在国内使用kubeadm搭建k8s集群》,搭建一个基于coreos的k8s集群。

2. 安装Helm

Helm是一个C/S应用,包括了客户端和服务器端,其中客户端提供了helm命令,接受用户指令,而服务器端是一个名为tiller的服务,负责调用k8s的操作实现对k8s的管理。该服务同样以容器的形式部署在k8s中。

2.1 安装Helm客户端

helm客户端只有一个可执行文件,安装非常简单,可使用以下指令直接下载:

# HELM_VERSION=v2.10.0
# curl -L https://storage.googleapis.com/kubernetes-helm/helm-${HELM_VERSION}-linux-amd64.tar.gz | tar -C /opt/bin -xz
# ln -s /opt/bin/linux-amd64/helm /opt/bin/helm

但是上述官方文档中的链接在国内无法访问,因此可用以下链接代替:

# curl -L http://lprincewhn.github.io/assets/images/helm-v2.10.0-linux-amd64.tar.gz | tar -C /opt/bin -xz

2.2 创建ServiceAccount

创建以下ServiceAccount,tiller将使用这个ServiceAccount管理k8s集群。

# cat > tiller-sa.yml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: tiller-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: ""
EOF
# kubectl apply -f tiller-sa.yml

2.3 初始化helm并启动tiller

# helm init --upgrade --service-account tiller --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.10.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

参数说明:

  • –service-account: 之前创建的ServiceAccount,赋予tiller权限管理k8s集群。
  • –tiller-image: tiller的镜像下载地址,默认的地址在国内无法访问,因此需要使用阿里云镜像地址。
  • –stable-repo-url: stable仓库地址,默认是https://kubernetes-charts.storage.googleapis.com,在国内无法访问,因此需要使用阿里云仓库地址。

输出结果显示:

  • Helm默认添加stable和local两个仓库,其中stable是参数–stable-repo-url指定的远程仓库,local是本地仓库。
Creating /root/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /root/.helm.
  • Tiller被自动安装到k8s集群中。
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

3. 安装Chart

Helm使用Chart和Release两个概念对应用进行管理:

  • Chart是一个压缩包文件,其中除了Chart的一些基本信息之外,最重要的内容是定义了一系列k8s资源的template,安装Chart过程中,这些template通过参数填充生成k8s资源的yml定义文件,然后tiller将调用k8s的操作创建这些资源。
  • Release是已经安装完成的Chart应用,每个Chart可以安装多次,比如在k8s集群中运行两个mysql数据库实例,这两个实例完全独立,并且可以使用不同的参数进行安装。安装Chart其实就是创建Release。

Chart本身提供了安装时的默认参数,直接即可,如果需要修改参数,则需要修改Chart中的values.yml文件,再用修改后的文件安装。可通过helm inspect values指令下载values.yml文件到本地然后进行修改。如:

# helm inspect values stable/mariadb > mariadb.yml
# vi mariadb.yml

测试环境下可对mariadb/values.yml进行以下修改:

  1. 可修改persistence.enable为false,避免使用pv存储。
  2. resources.requests.cpu和resources.requests.memory适当改小。

安装Chart:

# helm install -f mariadb.yml stable/mariadb

安装指令的输出内容分3部分:

  • 第一部分是一些基本信息,NAME为Release的名字,可以通过–name参数指定,如果不指定,则会随机生成一个,如例子中的lopsided-salamander。
NAME:   lopsided-salamander
LAST DEPLOYED: Thu Sep 27 10:38:53 2018
NAMESPACE: default
STATUS: DEPLOYED
  • 第二部分是创建的资源,可以看到mariadb创建了一个Pod,一个Secrect,两个ConfigMap,一个Service,一个Deloyment,如果这些指令都要通过kubectl手动创建的话,那需要编写复杂的yml文件,而Chart模板帮我们把这些yml文件都定义好了。
RESOURCES:
==> v1/Pod(related)
NAME                                          READY  STATUS    RESTARTS  AGE
lopsided-salamander-mariadb-55c5656cb5-l4nv5  0/1    Init:0/1  0         0s

==> v1/Secret
NAME                         TYPE    DATA  AGE
lopsided-salamander-mariadb  Opaque  2     0s

==> v1/ConfigMap
NAME                               DATA  AGE
lopsided-salamander-mariadb        1     0s
lopsided-salamander-mariadb-tests  1     0s

==> v1/Service
NAME                         TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)   AGE
lopsided-salamander-mariadb  ClusterIP  10.97.240.26  <none>       3306/TCP  0s

==> v1beta1/Deployment
NAME                         DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
lopsided-salamander-mariadb  1        1        1           0          0s
  • 第三部分是Chart的使用说明,上述mariadb这个Chart在这部分告诉了我们如何去获取数据库的密码并连接数据库。
NOTES:
MariaDB can be accessed via port 3306 on the following DNS name from within your cluster:
lopsided-salamander-mariadb.default.svc.cluster.local

To get the root password run:

    MARIADB_ROOT_PASSWORD=$(kubectl get secret --namespace default lopsided-salamander-mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)

To connect to your database:

1. Run a pod that you can use as a client:

    kubectl run lopsided-salamander-mariadb-client --rm --tty -i --env MARIADB_ROOT_PASSWORD=$MARIADB_ROOT_PASSWORD --image bitnami/mariadb --command -- bash

2. Connect using the mysql cli, then provide your password:
    mysql -h lopsided-salamander-mariadb -p$MARIADB_ROOT_PASSWORD

4. 其他命令

  • 重设helm,运行完后可用init指令重新初始化helm
    helm reset --remove-helm-home
    
  • 在命令行中指定参数
    helm install --name my-release --set Persistence.Size=1Gi,Master.ServiceType=NodePort stable/jenkins
    
  • 查看Release的参数和相关k8s资源
    helm get my-release
    
  • 删除Release
    helm delete --purge my-release
    
  • 查看仓库列表
    helm repo list
    
更新于

本文遵守 CC-BY-NC-4.0 许可协议。

Creative Commons License

欢迎转载,转载需注明出处,且禁止用于商业目的。

上篇在k8s中使用Ingress进行服务访问和负载均衡
下篇在国内使用kubeadm搭建k8s集群