- 後端App:
1. 完成後端App開發: 首先,寫一個簡單的Node.js restful API service,命名為index.js:
const express = require('express');
const app = express();
app.get('/', function (req, res) {
res.send('Vic’s test service!');
});
app.listen(7000, () => {
console.log('Listening on port 7000!');
});
2. 建立Docker Image:
寫一個Dockerfile 內容如下:
FROM node:8.9-alpine
RUN mkdir -p /test_service
WORKDIR /test_service
COPY index.js /test_service
RUN npm install express
EXPOSE 7000
CMD [ "node", "index.js" ]
將Dockerfile跟index.js放在同一個path:
接著執行Dockerfile build docker image:
$ docker build -t vic/test_service .
用指令確認 image 是否存在:
$ docker images |grep test_service
=> 用關鍵字找
$ docker images
=> 列出全部
3. 建立Deployment:
使用本機image 「vic/test_service」 建立 「test-service」 deployment:
$ kubectl create deployment test-service --image=vic/test_service
kubectl create deployment這個語法,加上之前提到的--image-pull-policy=Never來使用本機image,會發現根本沒有這個語法,因此先建立好deployment後再來修改,取得dashboard url:
$ minikube dashboard --url
瀏覽器打開dashboard,找到剛建立的Deployment來編輯:
原本imagePullPolicy是Always改為Never!
查詢剛剛建立的deployment:
$ kubectl get deployment test-service
可以看到pod也被建立上去了:
$ kubectl get pods
4. 建立Service:
使用 kubectl expose指令公開 Deployment,創建「test-service」 Service:
$ kubectl expose deployment test-service --port=7000 --target-port=7000
可以看到service已經建立上去了:
$ kubectl get services
- 前端App:
1. 完成前端App開發:
寫一個簡單的Node.js app,命名為index.js:
const express = require('express');
const app = express();
const unirest = require('unirest');
app.get('/testClient', function (req, res) {
unirest.get('http://test-service:7000').end(function(response) {
if (response.error) {
console.log('fail');
res.send('Call API fail');
}
else {
res.send(response.body);
}
});
});
app.listen(8000, () => {
console.log('Listening on port 8000!');
});
2. 建立Docker Image:
寫一個Dockerfile 內容如下:
FROM node:8.9-alpine
RUN mkdir -p /test_client
WORKDIR /test_client
COPY index.js /test_client
RUN npm install express
RUN npm install unirest
EXPOSE 8000
CMD [ "node", "index.js" ]
將Dockerfile跟index.js放在同一個path:
接著執行Dockerfile build docker image:
$ docker build -t vic/test_client .
3. 建立Deployment:
使用本機image 「vic/test_client」 建立 「test-client」 deployment:
$ kubectl create deployment test-client --image=vic/test_client
接著一樣用上述的方法,從dashboard修改imagePullPolicy為Never。 查詢剛剛建立的deployment:
$ kubectl get deployment test-client
可以看到pod也被建立上去了:
$ kubectl get pods
4. 建立Service:
使用 kubectl expose指令公開 Deployment,創建「test-client」 Service:
$ kubectl expose deployment test-client --port=8000 --target-port=8000
可以看到service已經建立上去了:
$ kubectl get services
5. 建立Ingress:
接著照著上篇的教學,啟用ingress(如果已經有做過上篇,應該已經enable過了):
$ minikube addons enable ingress
Ingress需要撰寫yaml檔來做設定,以 minikube 內建的 Nginx Ingress 為例,建立一個test-client-ingress.yaml:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-client-ing
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: test.client
http:
paths:
- path: /(.*|$)
backend:
serviceName: test-client
servicePort: 8000
其中host是對外的domain name,有點類似在設定apache的server name,設定好申請的domain即可從外部直接連線過來。 serviceName跟servicePort則填寫上面建立好的Service。
建立一個名為test-client-ing的Ingress:
$ kubectl apply -f test-client-ingress.yaml
查看Ingress:
$ kubectl get ingress
由於這只是範例,並不是真的有test.client這個domain name,因此為了模擬測試,可以在/etc/hosts中加入host ip mapping: