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

在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)

分享創造快樂