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讓前端從外部打。
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
透過K8S Ingress 和 NodePort service直接連線Pod中的App
透過CI/CD工具,如最常見的Jenkins,可以讓工程師專注在開發上,只要將code push到git後,就會有一整套完整的整合、測試、部屬流程,可以大大節省很多時間呢。
透過K8S Ingress 和 NodePort service直接連線Pod中的App
透過CI/CD工具,如最常見的Jenkins,可以讓工程師專注在開發上,只要將code push到git後,就會有一整套完整的整合、測試、部屬流程,可以大大節省很多時間呢。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
為什麼要用Docker安裝? Docker是一個容器化平台, 就類似於我們早期虛擬機的VMWare、Virtual Box…等, 虛擬機平台一般, 只是面向的是伺服端, 供企業快速、簡單、輕量的佈署開發完成的程式軟體, 並將相關的環境依賴皆封裝成一包所謂的映像檔(image), 透過這樣的方式減少
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
在Spring Cloud微服務中,透過Maven與Docker,將專案打包成Docker Image,並部署。 安裝Maven apt install maven​ 安裝Docker apt install docker.io 啟動Docker service docker s
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
Thumbnail
這篇文章教你如何搭建Kubernetes Cluster,包括節點安裝前設定、軟體套件安裝、Control-Plane部署和加入運算節點等步驟。在建置之後,作者會分享一些基礎服務的安裝。希望這篇文章對你有所幫助。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章將提供一個完整的Kubernetes安裝指南,包括控制平面節點和工作節點的安裝過程。文章中還會提及一些參考資料和解決常見錯誤的方法。
Thumbnail
咦! 怎麼啟動個docker compose up -d就出現了可疑的訊息: +] Running 2/2d orphan containers ([xxxx]) for this project. If you removed or renamed this service in your
Thumbnail
為什麼要用Docker安裝? Docker是一個容器化平台, 就類似於我們早期虛擬機的VMWare、Virtual Box…等, 虛擬機平台一般, 只是面向的是伺服端, 供企業快速、簡單、輕量的佈署開發完成的程式軟體, 並將相關的環境依賴皆封裝成一包所謂的映像檔(image), 透過這樣的方式減少
Thumbnail
這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。 GitLab負責版本管理與CI/CD(CI/CD)。 Harbor負責Docker([Docker]介紹) Image的儲存與發佈。 Kubernetes([
Thumbnail
安裝環境需求 64位元Linux,核心版本為3.1以上,且能滿足Ducker安裝環境。 機器之間要能夠互通。 外部存取權限。 硬體資源:兩核心CPU、8G記憶體、硬碟30GB以上。 安裝Kubeadm與Ducker Kubeadm是Kubernetes的一鍵部署工具。 增加Kube
Thumbnail
在實際生產中,容器化技術開始走向「容器編排技術」,如:Kubernetes。因為Docker無法獨立支撐大規模容器化部署。 Kubernetes起源於Borg系統,所以在大規模的叢集管理,優於其他容器編排技術。它提供拉取映像檔、拉取執行容器、路由閘道、水平擴充、監控和備份等,除外還可以自動化處理容
Thumbnail
在Spring Cloud微服務中,透過Maven與Docker,將專案打包成Docker Image,並部署。 安裝Maven apt install maven​ 安裝Docker apt install docker.io 啟動Docker service docker s
Thumbnail
本文將探討Kubernetes內部DNS解析的相關流程,並介紹如何利用DNS來找到服務。透過瞭解DNS的工作原理,可以讓應用服務的問題處理更有效率,並提供基本測試與結論。
Thumbnail
在Kubernetes cluster上建立Jenkins,並且使用動態方式建立Jenkins Agent。透過K8S解決傳統的Jenkins一對多架構的問題,最終建立基本Pipeline在Jenkins Web UI上,簡單驗證Jenkins engine正常運行。
Thumbnail
這篇文章教你如何搭建Kubernetes Cluster,包括節點安裝前設定、軟體套件安裝、Control-Plane部署和加入運算節點等步驟。在建置之後,作者會分享一些基礎服務的安裝。希望這篇文章對你有所幫助。