歡迎光臨
每天分享高質量文章

在Kubernetes上部署Spinnaker

在上一篇文章[1]中, 我們介紹瞭如何讓Spinnaker作為一個多雲平臺部署工具。這次我們將講解如何在Kubernetes上建立一個Spinnaker,並且透過它部署一個應用程式。
在這篇文章中,我將帶你一起在Minikube上建立並配置一個Spinnaker。一旦它執行起來,我們就會部署一個容器化的應用程式。
Spinnaker經常被安裝在以Ubuntu 14.04LTS為作業系統的虛擬機器上。感謝Helm社群,讓安裝僅僅需要一條命令就可以完成。

安裝並配置Minikube

Spinnaker是作為一個cloud-native、微服務的架構。它有一組資源密集型的容器。典型的Minikube安裝不提供足夠的能力來執行Spinnaker。我們會透過配置去Minikube,讓它能去支撐起Spinnaker。
當然,你也可以在至少有4GB記憶體的Kubernetes叢集節點上去安裝Spinnaker。谷歌的Kubernetes和Azure的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[2]獲得這個檔案。
$ 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

現在可以透過http://localhost:9000去訪問Spinnaker了。

透過Spinnaker去部署一個容器化的應用

現在我們可以透過部署一個Nginx Web伺服器去熟悉Spinnaker的概念和術語。
首先在右上角的“操作”選單下單擊“Create Application”來建立應用程式。“application”是一個資源的邏輯集合,包括負載均衡、安全組、服務組和叢集。

現在我們在這個application裡去建立一個負載均衡器。單擊選單頂部的”Load Balancer”,並且點選“Create Load Balancer” 按鈕。

當你建立了一個新的負載均衡器,輸入prod作為堆疊的名字。80埠作為Target Port,並且選擇NodePort型別,點選Create按鈕。

Clusters裡,選擇Create Server Group

在下拉框裡選擇nginx:latest作為容器。選擇nginx-prod作為負載均衡器,輸入10作為副本數。

在Container設定裡,選擇Probes去建立Readiness Probe和Liveness Probe。最後點選Create按鈕。

當這個實體在Server Group裡狀態變成可用,如果是紅色則代表這個實體還是不可能的狀態。

切換到終端,並且執行下麵命令可以得到服務的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...

執行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)一樣相同。

這篇文章涵蓋了在開發環境中,使用和執行Spinnaker的所有步驟。在本系列的下一篇文章裡,我們會用Spinnaker去建立一個end-to-end的CI/CD pipeline環境,然後去釋出一個應用的藍綠部署。敬請關註!
相關連結:
  1. https://www.thenewstack.io/tag/Learn-Spinnaker

  2. https://github.com/kubernetes/charts/tree/master/stable/spinnaker

原文連線:https://thenewstack.io/getting-started-spinnaker-kubernetes/

Kubernetes 實戰培訓

本次培訓內容包括:Docker容器的原理與基本操作;容器網路與儲存解析;Kubernetes的架構與設計理念詳解;Kubernetes的資源物件使用說明;Kubernetes 中的開放介面CRI、CNI、CSI解析;Kubernetes監控、網路、日誌管理;容器應用的開發流程詳解等,點選識別下方二維碼加微信好友瞭解具體培訓內容

3月23日開始上課,點選閱讀原文連結即可報名。
贊(0)

分享創造快樂