如何使用Kubernetes部署Nodejs的Http服務

製做鏡像

mkdir nodeappk8s # 項目名稱
cd nodeappk8s
npm init # 一路回車
vim app.js # 建立文件,內容在下面
npm i -S express # 安裝依賴
# 在package.json文件中新增 {"start": "node app.js"}
npm start # 測試你的程序沒有問題
vim Dockerfile # 建立Dockerfile, 內容在下面
docker build -t pengj/nodeappk8s:v1.0.0 . # 構建鏡像, 請更改成本身帳號名稱
docker run -p 8888:8888 pengj/nodeappk8s:v1.0.0 # 測試你的鏡像沒有問題
# 這裏須要在你的docker倉庫新建鏡像,以後執行下面的操做; 個人地址爲: https://hub.docker.com/u/pengj
# 若是先登陸再建立,則推送會報倉庫不存在
docker login # 登陸, 輸入帳號和密碼
docker push pengj/nodeappk8s:v1.0.0 # 推送鏡像
複製代碼

app.js內容node

var express = require('express');

var PORT = 8888;

var app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);

複製代碼

Dockerfile內容git

#node鏡像版本
FROM node:8-alpine
#聲明做者
MAINTAINER Hapiman
#在image中建立文件夾
RUN mkdir -p /home/Service
#將該文件夾做爲工做目錄
WORKDIR /home/Service

# 將node工程下全部文件拷貝到Image下的文件夾中
COPY . /home/Service

#使用RUN命令執行npm install安裝工程依賴庫
RUN npm install

#暴露給主機的端口號
EXPOSE 8888
#執行npm start命令,啓動Node工程
CMD [ "npm", "start" ]
複製代碼

部署鏡像

前提

若是你沒有搭建k8s集羣,能夠參考k8s搭建程序員

部署

# 新增名字爲`node-kube-apps`的namespace,內容在下面,在nodeapp-k8s.yaml會使用
kubectl apply -f node-kube-apps.yaml
# 在master機器上建立nodeapp-k8s.yaml,內容在下面,你須要更換`pengj/nodeappk8s:v1.0.0`爲你本身的鏡像倉庫或者直接使用(省事)
vim nodeapp-k8s.yaml
# 部署配置, 若是屢次部署會存在重複文件, 可使用kubectl delete -f nodeapp-k8s.yaml刪除
kubectl apply -f nodeapp-k8s.yaml
# 執行成功會輸出
# deployment "nodeapp-deploy" created
# service "nodeapp-svc" created
# ingress "nodeapp-ingress" created
複製代碼

校驗

# 可能會出現0/2, 1/2的狀況, 等一下子就OK
kubectl get deployments -n kube-apps |grep nodeapp
# nodeapp-deploy 2/2 2 2 109m
kubectl get svc -n kube-apps |grep nodeapp
# nodeapp-svc NodePort 10.97.144.116 <none> 8080:31000/TCP 109m
kubectl get ingress -n kube-apps |grep nodeapp
# nodeapp-ingress nodeappk8s.local 80 110m
kubectl get pods -n kube-apps |grep nodeapp
# nodeapp-deploy-5c84c9d676-m7zwc 1/1 Running 0 110m
# nodeapp-deploy-5c84c9d676-v8r6g 1/1 Running 0 110m
複製代碼

兩種訪問方式:github

1.使用集羣之間可見ip訪問, 只可以在集羣部署的機器上可用: curl http://10.97.144.116:8080/pinggolang

2.使用通用的ip訪問, 可是須要使用配置文件中32000端口才行docker

詳細代碼在這裏express

nodeapp-k8s.yaml文件中定義了3類資源DeploymentServiceIngress;npm

Deployment設置了replicas: 2,表示會運行兩個PODstrategy的滾動策略爲RollingUpdateresources區域定義了一個POD的資源限制,經過livenessProbereadinessProbe設置了健康檢查json

kube-apps.yaml內容vim

apiVersion: v1
kind: Namespace
metadata:
 name: node-kube-apps
 labels:
 name: node-kube-apps
複製代碼

nodeapp-k8s.yaml內容

---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: nodeapp-deploy
 namespace: node-kube-apps
 labels:
 k8s-app: nodeappk8s
spec:
 replicas: 2
 revisionHistoryLimit: 10
 minReadySeconds: 5
 strategy:
 type: RollingUpdate
 rollingUpdate:
 maxSurge: 1
 maxUnavailable: 1
 template:
 metadata:
 labels:
 k8s-app: nodeappk8s
 spec:
 containers:
 - image: pengj/nodeappk8s:v1.0.0
 imagePullPolicy: Always
 name: nodeappk8s
 ports:
 - containerPort: 8888
 protocol: TCP
 resources:
 limits:
 cpu: 100m
 memory: 100Mi
 requests:
 cpu: 50m
 memory: 50Mi
 livenessProbe:
 tcpSocket:
 port: 8888
 initialDelaySeconds: 10
 timeoutSeconds: 3
 readinessProbe:
 httpGet:
 path: /
 port: 8888
 initialDelaySeconds: 10
 timeoutSeconds: 2

---
apiVersion: v1
kind: Service
metadata:
 name: nodeapp-svc
 namespace: node-kube-apps
 labels:
 k8s-app: nodeappk8s
spec:
 type: NodePort
 ports:
 - name: api
 port: 8888
 targetPort: 8888
 nodePort: 32000
 selector:
 k8s-app: nodeappk8s

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: nodeapp-ingress
 namespace: node-kube-apps
spec:
 rules:
 - host: nodeappk8s.local
 http:
 paths:
 - path: /
 backend:
 serviceName: nodeapp-svc
 servicePort: api
複製代碼

參考文檔

手摸手教你寫 Kubernetes 的 golang 服務

歡迎關注公號:程序員的金融圈

一個探討技術,金融,賺錢的小圈子,爲你提供最有味道的內容,日日更新!

相關文章
相關標籤/搜索