K8S 內部App之間的連線

更新 發佈閱讀 11 分鐘

假如公司團隊開發了一套前後端分離的系統,部署在不同的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:

vocus|新世代的創作平台


接著執行Dockerfile build docker image:

$ docker build -t vic/test_service .

用指令確認 image 是否存在:

$ docker images |grep test_service
=> 用關鍵字找
$ docker images
=> 列出全部
vocus|新世代的創作平台

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來編輯:

vocus|新世代的創作平台

原本imagePullPolicy是Always改為Never!

查詢剛剛建立的deployment:

$ kubectl get deployment test-service
vocus|新世代的創作平台

可以看到pod也被建立上去了:

$ kubectl get pods
vocus|新世代的創作平台

4. 建立Service:

使用 kubectl expose指令公開 Deployment,創建「test-service」 Service:

$ kubectl expose deployment test-service --port=7000 --target-port=7000
vocus|新世代的創作平台

可以看到service已經建立上去了:

$ kubectl get services
vocus|新世代的創作平台

- 前端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:

vocus|新世代的創作平台


接著執行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
vocus|新世代的創作平台

可以看到pod也被建立上去了:

$ kubectl get pods
vocus|新世代的創作平台


4. 建立Service:

使用 kubectl expose指令公開 Deployment,創建「test-client」 Service:

$ kubectl expose deployment test-client --port=8000 --target-port=8000
vocus|新世代的創作平台


可以看到service已經建立上去了:

$ kubectl get services
vocus|新世代的創作平台

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
vocus|新世代的創作平台

查看Ingress:

$ kubectl get ingress


vocus|新世代的創作平台


由於這只是範例,並不是真的有test.client這個domain name,因此為了模擬測試,可以在/etc/hosts中加入host ip mapping:

$ sudo nano /etc/hosts
vocus|新世代的創作平台


- 測試結果:

使用瀏覽器打開前端網頁,測試前端打後端api的結果:

vocus|新世代的創作平台

往上拉看前後端的code,在前端的testClient method裡面其實就是去打後端service,http://test-service:7000,其中test-service port 7000,就是後端建立出來的service。

也就是說,k8s內部app要連線,只要建立出service,就可以直接用service name去存取,以這個例子來說,後端不需要多建一個ingress讓前端從外部打。


本文章參考:
1. https://www.runoob.com/nodejs/nodejs-restful-api.html
2. https://medium.com/brobridge/%E6%AD%A5%E6%AD%A5%E9%A9%9A%E5%BF%83-%E5%BE%9E%E9%A0%AD%E9%83%A8%E7%BD%B2%E6%9C%8D%E5%8B%99%E5%88%B0-kubernetes-part-5-78c5031c5ca1

留言
avatar-img
Vic Lin的沙龍
20會員
161內容數
Vic Lin的沙龍的其他內容
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
看更多
你可能也想看
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
透過K8S Ingress 和 NodePort service直接連線Pod中的App
Thumbnail
透過K8S Ingress 和 NodePort service直接連線Pod中的App
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
什麼是Kubernetes Service? 先來個官網的解說 A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them. 白話文就是
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
Intro👨‍💻 在gcp環境下使用ansible playbook 建立k8s cluster,目前base image為centos 7,安裝方式類似elk stack,一樣先等master安裝完後產生token,接著安裝slave。 使用的CRI為containerd,CNI為calico
Thumbnail
Intro👨‍💻 在gcp環境下使用ansible playbook 建立k8s cluster,目前base image為centos 7,安裝方式類似elk stack,一樣先等master安裝完後產生token,接著安裝slave。 使用的CRI為containerd,CNI為calico
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
之前都介紹docker監控container,這次來點不一樣的,直接裝在k8s裡面去監控pod的一些指標。 基本的指標像是cpu, mem, pod數量, node數量等等,都能透過kube-state-metrics完成,而如果想要監控一些流量的指標,像是tcp連線數,tw數等,則是需要另外在服務
Thumbnail
之前都介紹docker監控container,這次來點不一樣的,直接裝在k8s裡面去監控pod的一些指標。 基本的指標像是cpu, mem, pod數量, node數量等等,都能透過kube-state-metrics完成,而如果想要監控一些流量的指標,像是tcp連線數,tw數等,則是需要另外在服務
Thumbnail
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
Thumbnail
因為想要使用FQDN的方式連接到Kubernetes cluster內部的應用服務,加上早已使用Linux Bind為測試環境的主要DNS
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News