K8S 內部App之間的連線

閱讀時間約 10 分鐘
假如公司團隊開發了一套前後端分離的系統,部署在不同的pod中,前端要如何存取後端service呢?
其實在K8S中,只要把前幾篇介紹的Service建立出來後,內部就可以互相存取了,不需要再透過ingress從外部存取,這是K8S自己內部的DNS機制呢!
以下直接透過範例來看。
先啟動minikube:
$ minikube start --driver=docker
$ eval $(minikube docker-env)
=> 這個指令一定要做,才能使用local image


- 後端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:
$ sudo nano /etc/hosts

- 測試結果:

使用瀏覽器打開前端網頁,測試前端打後端api的結果:
往上拉看前後端的code,在前端的testClient method裡面其實就是去打後端service,http://test-service:7000,其中test-service port 7000,就是後端建立出來的service。
也就是說,k8s內部app要連線,只要建立出service,就可以直接用service name去存取,以這個例子來說,後端不需要多建一個ingress讓前端從外部打。
為什麼會看到廣告
20會員
161內容數
留言0
查看全部
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
Abstract Factory design pattern
閱讀時間約 1 分鐘
什麼是CI/CD?
閱讀時間約 2 分鐘
使用Minikube安裝Kubernetes
閱讀時間約 6 分鐘
將Docker image部屬到Minikube
閱讀時間約 5 分鐘
使用K8S Deployment來部屬App
閱讀時間約 9 分鐘
你可能也想看
實現MySQL master-slave架構在K8S平台內的部署與功能驗證上一篇說明了如何在Kubernetes上建立基本的MySQL standalone,並加入phpmyadmin(PMA)來進行圖形化的管理,本篇就再進階一步,實作MySQL replication架構(master-salve),並進行驗證是否成功。
Thumbnail
avatar
超健忘閒人
2024-04-19
解密K8S DNS:揭開內部服務查詢的生命循環本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
avatar
超健忘閒人
2024-02-21
K8S監控之路:探索Loki監控方案(基礎篇)今天來分享在建置完K8S後的基本工作之一 : 監控。 只要是任何會”運作”的物件(Object),不管平台、服務、軟體、硬體,為了要提供最高的可用性,就會需要透過大大小小的監控元件來幫助我們了解所有的狀態,以便在問題發生時能做到最快速的反應。
Thumbnail
avatar
超健忘閒人
2023-12-08
K8S 平臺升級-基礎篇今天來記錄版本升級的做法(z版號),Kubernetes的版本更新的很快,所以版本升級是每個管理者所必須要會的必備技能,建議版本升級之前要先去確認升級路徑,不是每個版本號都能一次升級到你需要的版本。
Thumbnail
avatar
超健忘閒人
2023-11-09
K8S: 探索StatefulSet實務操作本篇將補完上一篇所提到關於StatefulSet的實作部份。
Thumbnail
avatar
超健忘閒人
2023-10-16
容器化首部曲 - 什麼是Container和K8S這篇分享希望能讓你了解 什麼Container、與Kubernetes和Docker是什麼關係,以及Kubernetes中又包含了哪些 組件?
Thumbnail
avatar
David | 資訊科技小學堂
2022-07-29
[K-POP分享]速度與激情:SUPER JUNIOR D&E《Countdown》SUPER JUNIOR D&E」於2日發行首張正規專輯《Countdown》,紀念出道10週年,主打歌〈ZERO〉由成員東海操刀。
Thumbnail
avatar
HARU LENA
2021-11-02
[K-POP分享]睽違7年回歸歌壇 抒情歌皇帝2AM《Ballad 21 F/W》10年前以〈死也不能放開你〉、〈給不接電話的你〉等熱門歌曲席捲K-POP界的抒情歌偶像團體「2AM」於昨日(11/1),睽違7年以完整體發表第4張迷你專輯《Ballad 21 F/W》正式回歸歌壇。
Thumbnail
avatar
HARU LENA
2021-11-02
K線戰法(上班族或是沒時間盯盤的人必看)K線戰法適用於每一個投資人,尤其是沒有辦法花太多時間盯盤的人更是適用。每天只需要在13:20看一下有沒有達到我們的續抱、停利或停損的條件。K線戰法很簡單但是標的一定要好好挑,也不是隨便就可以進場。以下列出多頭跟空頭的進場條件以及詳細操作守則
Thumbnail
avatar
威廉史塔克
2021-10-02
K-pop給不了的未來一線天團防彈少年,幾年前在歐洲的演唱會門票半小時內全數售鑿,阿米軍團力量強大。隊長RM在2018受邀到聯合國演講Love Yourself,其他成員也列席支持他。他們用行動證明偶像不只是站在鎂光燈下進行華麗表演,也能對粉絲帶來正面影響。
Thumbnail
avatar
地方大嬸
2021-02-18