在Kubernetes上部署Spinnaker


【编者的话】这片文章在上一篇的基础上着重介绍了如何在minikube环境下部署一个Spinnaker,Spinnaker的安装过程稍显曲折,主要是因为它的组件比较多,有自动化安装工具,但需要“科学上网”。笔者也是最近在一个非常偶然的情况下听说的这个东西,其实最开始是想做一个MSP(cloud manage service provider)系统,后来发现这个正是我当时想要的。我认为随着国内外公有云的大行其道,很多中小规模的互联网公司已经不在考虑传统的运维模式了(我所谓的传统运维指的是:自己设置IDC机房,然后雇一票人从IaaS层开始,从准备机柜,物理机上线,安装OS,然后装OpenStack或者ESXi,再找个DBA去部署数据库等等……)Spinnaker的目标在于让用户部署与实际的IaaS层解耦,把你的一套系统部署到多个IaaS提供商上去(例如AWS,GCP或者国内的阿里云、腾讯云),甚至在它们之前做一个负载均衡,如果你的应用同时部署在两个提供商的IaaS层上,除非你的应用本身不稳定,否则你服务HA的指标应该可以大大提高,因为两个IaaS同时挂掉的可能性实在太小了。

在上一片文章中, 我们介绍了如何让Spinnaker作为一个多云平台部署工具。这次我们将讲解如何在Kubernetes上创建一个Spinnaker,并且通过它部署一个应用程序。

在这篇文章中,我将带你一起在Minikube上创建并配置一个Spinnaker。一旦它运行起来,我们就会部署一个容器化的应用程序。

Spinnaker经常被安装在以Ubuntu 14.04LTS为操作系统的虚拟机上。感谢Helm社区,让安装仅仅需要一条命令就可以完成。

安装并配置Minikube

Spinnaker是作为一个cloud-native、微服务的架构。它有一组资源密集型的容器。典型的Minikube安装不提供足够的能力来运行Spinnaker。我们会通过配置去Minikube,让它能去支撑起Spinnaker。

当然,你也可以在至少有4GB内存的Kubernetes集群节点上去安装Spinnaker。谷歌的KubernetesAzure的Kubernetes容器托管服务是此配置的理想选择。因为Minikube免费并且简单,所以我们用它去配置Spinnaker。当然这个环境不推荐用于生产。

在macOS中运行如下命令去安装Minikube:
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.24.1/minikube-darwin-amd64

$ chmod +x ./minikube 

$ sudo mv ./minikube /usr/local/bin/

我们还需要Kubectl的最新版去管理Kubernetes集群。你可以用下面的命令安装它:
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl

$ chmod +x ./kubectl

$ sudo mv ./kubectl /usr/local/bin/kubectl

当你把上面的完成了,下面就可以开始执行Minikube了。

首先,我们得确定运行Minikube的虚拟机至少有4GB内存和4 core CPU。可以用下面的命令设置:
$ minikube config set memory 4096

These changes will take effect upon a minikube delete and then a minikube start

$ minikube config set cpus 4

These changes will take effect upon a minikube delete and then a minikube start

如果你不想保存这个配置,你也可以用下面的命令启动Minikube:
$ minikube start --memory 4096 --cpus 4

Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Downloading Minikube ISO
140.01 MB / 140.01 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
148.25 MB / 148.25 MB [============================================] 100.00% 0s
0 B / 65 B [----------------------------------------------------------]   0.00%
65 B / 65 B [======================================================] 100.00% 0s

Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

当一个单个节点的Kubernetes集群启动完毕,安装结束。你可以看到上面的信息。如果这是在你的电脑上第一次运行Minikube,那么会在这个过程中下载ISO文件。
$ kubectl version

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.0", GitCommit:"0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", GitTreeState:"clean", BuildDate:"2017-11-29T22:43:34Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get cs

NAME                 STATUS    MESSAGE              ERROR

scheduler            Healthy   ok

controller-manager   Healthy   ok

etcd-0               Healthy   {"health": "true"} 

安装Helm

Helm让我们在Kubernetes上安装应用程序非常容易。每一个应用程序被打包成一个Chart,它是Helm部署应用的最小单位。所以在安装Spinnaker之前,我们还需要在Kubernetes上部署Helm。

下载最新版本的Helm并且把它放到bin目录下:
$ wget https://storage.googleapis.com/kubernetes-helm/helm-v2.7.2-darwin-amd64.tar.gz

--2018-01-03 10:55:06--  https://storage.googleapis.com/kubernetes-helm/helm-v2.7.2-darwin-amd64.tar.gz

Resolving storage.googleapis.com (storage.googleapis.com)... 172.217.31.208

Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.31.208|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 12091997 (12M) [application/x-tar]

Saving to: 'helm-v2.7.2-darwin-amd64.tar.gz'

helm-v2.7.2-darwin- 100%[===================>]  11.53M  3.10MB/s    in 3.8s

2018-01-03 10:55:11 (3.01 MB/s) - 'helm-v2.7.2-darwin-amd64.tar.gz' saved [12091997/12091997]

$ tar -zxvf helm-v2.7.2-darwin-amd64.tar.gz

x darwin-amd64/

x darwin-amd64/README.md

x darwin-amd64/LICENSE

x darwin-amd64/helm

$ chmod +x ./darwin-amd64/helm

$ mv ./darwin-amd64/helm /usr/local/bin/

我们现在初始化Helm,并验证一下安装的正确性。
$ helm init
Creating /Users/janakiramm/.helm
Creating /Users/janakiramm/.helm/repository
Creating /Users/janakiramm/.helm/repository/cache
Creating /Users/janakiramm/.helm/repository/local
Creating /Users/janakiramm/.helm/plugins
Creating /Users/janakiramm/.helm/starters
Creating /Users/janakiramm/.helm/cache/archive
Creating /Users/janakiramm/.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/janakiramm/.helm.

这个时候Tiller(也就是Helm的服务器端)就已经安装在你的Kubernetes集群上了。
$ 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和Tiller已经安装正确。这里,Tiller是以Kubernetes中一个Pod的形式运行的,服务暴露在kube-system这个namespace里。

安装Spinnaker

当你的Minikube和Helm已经能够正常运行的时候,我们就可以安装Spinnaker了。由于它在Helm的Chart里,我们可以通过下面的步骤来完成。

在我们部署Spinnaker之前,我们需要一个YAML格式的配置文件,它会包含了一些配置信息。可以从Spinnaker Helm Chart repository获得这个文件。
$ curl -Lo values.yaml https://raw.githubusercontent.com/kubernetes/charts/master/stable/spinnaker/values.yaml

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                             Dload  Upload   Total   Spent    Left  Speed

100  2950  100  2950    0     0   2950      0  0:00:01 --:--:--  0:00:01 10535

现在我们可以安装Spinnaker了。用下面的命令可以把它部署在我们的Kubernetes集群里:
$ helm install -n kubelive stable/spinnaker -f values.yaml --timeout 300  --version 0.3.5 --namespace spinnaker

这里的-f参数的意思是指出安装的配置文件。--timeout会让Helm在遇到错误的时候等待至少300秒再退出。这片文章中我们用的是0.3.5的版本,是用--version指定的。最后我们用--namespace指定了安装Spinnaker的namespace。

过了一会儿,我们应该可以看到下面的输出。
NAME:   kubelive

LAST DEPLOYED: Wed Jan  3 11:26:12 2018

NAMESPACE: spinnaker

STATUS: DEPLOYED

RESOURCES:

…..
NOTES:

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=kubelive-spinnaker" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward --namespace spinnaker $DECK_POD 9000

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

如果你遇到错误超时退出,可以用helm del --purge kubelive 命令去删除,并且重新运行安装命令。

所有的Spinnaker的相关组件都已经部署到了Spinnaker的namespace里了,我们可以用下面的命令去确认。
$  kubectl get pod --namespace=spinnaker

NAME                                              READY     STATUS    RESTARTS   AGE

kubelive-jenkins-67bb8f6b96-w5rdp                 1/1       Running   0          53m

kubelive-minio-5946fc9bcc-fcvv8                   1/1       Running   0          53m

kubelive-redis-7bb9d95468-kt2vq                   1/1       Running   1          53m

kubelive-spinnaker-clouddriver-6cd89c9bd5-8rwln   1/1       Running   1          53m

kubelive-spinnaker-deck-7846d6497-bjg7b           1/1       Running   0          53m

kubelive-spinnaker-echo-6fd649469d-2pxzd          1/1       Running   1          53m

kubelive-spinnaker-front50-85dd9fd58c-ktj6j       1/1       Running   1          53m

kubelive-spinnaker-gate-5868d9f8ff-hjpvg          1/1       Running   0         53m

kubelive-spinnaker-igor-fdbdcc9c8-hldsk           1/1       Running   0          53m

kubelive-spinnaker-orca-dd79c8bc7-xmwc7           1/1       Running   0          53m

kubelive-spinnaker-rosco-7b9f77b5bb-drxhs         1/1       Running   0          53m

在我们通过浏览器访问Spinnaker之前,我们需要用下面命令打开端口转发功能。也就是说这个命令将会把Spinnaker Web UI的端口映射到主机的端口上。
$ export DECK_POD=$(kubectl get pods --namespace spinnaker -l "component=deck,app=kubelive-spinnaker" -o jsonpath="{.items[0].metadata.name}")

$ kubectl port-forward --namespace spinnaker $DECK_POD 9000

01.png

现在可以通过http://localhost:9000去访问Spinnaker了。

通过Spinnaker去部署一个容器化的应用

现在我们可以通过部署一个Nginx Web服务器去熟悉Spinnaker的概念和术语。

首先在右上角的“操作”菜单下单击“Create Application”来创建应用程序。“application”是一个资源的逻辑集合,包括负载均衡、安全组、服务组和集群。
02.png

现在我们在这个application里去创建一个负载均衡器。单击菜单顶部的"Load Balancer",并且点击“Create Load Balancer” 按钮。
03.png

04.png

当你创建了一个新的负载均衡器,输入prod作为堆栈的名字。80端口作为Target Port,并且选择NodePort类型,点击Create按钮。
05.png

Clusters里,选择Create Server Group
06.png

在下拉框里选择nginx:latest作为容器。选择nginx-prod作为负载均衡器,输入10作为副本数。
07.png

Container设置里,选择Probes去创建Readiness ProbeLiveness Probe。最后点击Create按钮。
08.png

当这个实例在Server Group里状态变成可用,如果是红色则代表这个实例还是不可能的状态。
09.png

10.png

切换到终端,并且运行下面命令可以得到服务的NodePort。
$ kubectl get svc

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE

kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        50m

nginx-prod   NodePort    10.99.164.47   <none>        80:31728/TCP   18m

这个负载均衡器已经被Spinnaker创建好,并且通过Kubernetes的NodePort对外提供访问。我们现在可以直接通过Minikube的命令访问了。
$ minikube service nginx-prod

Opening kubernetes service default/nginx-prod in default browser...

11.png

运行kubectl get pods可以显示一共有10个Nginx的Pod被创建出来了。
$ kubectl get pods

NAME                    READY     STATUS    RESTARTS   AGE

nginx-prod-v000-6m642   1/1       Running   0          9m

nginx-prod-v000-9kxtv   1/1       Running   0          9m

nginx-prod-v000-bpzw4   1/1       Running   0          9m

nginx-prod-v000-f87gn   1/1       Running   0          9m

nginx-prod-v000-h629g   1/1       Running   0          9m

nginx-prod-v000-hkhjc   1/1       Running   0          9m

nginx-prod-v000-jhnv2   1/1       Running   0          9m

nginx-prod-v000-jmkgx   1/1       Running   0          9m

nginx-prod-v000-s59pm   1/1       Running   0          9m

nginx-prod-v000-ssz85   1/1       Running   0          9m

在Spinnaker的仪表板扩展服务组(Server Group)一样相同。
12.png

这篇文章涵盖了在开发环境中,使用和运行Spinnaker的所有步骤。在本系列的下一篇文章里,我们会用Spinnaker去建立一个end-to-end的CI/CD pipeline环境,然后去发布一个应用的蓝绿部署。敬请关注!

更多关于Spinnaker的文章可以在这里找到。

原文连接:Get Started with Spinnaker on Kubernetes(翻译:王晓轩)

0 个评论

要回复文章请先登录注册