Kubernetes 安装 Helm 并使用 Helm 安装 wordpress

Helm 简介

Helm 有两个重要的概念:chart 和 release。

chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。

release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

Kubernetes Helm 是一个管理预先配置 Kubernetes 资源包的工具,这里的资源在 Helm 中也被称作 Kubernetes charts。使用 Helm可以:

  • 查找并使用已经打包为 Kubernetes charts 的流行软件
  • 分享您自己的应用作为 Kubernetes charts
  • 为 Kubernetes 应用创建可重复执行的构建
  • 为您的 Kubernetes 清单文件提供更智能化的管理
  • 管理 Helm 软件包的发布

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示。 helm

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互。

安装和部署 Helm

安装 Helm 客户端

所有运行 kubectl 的节点均需要安装

1. 下载安装

1
2
3
4
5
6
7
# curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash

Downloading https://slug:-helm.storage.googleapis.com/helm-v2.12.1-linux-amd64.tar.gz
Preparing to install helm and tiller into /usr/local/bin
helm installed into /usr/local/bin/helm
tiller installed into /usr/local/bin/tiller
Run 'helm init' to configure helm.

2. 验证安装

1
2
3
4
# helm version

Client: &version.Version{SemVer:"v2.12.1", GitCommit:"02a47c7249b1fc6d8fd3b94e6b4babf9d818144e", GitTreeState:"clean"}
Error: could not find tiller

安装安装的版本为 2.12.1,tiller 服务器还没有安装所以有一个报错

3. 安装 helm 的 bash 命令补全脚本

helm 有很多子命令和参数,为了提高使用命令行的效率,通常建议安装 helm 的 bash 命令补全脚本。

1
# helm completion bash > .helmrc && echo "source .helmrc" >> .bashrc

重新登陆后,就能通过 TAB 自动补全 helm 命令的子命令和参数了。 bash

安装 Tiller 服务器

1. 导入 tiller 镜像

所有节点上面导入 tiller.tar,下载地址:tiller.tar

1
# docker load -i tiller.tar

2. 创建 helm 服务账号

创建 tiller-rbac-config.yaml 文件,加入以下内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# vim tiller-rbac-config.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

运行以下命令创建 tiller 服务账号

1
# kubectl apply -f tiller-rbac-config.yaml

3. 部署 tiller

Tiller 服务器安装非常简单,只需要执行 helm init,这里我们指定使用上一步创建的服务账号。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# helm init --service-account tiller

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://slug:-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.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

验证操作

1. 查看 tiller 状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# kubectl get pods --namespace kube-system 

NAME                                   READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-8zhr5               1/1     Running   1          5d16h
coredns-86c58d9df4-jqn7r               1/1     Running   1          5d16h
etcd-k8s-master                        1/1     Running   1          5d16h
kube-apiserver-k8s-master              1/1     Running   1          5d16h
kube-controller-manager-k8s-master     1/1     Running   1          5d16h
kube-flannel-ds-amd64-krf6t            1/1     Running   1          5d16h
kube-flannel-ds-amd64-tkftg            1/1     Running   1          5d16h
kube-flannel-ds-amd64-zxzld            1/1     Running   1          5d16h
kube-proxy-5znt7                       1/1     Running   1          5d16h
kube-proxy-gl9sl                       1/1     Running   1          5d16h
kube-proxy-q7j7m                       1/1     Running   1          5d16h
kube-scheduler-k8s-master              1/1     Running   1          5d16h
slug:-dashboard-57df4db6b-8b2l4   1/1     Running   0          16h
metrics-server-879f5ff6d-tpszf         1/1     Running   0          16h
tiller-deploy-6f8d4f6c9c-4h95z         1/1     Running   0          2m39s

可以看到 tiller 已经是运行状态。

2. 查看 helm 信息

1
2
3
4
# helm version

Client: &version.Version{SemVer:"v2.12.1", GitCommit:"02a47c7249b1fc6d8fd3b94e6b4babf9d818144e", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.1", GitCommit:"02a47c7249b1fc6d8fd3b94e6b4babf9d818144e", GitTreeState:"clean"}

使用 Helm 安装 wordpress

1. 搜索 chart

搜索 wordpress 的 charts

1
2
3
4
# helm search wordpress

NAME            	CHART VERSION	APP VERSION	DESCRIPTION                                             
stable/wordpress	5.0.3        	5.0.2      	Web publishing platform for building blogs and websites.

2. 查看 chart 的存储信息

创建 wordpress 的时候需要申请  PersistentVolumeClaim,由于我们的环境不支持动态申请所以需要手动创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# helm inspect value stable/wordpress

……
  ## MariaDB admin password
  ## ref: https://github.com/bitnami/bitnami-docker-mariadb/blob/master/README.md#setting-the-root-password-on-first-run
  ##
  # rootUser:
  #   password:

  ## Enable persistence using Persistent Volume Claims
  ## ref: http://slug:.io/docs/user-guide/persistent-volumes/
  ##
  master:
    persistence:
      enabled: true
      ## mariadb data Persistent Volume Storage Class
      ## If defined, storageClassName: <storageClass>
      ## If set to "-", storageClassName: "", which disables dynamic provisioning
      ## If undefined (the default) or set to null, no storageClassName spec is
      ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
      ##   GKE, AWS & OpenStack)
      ##
      # storageClass: "-"
      accessMode: ReadWriteOnce
      size: 8Gi
      
……

persistence:
  enabled: true
  ## wordpress data Persistent Volume Storage Class
  ## If defined, storageClassName: <storageClass>
  ## If set to "-", storageClassName: "", which disables dynamic provisioning
  ## If undefined (the default) or set to null, no storageClassName spec is
  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
  ##   GKE, AWS & OpenStack)
  ##
  # storageClass: "-"
  ##
  ## If you want to reuse an existing claim, you can pass the name of the PVC using
  ## the existingClaim variable
  # existingClaim: your-claim
  accessMode: ReadWriteOnce
  size: 10Gi

可以看到 wordpress 的 chart 需要两个 pv,分别用于 mariadb(8G) 和 wordpress(10G) 的数据存储。

3. 手动创建 chart 所需的 pv

创建 create-pv.yml 文件,输入以下内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# vim create-pv.yml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mariadb-pv
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  #storageClassName: nfs
  nfs:
    path: /nfsdata/mariadb-pv
    server: 172.20.6.116
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wordpress-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  #storageClassName: nfs
  nfs:
    path: /nfsdata/wordpress-pv
    server: 172.20.6.116

创建 pv

1
2
3
4
# kubectl apply -f create-pv.yml 

persistentvolume/mariadb-pv created
persistentvolume/wordpress-pv created

4. 安装 chart

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# helm install --name wordpress stable/wordpress

NAME:   wordpress                                  ---------①---------
LAST DEPLOYED: Fri Jan  4 10:32:57 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:                                         ---------②---------
==> v1beta1/Deployment
NAME                 DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
wordpress-wordpress  1        1        1           0          0s

==> v1beta1/StatefulSet
NAME               DESIRED  CURRENT  AGE
wordpress-mariadb  1        1        0s

==> v1/Pod(related)
NAME                                  READY  STATUS   RESTARTS  AGE
wordpress-wordpress-56794ff7b9-rf98x  0/1    Pending  0         0s
wordpress-mariadb-0                   0/1    Pending  0         0s

==> v1/Secret
NAME                 TYPE    DATA  AGE
wordpress-mariadb    Opaque  2     0s
wordpress-wordpress  Opaque  1     0s

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

==> v1/PersistentVolumeClaim
NAME                 STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
wordpress-wordpress  Pending  0s

RESOURCES:
==> v1/Service
NAME                 TYPE          CLUSTER-IP      EXTERNAL-IP  PORT(S)                     AGE
wordpress-mariadb    ClusterIP     10.100.218.132  <none>       3306/TCP                    0s
wordpress-wordpress  LoadBalancer  10.100.36.64    <pending>    80:31051/TCP,443:30169/TCP  0s


NOTES:                                             ---------③---------
1. Get the WordPress URL:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w wordpress-wordpress'
  export SERVICE_IP=$(kubectl get svc --namespace default wordpress-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
  echo "WordPress URL: http://$SERVICE_IP/"
  echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Login with the following credentials to see your blog

  echo Username: user
  echo Password: $(kubectl get secret --namespace default wordpress-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

输出分为 3 部分(上文输出结果中的①②③):

  • ① 本次部署 chart 的描述信息。包括 release 的名字(没有指定,则默认生成)。release 部署的 namespace,默认是 default。release的状态 DEPLOYED 表示已经将 chart 部署到集群。
  • ② release 包含的资源: Service、 Deployment、 Secret 等
  • ③ release 的使用方法

5. 访问 wordpress

使用 http://nodeip+service_port 访问wordpress,访问地址为:http://172.20.6.116:31051/ wordpress 其他信息,包括后台地址,管理员账号等信息可以参考release 的 NOTES 部分。

写在最后

Helm 的使用有点类似 ubuntu 的 apt 或者 RHEL 的 yum,极大的简化了部署一个应用的流程。对于使用者而言,使用 Helm 后不用需要了解 Kubernetes 的 yaml 语法并编写应用部署文件,也无需考虑应用的各种依赖,可以直接通过 Helm 下载并在 kubernetes 上安装需要的应用。 除此以外,Helm 还提供了 kubernetes 上的软件部署,删除,升级,回滚应用的强大功能。


参考文章

Helm 架构 - 每天5分钟玩转 Docker 容器技术(161) Helm Quickstart

一个默默无闻的工程师的日常
Built with Hugo
主题 StackJimmy 设计