本文主要內容是透過dockerfile建立映象,並透過kubernets(簡稱k8s)來啟動叢集服務。最後你會得到一個簡單的nodejs提供的api服務。
寫在前面
需要安裝的有node(如何安裝?),kubectl(如何安裝?)
一,建立nodejs應用
本文主要是用於實踐k8s,所以nodejs專案寫的非常簡單,除了package*.json之外只有簡單的app.js檔案
1,首先建立一個app.js檔案。程式碼如下,作用是用nodejs生成兩個api,一個get一個post,並監聽3000埠提供服務。
點選檢視程式碼
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();
// GET /api/users
router.get('/api/users', async (ctx) => {
ctx.body = [{ name: 'Alice' }, { name: 'Bob' }];
});
// POST /api/users
router.post('/api/users', async (ctx) => {
const user = ctx.request.body;
// 處理使用者資料...
ctx.status = 201;
ctx.body = { message: 'User created', user };
});
// 使用路由中介軟體
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
如果是在本地,你可以使用node app.js
輕鬆啟動,但可能報錯,提示koa和koa-router未安裝,這個時候你需要npm install koa
和npm install koa-router
,然後你就有了package.json
和package-lock.json
兩個檔案了。重新執行node後,在瀏覽器訪問localhost:300/api/users
即可訪問得到資料返回。
以下為package.json程式碼供參考:
點選檢視程式碼
{
"name": "my-koa-api",
"version": "1.0.0",
"description": "A simple Koa API",
"private": true,
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"koa": "^2.15.3",
"koa-router": "^12.0.1"
}
}
二,建立dockerfile
擁有了建議的nodejs專案之後,我們來建立dockerfile。
首先,在你的專案根目錄下建立名為Dockerfile
的檔案,並複製以下程式碼(程式碼中有註釋)
點選檢視程式碼
# 1. 選擇 Node.js 官方映象作為基礎映象
FROM node:20.15.0
# 2. 設定工作目錄為 /app
WORKDIR /app
# 3. 將 package.json 和 package-lock.json 複製到工作目錄
COPY package*.json ./
# 4. 安裝專案依賴
RUN npm install
# 5. 將當前目錄下的所有檔案複製到工作目錄
COPY . .
# 6. 暴露 API 服務執行的埠,預設 Koa 監聽 3000 埠
EXPOSE 3000
# 7. 定義環境變數(如果有需要)
# ENV NODE_ENV production
# 8. 定義啟動命令,啟動 Koa 應用
CMD ["npm", "start"]
它的配置思路為:首先安裝node的20.15.0版本為基礎映象,然後設定工作目錄為app(等容器啟動之後進入可檢視當前目錄),複製package*.json就是兩個json檔案,隨後npm install安裝,接著複製當前目錄下的所有檔案到工作目錄,隨後暴露3000埠,最後啟動node。
映象構建
docker build -t my-koa-api .
建立一個名為my-koa-api的映象
映象打標
docker tag my-koa-api xyb1205/my-koa-api:latest
其中my-koa-api是本地映象的名稱,xyb1205是docker hub上的使用者名稱,my-koa-api:latest是新建立的標籤
映象推送
docker push xyb1205/my-koa-api:latest
至此,hub上就有名為xyb120/my-koa-api的映象了
三,配置k8s,建立叢集
1,建立my-app-deployment.yaml配置檔案
點選檢視程式碼
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: xyb1205/my-koa-api:latest
ports:
- containerPort: 3000
2,建立my-app-service.yaml檔案
service有好幾種型別,最常見的有ClusterIP,Nodeport,LoadBalancer,service預設型別為ClusterIP,ClusterIP和Nodeport一般都是提供叢集內部使用的,LoadBalancer可以供叢集外部使用。
點選檢視程式碼
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: LoadBalancer # 設定 Service 型別為 LoadBalancer
selector:
app: my-app # 選擇器,用於匹配 Pod 的標籤
ports:
- name: http # 埠名稱
protocol: TCP # 協議型別
port: 80 # Service 埠,叢集外部訪問使用此埠
targetPort: 3000 # Pod 的目標埠
使用以下命令配置kubernets
kubectl apply -f my-app-deployment.yaml
kubectl apply -f my-app-service.yaml
注意,如何啟動kubernets呢?你需要在你的docker desktop應用中開啟設定,並開啟kubernets服務
四,訪問
檢視kubectl get services
即可看到kubernets的服務
透過 http://<EXTERNAL-IP>:<Port>即可訪問服務
(由於本nodejs專案的api路徑已配置,所以你可以這樣訪問測試 http://<EXTERNAL-IP>:80/api/users)
代表成功訪問
五;踩過的坑
1,Nodeport並不能生成EXTRAL_IP,EXTRAL_IP才能被叢集外部訪問。(EXTRAL_IP的可訪問範圍,還需要研究)
2,nginx反向代理還需要加進來
3,叢集內部訪問ip,可以透過節點內命令,或者容器埠對映,來訪問。(後續有時間再詳細出一個)
4,叢集>節點>pod>容器。pod是容器的承載
5,在討論 Kubernetes 叢集、雲端計算環境或網路安全時,"防火牆策略"、"網路策略"和"網路安全組" 是三個關鍵概念,它們共同構成了網路環境的安全和訪問控制機制
6,kubernets有負載均衡,但是也有侷限性。
六,常用命令總結
其實命令都是為需求服務的
- kubectl get services // 獲取所有服務
- kubectl get pods // 獲取所有pods
- kubectl get nodes //獲取所有節點
- kubectl describe service <service-name> // 檢視service-name服務的詳細資訊