步步驚心:從頭部署服務到 Kubernetes(ㄧ)

從最簡單的服務部署開始

Duan Li
Brobridge - 寬橋微服務
6 min readMar 10, 2020

--

Photo by Christopher Burns on Unsplash

本文嘗試以程式開發人員的角度,提供一個最基本的開發、驗證以及部署到 kubernetes 的流程,以作為入手 kubernetes 的參考。

本文說明的開發環境是用 Mac OSX,不過應該只需要稍微調整就可以應用在 Linux 環境上。假設已經有 Docker 環境(目前版本是 19.03.6),本文會從建立本機的 kuberentes 環境開始,然後以 Node.js 程式為例,說明如何部署到 Kubernetes 上並進行驗證。

本文為了讓操作容易,能以指令完成的步驟,就會盡量以指令來進行。

在本機安裝你的第一個 Kubernetes 實驗環境

在本機建構一個 Kubernetes Cluster 有許多選擇,如 minikube、kind 或 microk8s 等等,這邊就選一個最常看到也好安裝的 minikube 來使用:

brew install minikube
minikube start

會開始安裝一些套件後開始建立 Kubernetes Cluster ,目前版本為 1.17.3。安裝 kubectl 並以一些簡單的指令來查看 minikube 這個 Kubernetes Cluster。

kubernetes 官網可以看到安裝 kubectl 的方式:

$ 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
$ kubectl version --client

可以看到目前取得的 kubectl 版本也是 1.17.3,來下一些指令試看看

$ kubectl cluster-info
$ kubectl get nodes
$ kubectl get pods -A

上述指令是查看 kubernetes 一些基本資訊,只要沒有傳回錯誤之類的訊息就可以繼續進行了。

寫一個測試用的服務

環境部署好之後,馬上開始寫個 Node.js 版本的 hello world 程式(index.js):

const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});

這是一個會聽 port 3000 的 hello world,在本機執行並測試應該沒什麼問題,你可以用下列命令執行它:

$ node index.js

撰寫 Dockerfile 以容器化

接下來是稍微比較複雜一點的部分,把我們所寫的程式打包成容器 image。實際流程上就是寫一個類似描述檔的 Dockerfile,然後用 docker 指令把上面那隻程式依照 Dockerfile 包裝成容器。

為方便入門,這邊的 Dockerfile 內容也盡量簡化:

FROM node:8.9-alpineRUN mkdir -p /app
WORKDIR /app
COPY index.js /app
RUN npm install express
EXPOSE 3000CMD [ "node", "index.js" ]

使用 Docker 打包應用程式

到這裡為止,你的目錄應該有這兩隻檔案:

  • index.js
  • Dockerfile

接著,打包成 image,這邊替 image 取名時,因為考慮之後會把 image 放到 dockerhub 上,所以用 [username]/[image name] 這樣的格式:

$ docker build -t duanli/hello-node .

如果沒有出現錯誤的話,可以用指令確認一下 container image 存在:

$ docker images |grep hello-nodeduanli/hello-node  latest  0715233fb703  6 minutes ago  71.3MB

執行看看我們的 image,並且用 curl 指令確認,確認沒問題後再移除:

$ docker run --name hellonode --rm -d -p 3000:3000 duanli/hello-node
$ curl localhost:3000
Hello World!
$ docker stop hellonode

到這裡,我們已經得到一個可以運作的容器映像檔(Container image),接下來就要準備將 image 部署到容器平台之上。

部署到容器平台

接下來是主角了,要把 image 部署到 minikube。雖然 image 和 Kubernetes 都是在本機,但是 Kubernetes 要取得 image ,需要透過所謂的 image repository,例如前面提到的 DockerHub。

不過為了簡化流程,這邊用 minikube 提供的技巧,以及調整 kubectl 參數,讓 minikube 可以用本機上的 image 來部署:

$ eval $(minikube docker-env)
$ kubectl run hellonode --image=duanli/hello-node --restart=Never --image-pull-policy=Never
$ kubect get pods
NAME READY STATUS RESTARTS AGE
hellonode 1/1 Running 0 3s

接下來驗證看看:

$ POD=$(kubectl get pods hellonode -o wide -o custom-columns=IP:status.podIP --no-headers)
$ minikube ssh curl $POD:3000
Hello World!

到目前為止,完成了最最最簡單的 kubernetes 部署。這系列後續的部分,會繼續以開發者角度,調整一些步驟和方式,讓開發者熟悉部署到 Kubernetes 的方式和一些值得注意的地方。

下一篇>>

--

--

Duan Li
Brobridge - 寬橋微服務

All we do crumbles to the ground, though we refuse to see, dust in the wind, all we are is dust in the wind