Kubernetes 集群中使用 Helm 搭建 Spinnaker 平台

1、Helm 介绍

Helm 是一个管理 Kubernetes Charts 的工具,Charts 可以理解为预先配置的 Kubernetes 资源包,通过 Helm 可以轻松的安装和管理 Kubernetes 应用,类似我们平时使用的 apt、yum、homebrew 工具。Helm 包含两部分:客户端 Helm 和服务端 Tiller,服务端 Tiller 运行在 Kubernetes 集群内部,作为一个代理 Pod 管理安装我们的 Charts。 而 Charts 配置至少需要两样:一是 Package 描述文件(Chart.yaml),主要用来针对该资源包进行一些必要的说明信息。二是一个或多个包含应用需要安装的 Kubernetes 清单文件的模板文件。

2、环境、软件准备

上一篇文章 初试 Netflix 开源持续云交付平台 Spinnaker 中,我安装的是 Development Spinnaker,安装过程比较繁琐,而且没有跟 Kubernetes 集群集成起来,只能演示其部署管理功能中的 Pipeline 功能,而 Spinnaker 的另一个核心内容集群管理功能没法操作。本次我将实际操作演示如何在 Kubernetes 集群中安装 Spinnaker,后续演示如何使用 Spinnaker 执行 deploy 和 scale 一个应用到 Kubernetes 集群中。本次演示环境,我是在本机 MAC OS 上操作,以下是安装的软件及版本:

  • Docker: version 17.09.0-ce
  • Oracle VirtualBox: version 5.1.20 r114628 (Qt5.6.2)
  • Minikube: version v0.22.2
  • Helm: version v2.8.0
  • Kuberctl:
    • Client Version: v1.8.1
    • Server Version: v1.7.5

注意:这里 Kubernetes 集群搭建我使用 Minikube 来完成,Minikube 启动的单节点 k8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。k8s 运行底层使用 Docker 容器,所以本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox 的安装过程,着重介绍下 Minikube、Kuberctl 和 Helm 的安装。

3、安装并配置 Minikube

之前文章 初试 minikube 本地部署运行 kubernetes 实例 中,我有详细介绍 Minikube 以及 kubectl 安装,这里我再次简单描述一下,有一点点要注意的地方。

首先我们需要安装 Minikube 到本机 MacOS 上,具体操作命令如下:

# 安装指定版本,例如:v0.22.3
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.22.3/minikube-darwin-amd64
2、赋二进制文件执行权限
$ chmod +x minikube
3、将二进制文件移到 PATH 中 
$ sudo mv minikube /usr/local/bin/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其次我们还需要 kubectl 来管理 Kubernetes 集群,具体操作命令如下:

1、安装最新版
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
2、赋二进制文件执行权限
chmod +x ./kubectl
3、将二进制文件移到 PATH 中
sudo mv ./kubectl /usr/local/bin/kubectl
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当然,针对我们 MacOS 系统,可以使用 Homebrew 工具执行 brew install kubectl 命令安装即可。以上都安装完毕后,就可以启动 Minikube 了。不过在启动之前,还需要配置一下,因为应用配置的需要,我们要保证 Minikube VM 至少分配 4G 内存和 4核 CPU,可以通过以下命令行操作:

# 设置内存大小
$ minikube config set memory 4096
# 设置 CPU 核数
$ minikube config set cpus 4
  • 1
  • 2
  • 3
  • 4

设置完成后,就可以执行 minikube start 操作了。当然如果觉得这样比较麻烦,我们也可以在执行 minikube start 命令时,指定参数配置也可以。

$ minikube start --memory 4096 --cpus 4
Starting local Kubernetes v1.7.5 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

此时,去 VirtualBox 界面可以看到 Minikube 虚拟机已经成功启动了。我们也可以通过命令行查看一下集群状态。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.1", GitCommit:"f38e43b221d08850172a9a4ea785a86a3ffa3b3a", GitTreeState:"clean", BuildDate:"2017-10-12T00:44:36Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5", GitCommit:"17d7182a7ccbb167074be7a87f0a68bd00d58d97", GitTreeState:"clean", BuildDate:"2017-09-18T20:30:29Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY     STATUS    RESTARTS   AGE
default       hello-minikube-2754686071-0g6h3   1/1       Running   1          1d
kube-system   kube-addon-manager-minikube       1/1       Running   1          1d
kube-system   kube-dns-910330662-04l0k          3/3       Running   3          1d
kube-system   kubernetes-dashboard-2lvgh        1/1       Running   1          1d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这里要提醒一下,如果是第一次启动 Minikube,很有可能因为网络的问题,下载国外镜像失败导致启动服务失败,参照上边文章中提到的解决办法,替代需要翻墙下载的 images 即可。我这里是已经替换完毕,并且是启动过一次以后的输出日志。这里我贴一下我替换的 images ,注意:直接在当前窗口上执行 docker images 是不会列举出来 Minikube 虚拟机内部镜像列表的,需要通过命令设置 Minikube 虚拟机的 Docker 环境变量。

$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/wanyang3/.minikube/certs"
export DOCKER_API_VERSION="1.23"
# Run this command to configure your shell:
# eval $(minikube docker-env)

# 设置 Docker 环境变量
$ eval $(minikube docker-env)

$ docker images
REPOSITORY                                             TAG                            IMAGE ID            CREATED             SIZE
gcr.io/google-containers/kube-addon-manager            v6.4-beta.2                    51a9cd46a30c        2 months ago        79.2MB
gcr.io/google_containers/kubernetes-dashboard-amd64    v1.6.3                         4da5a945ae40        4 months ago        88.9MB
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64   1.14.4                         dbe106a365a5        6 months ago        41.4MB
gcr.io/google_containers/k8s-dns-sidecar-amd64         1.14.4                         db6d003fad04        6 months ago        41.8MB
gcr.io/google_containers/k8s-dns-kube-dns-amd64        1.14.4                         a8e00546bcf3        8 months ago        49.4MB
gcr.io/google_containers/pause-amd64                   3.0                            99e59f495ffa        22 months ago       747kB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

4、安装并初始化 Helm

好了,Kubernetes 集群有了,在正式安装 Spinnaker 之前,我们需要安装 Helm 客户端到本地,同时安装服务端 Tiller 到 Kubernetes 中。Helm 安装方式有很多种,这里我就针对本机 MacOS 系统用两种方式安装一下。

方式一:下载最新版 release 版 Helm 二进制码安装。

$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.8.0-darwin-amd64.tar.gz
$ tar -zxvf helm-v2.7.2-darwin-amd64.tar.gz
$ chmod +x ./darwin-amd64/helm
$ mv ./darwin-amd64/helm /usr/local/bin/
  • 1
  • 2
  • 3
  • 4

方式二:使用 Homebrew 安装。

$ brew install kubernetes-helm
  • 1

接下来,我们需要初始化并验证 Helm 了。

$ helm init
Creating /Users/wanyang3/.helm
Creating /Users/wanyang3/.helm/repository
Creating /Users/wanyang3/.helm/repository/cache
Creating /Users/wanyang3/.helm/repository/local
Creating /Users/wanyang3/.helm/plugins
Creating /Users/wanyang3/.helm/starters
Creating /Users/wanyang3/.helm/cache/archive
Creating /Users/wanyang3/.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 /Users/wanyang3/.helm.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

稍等一会,你就会发现服务端 Tiller 已经安装到我们的 Minikube 集群中了,并且作为Kubernetes Pod 服务运行在 kube-system 的 namespace 中.

$ helm version
Client: &version.Version{SemVer:"v2.8.0", GitCommit:"14af25f1de6832228539259b821949d20069a222", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.0", GitCommit:"14af25f1de6832228539259b821949d20069a222", GitTreeState:"clean"}

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY     STATUS    RESTARTS   AGE
default       hello-minikube-2754686071-0g6h3   1/1       Running   1          1d
kube-system   kube-addon-manager-minikube       1/1       Running   1          1d
kube-system   kube-dns-910330662-04l0k          3/3       Running   3          1d
kube-system   kubernetes-dashboard-2lvgh        1/1       Running   1          1d
kube-system   tiller-deploy-246345418-sqx12     1/1       Running   3          1d
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里值的一提的是,由于国内网络的问题,在安装 Tiller 的时候,需要下载镜像 gcr.io/kubernetes-helm/tiller:v2.8.0,很有可能会安装失败,这里我借鉴网上下载国外镜像的方式,通过 DockerHub 官网中 “Create Automated Build” 功能中的 “Create Auto-build Github”,关联自己的 GitHub 项目,可以选择对应的 dockerfile 文件,来执行自动构建,从而将生成的指定 Docker Image 镜像上传到 DockerHub 上。通过这个功能,我将 Tiller 需要的镜像上传到了我的 DockerHub 仓库里面去了,然后在本地 Minikube 中下载镜像,修改镜像名称即可,虽然麻烦了点,但是解决了我们不能下载国外镜像的难题。

$ docker pull huwanyang168/tiller:v2.8.0
$ docker tag huwanyang168/tiller:v2.8.0 gcr.io/kubernetes-helm/tiller:v2.8.0
  • 1
  • 2

执行上述操作后,再执行 helm init 命令,就可以避开镜像下载不到的问题,从而完成 Tiller 的安装和启动。如果 Tiller 安装失败,通过 helm version 命令会提示连接不到 Tiller。

5、使用 Helm 安装 Spinnaker

好了,现在 Minikube 和 Helm 已经运行起来了,接下来我们可以安装 Spinnaker 到 kubernetes 中了。在 Kubernetes Charts GitHub 中已经支持 Spinnaker Chart 方式安装,安装过程非常简单,就一条命令就可以完成整个安装。不过这里我要多说一点,就是 Kubernetes Chart 预配置资源包,上边说道 Chart 至少需要两样:一是 Package 描述文件(Chart.yaml),主要用来针对该资源包进行一些必要的说明信息。二是一个或多个包含应用需要安装的 Kubernetes 清单文件的模板文件。这里通过 Spinnaker Chart 来了解一下 Kubernetes Charts 吧。

我们先来看一下 Package 描述文件 Chart.yaml

apiVersion: v1
description: Open source, multi-cloud continuous delivery platform for releasing software changes with high velocity and confidence.
name: spinnaker
version: 0.3.15
appVersion: 1.1.0
home: http://spinnaker.io/
sources:
- https://github.com/spinnaker
- https://github.com/viglesiasce/images
icon: https://pbs.twimg.com/profile_images/669205226994319362/O7OjwPrh_400x400.png
maintainers:
- name: viglesiasce
  email: viglesias@google.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这个描述文件主要是针对 Spinnaker 资源包进行一些必要的说明,比如 description 描述信息、version 版本信息、home 官网地址等等。

然后我们再来看一下应用需要安装的 Kubernetes 清单文件的模板文件,一般这些模板文件会放到项目 templates 目录下。以下是 Spinnaker 需要安装的清单模板文件。

$ tree stable/spinnaker/templates/
stable/spinnaker/templates/
├── NOTES.txt
├── _helpers.tpl
├── configmap
│   ├── _jenkins-config.tpl
│   ├── jenkins-jobs.yaml
│   ├── s3-config.yaml
│   ├── spinnaker-config.yaml
│   └── test-config.yaml
├── deployments
│   ├── clouddriver.yaml
│   ├── deck.yaml
│   ├── echo.yaml
│   ├── front50.yaml
│   ├── gate.yaml
│   ├── igor.yaml
│   ├── orca.yaml
│   └── rosco.yaml
├── hooks
│   ├── create-bucket.yaml
│   ├── delete-jobs.yaml
│   ├── test.yaml
│   ├── upload-build-image.yaml
│   ├── upload-run-pipeline.yaml
│   └── upload-run-script.yaml
├── ingress
│   └── deck.yaml
├── secrets
│   ├── gcs.yaml
│   └── registry.yaml
└── svc
    ├── clouddriver.yaml
    ├── deck.yaml
    ├── echo.yaml
    ├── front50.yaml
    ├── gate.yaml
    ├── igor.yaml
    ├── orca.yaml
    └── rosco.yaml
  • 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

可以看到,这些清单模板文件,包括 configmap、deployments、ingress、secrets、service 等 Kubernetes 启动 Spinnaker 需要的一系列配置 yaml 文件。而且这些配置文件支持表达式,来生成满足特定条件的文件,配置更加灵活。我们以 ingress/deck.yaml 文件为例。

$ cat stable/spinnaker/templates/ingress/deck.yaml
{{- if .Values.deck.ingress.enabled }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
{{- if .Values.deck.ingress.annotations }}
  annotations:
{{ toYaml .Values.deck.ingress.annotations | indent 4 }}
{{- end }}
  name: {{ template "fullname" . }}
spec:
  rules:
  - host: {{ .Values.deck.host | quote }}
    http:
      paths:
      - path: /
        backend:
          serviceName: {{ template "fullname" . }}-deck
          servicePort: {{ .Values.deck.port }}
{{- if .Values.deck.ingress.tls }}
  tls:
{{ toYaml .Values.deck.ingress.tls | indent 4 }}
{{- end -}}
{{- end }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

配置文件中,加入了很多条件判断和变量取值,比如 {{- if .Values.deck.ingress.enabled }} 这里只有满足 Values.deck.ingress.enabled条件,也即是全局 Value 值配置中 deck.ingress 的值为 enabled 开启时,才会生成 deck.yaml 文件。{{ template "fullname" . }}{{ .Values.deck.port }} 这些是取对应的变量值,如果我们修改了全局的变量值,所有配置文件中针对该变量的取值都会跟着改变,非常方便生成配置。好了,扯了那么多,现在介入正题,使用 Helm 安装 Spinnaker 到 Kubernetes 中。

通过上一遍对 Spinnaker 的介绍,我们知道 Spinnaker 是由很多组件组织在一起的,需要有一个全局的配置文件 spinnaker.yml 来配置各个组件信息。这里也是一样,在开始安装之前,也需要一个 Yaml 配置文件(values.yaml)来配置各个组件信息。我们可以从 Spinnaker Helm Chart GitHub 中获取最新版下载到本地。

$ curl -Lo values.yaml https://raw.githubusercontent.com/kubernetes/charts/master/stable/spinnaker/values.yaml
  • 1

接下来就简单了,使用 Helm 执行一条命令即可完成安装。

$ helm install -n my-spinnaker stable/spinnaker -f values.yaml --timeout 3600  --version 0.3.5 --namespace spinnaker
  • 1

说明一下各参数:

  • -n my-spinnaker 指明安装的 Spinnaker 别名为 my-spinnaker,生成的 Pod 都会以该名称开头。
  • -f values.yaml 指明安装时使用 values.yaml 作为默认配置。
  • –timeout 3600 指明 Helm 安装等待超时时间为 3600s,因为这里需要下载一些镜像需要些时间,可以设置长一些,当然也可以直接不设置,就永远不超时。
  • –version 0.3.5 指明本次安装的 Spinnaker 版本为 0.3.5。
  • –namespace spinnaker 指明本次安装的 Chart 都将在名称为 spinnaker 的命名空间内,方便隔离区分其他应用。

执行完毕,稍等一会,就会发现控制台输出 Spinnaker 已经完成并启动完成啦!

NAME:   my-spinnaker
LAST DEPLOYED: Fri Mar  2 16:39:34 2018
NAMESPACE: spinnaker
STATUS: DEPLOYED

RESOURCES:
==> v1/PersistentVolumeClaim
NAME                  STATUS  VOLUME                                    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
my-spinnaker-jenkins  Bound   pvc-3be80026-1df5-11e8-9ce5-08002744a3f1  8Gi       RWO           standard      2m
my-spinnaker-minio    Bound   pvc-3be86272-1df5-11e8-9ce5-08002744a3f1  10Gi      RWO           standard      2m
my-spinnaker-redis    Bound   pvc-3be8f21b-1df5-11e8-9ce5-08002744a3f1  8Gi       RWO           standard      2m

==> v1/Service
NAME                                TYPE       CLUSTER-IP  EXTERNAL-IP  PORT(S)                      AGE
my-spinnaker-jenkins-agent          ClusterIP  10.0.0.241  <none>       50000/TCP                    2m
my-spinnaker-jenkins                ClusterIP  10.0.0.91   <none>       8080/TCP                     2m
my-spinnaker-minio-svc              ClusterIP  10.0.0.217  <none>       9000/TCP                     2m
my-spinnaker-redis                  ClusterIP  10.0.0.67   <none>       6379/TCP                     2m
my-spinnaker-spinnaker-clouddriver  ClusterIP  10.0.0.36   <none>       7002/TCP                     2m
my-spinnaker-spinnaker-deck         ClusterIP  10.0.0.254  <none>       9000/TCP                     2m
my-spinnaker-spinnaker-echo         ClusterIP  10.0.0.57   <none>       8089/TCP                     2m
my-spinnaker-spinnaker-front50      ClusterIP  10.0.0.21   <none>       8080/TCP                     2m
my-spinnaker-spinnaker-gate         ClusterIP  10.0.0.141  <none>       8084/TCP                     2m
my-spinnaker-spinnaker-igor         ClusterIP  10.0.0.247  <none>       8088/TCP,8080/TCP,50000/TCP  2m
my-spinnaker-spinnaker-orca         ClusterIP  10.0.0.88   <none>       8083/TCP                     2m
my-spinnaker-spinnaker-rosco        ClusterIP  10.0.0.44   <none>       8087/TCP                     2m

==> v1beta1/Deployment
NAME                                DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
my-spinnaker-jenkins                1        1        1           1          2m
my-spinnaker-minio                  1        1        1           1          2m
my-spinnaker-redis                  1        1        1           1          2m
my-spinnaker-spinnaker-clouddriver  1        1        1           1          2m
my-spinnaker-spinnaker-deck         1        1        1           1          2m
my-spinnaker-spinnaker-echo         1        1        1           1          2m
my-spinnaker-spinnaker-front50      1        1        1           1          2m
my-spinnaker-spinnaker-gate         1        1        1           1          2m
my-spinnaker-spinnaker-igor         1        1        1           1          2m
my-spinnaker-spinnaker-orca         1        1        1           1          2m
my-spinnaker-spinnaker-rosco        1        1        1           1          2m

==> v1/Pod(related)
NAME                                                 READY  STATUS   RESTARTS  AGE
my-spinnaker-jenkins-767424918-vtjfd                 1/1    Running  0         2m
my-spinnaker-minio-2647693359-zt1hv                  1/1    Running  0         2m
my-spinnaker-redis-1045542930-pqmf8                  1/1    Running  0         2m
my-spinnaker-spinnaker-clouddriver-3480110284-r1g09  1/1    Running  0         2m
my-spinnaker-spinnaker-deck-3148024512-lr5g5         1/1    Running  0         2m
my-spinnaker-spinnaker-echo-617171252-r9vzw          1/1    Running  0         2m
my-spinnaker-spinnaker-front50-1422959058-ccmp2      1/1    Running  0         2m
my-spinnaker-spinnaker-gate-2792520975-qfn1h         1/1    Running  1         2m
my-spinnaker-spinnaker-igor-1021674758-4pk44         1/1    Running  0         2m
my-spinnaker-spinnaker-orca-1766638633-tzk9v         1/1    Running  0         2m
my-spinnaker-spinnaker-rosco-4007146930-hcf4s        1/1    Running  0         2m

==> v1/Secret
NAME                             TYPE    DATA  AGE
my-spinnaker-jenkins             Opaque  2     2m
my-spinnaker-minio-user          Opaque  2     2m
my-spinnaker-redis               Opaque  1     2m
my-spinnaker-spinnaker-registry  Opaque  1     2m

==> v1/ConfigMap
NAME                                     DATA  AGE
my-spinnaker-jenkins-tests               1     2m
my-spinnaker-minio-config-cm             1     2m
my-spinnaker-jenkins                     3     2m
my-spinnaker-jenkins-jobs                3     2m
my-spinnaker-spinnaker-s3-config         1     2m
my-spinnaker-spinnaker-spinnaker-config  18    2m
my-spinnaker-spinnaker-tests             1     2m


NOTES:
1. You will need to create 2 port forwarding tunnels in order to access the Spinnaker UI:
  export DECK_POD=$(kubectl get pods --namespace spinnaker -l "component=deck,app=my-spinnaker-spinnaker" -o jsonpath="{.items[0].metadata.name}")
  kubectl port-forward --namespace spinnaker $DECK_POD 9000

2. Visit the Spinnaker UI by opening your browser to: http://127.0.0.1:9000

For more info on the Kubernetes integration for Spinnaker, visit:
  http://www.spinnaker.io/docs/kubernetes-source-to-prod
  • 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
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

注意:如果安装过程中,出现超时或者其他问题导致安装失败,可以使用 helm delete --purge my-spinnaker 命令删除,重新执行安装命令。

此时,我们已经将 Spinnaker 各组件服务安装到 Kubernetes 集群的 spinnaker 命名空间内,通过 kubectl 命令可以查看服务运行情况。

$  kubectl get pod --namespace=spinnaker
NAME                                                 READY  STATUS   RESTARTS  AGE
my-spinnaker-jenkins-767424918-vtjfd                 1/1    Running  0         8m
my-spinnaker-minio-2647693359-zt1hv                  1/1    Running  0         8m
my-spinnaker-redis-1045542930-pqmf8                  1/1    Running  0         8m
my-spinnaker-spinnaker-clouddriver-3480110284-r1g09  1/1    Running  0         8m
my-spinnaker-spinnaker-deck-3148024512-lr5g5         1/1    Running  0         8m
my-spinnaker-spinnaker-echo-617171252-r9vzw          1/1    Running  0         8m
my-spinnaker-spinnaker-front50-1422959058-ccmp2      1/1    Running  0         8m
my-spinnaker-spinnaker-gate-2792520975-qfn1h         1/1    Running  1         8m
my-spinnaker-spinnaker-igor-1021674758-4pk44         1/1    Running  0         8m
my-spinnaker-spinnaker-orca-1766638633-tzk9v         1/1    Running  0         8m
my-spinnaker-spinnaker-rosco-4007146930-hcf4s        1/1    Running  0         8m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

不过,在我们从浏览器访问 Spinnaker Web 页面之前,还需要做最后一步操作,就是对 Spinnaker Web UI 做一下端口转发来暴漏服务到本机 host。

$ export DECK_POD=$(kubectl get pods --namespace spinnaker -l "component=deck,app=my-spinnaker-spinnaker" -o jsonpath="{.items[0].metadata.name}")
$ kubectl port-forward --namespace spinnaker $DECK_POD 9000
  • 1
  • 2

OK 现在就可以通过浏览器访问 http://127.0.0.1:9000 地址来打开 Spinnaker UI 页面啦!是不是跟之前 Development 安装的页面一样一样的。

这里还要提一下,第一次通过 Helm 安装 Spinnaker 可能会安装失败,因为国内网络的问题,安装过程中下载 Spinnaker 组件镜像失败(Spinnaker 组件镜像可以从 values.yaml 文件中找到)。此时,我们依旧可以使用上边提到的方式,通过 DockerHub 的 “Create Automated Build“ 功能提前下载好镜像,下边我提供一下我已经 Build 好的当前版本所需的各个组件镜像,以及 pull & tag 脚本。

#!/bin/bash

images=(
    spinnaker-clouddriver:0.5.0-72
    spinnaker-deck:1.3.0-72
    spinnaker-orca:0.5.0-72
    spinnaker-front50:0.4.1-72
    spinnaker-gate:0.5.0-72
    spinnaker-echo:0.4.0-72
    spinnaker-rosco:0.4.0-72
    spinnaker-igor:0.4.0-72)

for imageName in ${images[@]} ; do
    docker pull docker.io/huwanyang168/$imageName
    imageName_suffix=$(echo "${imageName}"| awk -F 'spinnaker-' '{print $2}')
    docker tag docker.io/huwanyang168/$imageName gcr.io/spinnaker-marketplace/$imageName_suffix 
    docker rmi docker.io/huwanyang168/$imageName
done

好了,到此 Kubernetes 集群中使用 Helm 搭建 Spinnaker 已经完成了,上一篇文章 初试 Netflix 开源持续云交付平台 Spinnaker 中由于没有集成 Kubernetes,所以 Spinnaker 另一个核心内容集群管理未涉及到,下一篇文章我会基于本次安装环境,介绍一下 Spinnaker 如何在 Kubernetes 集群中执行 Deploy 和 Scale,来展示 Spinnaker 集群管理中 Server Group(服务组)、Cluster(集群)、Applications(应用)、Load Balancer(负载均衡)等几个核心功能。

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券