1 使用kind構建一個單層架構Node/Express網絡應用程序
Kubernetes實戰-從零開始搭建微服務
前言
准備寫一個Kubernetes實戰系列教程,畢竟cnblogs作為國內最早的技術博客現在都已經開始遷移到Kubernetes了,此處要有掌聲給博客園
。系列會更加偏向於實戰,對於理論只在需要時講解。
Docker hub 上我個人覺着有兩個奇葩的鏡像image
- dind, docker in docker
- kind, kubernetes in docker / k8s in docker
很多人對k8s的學習都是從minikube開始,但是,但是,但是,當你親身對比kind和minikube的時候,會發現kind至少速度快三倍(在我這台mac老本上)。
1 准備
需要提前安裝好
- docker
- kubernetes-cli
安裝kind
- mac
brew install kind
- linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.8.1/kind-$(uname)-amd64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind
- windows 參考kind官方指南
試試運行kind --version
確保kind的安裝正確。
2 創建第一個cluster
需要大概2~3分鍾, kind create cluster
會創建一個cluster 名字為kind-kind
kubectl cluster-info
了解下cluster 狀況
Kubernetes master is running at https://127.0.0.1:51842
KubeDNS is running at https://127.0.0.1:51842/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
其中的鏈接即使你的k8s control plane
如果再運行docker ps
, 至少會有一個kind-control-plane 的container 在運行。
可以再試試以下命令:
kind get clusters
獲取所有clusterkubectl config get-contexts
kubectl get nodes -o wide
kubectl get svc
截止目前,一個單節點的k8s集群就在本地的docker環境里搭建好了。👌
3 發布一個node/express app
創建以下文件,並保存。
Dcoker and App
- inde.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('Hello World! running on kubernetes'))
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
package.json
, package-lock.json
整個項目文件,請訪問github repo
- Dockerfile
FROM node:14.2.0-alpine
EXPOSE 3000
WORKDIR /anode
ADD package.json .
ADD package-lock.json .
RUN npm ci
ADD . .
CMD ["node", "index.js"]
上傳鏡像到docker hub (可選)
克隆所有需要的代碼和配置文件。 在push鏡像之前,不要忘了docker login
。
docker build -t {your dockerhub name}/a-node:v1 .
docker push {your dockerhub name}/a-node:v1
deployment, service 配置
- deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: a-node-deployment
labels:
app: node
spec:
replicas: 1
selector:
matchLabels:
app: a-node
template:
metadata:
labels:
app: a-node
spec:
containers:
- name: a-node-container
image: tim010/a-node:v1 # or your own image
ports:
- containerPort: 3000
- service.yaml
apiVersion: v1
kind: Service
metadata:
name: a-node-service
spec:
ports:
- targetPort: 3000
protocol: TCP
port: 80
selector:
app: a-node-service
type: NodePort
發布
kubectl apply -f deployment.yaml
deployment.apps/a-node-deployment created
kubectl apply -f service.yaml
service/a-node-service created
為了確保發布成功,運行
kubectl get pods
應該會輸出如圖的結果,不要忘了復制你的pod名。
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
a-node-service NodePort 10.111.52.71 <none> 80:32709/TCP 7h25m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
等等,即使發布成功了,我的app在哪呢?
http://10.111.52.71:3000
?localhost:3000
- no
你需要端口轉發
kubectl port-forward {your port name for deployment 你的pod名} 3000:3000
取消發布 teardown
kubectl delete -f deployment.yml
kubectl delete -f service.yml
停掉整個cluster
kind delete cluster
結束語
至此,你的本地k8s 集群生命終結。
動手去做永遠都會比只學習理論要快得多,希望這第一個教程可以讓大家都快速上手,不被K8s復雜的概念嚇到。系列后續會寫一些更多關於Kubernetes 高可用性 和架構的。
Tips 小提示
- kind 推薦docker 內存設置最少為6G, 親測,低於6G在mac 2018 上依然可用。
- docker 在mac 上有一點不同,網絡上docker desktop mac 有不少惱人的限制
- 如果docker hub訪問受限,請嘗試國內大廠節點
源碼,參考和推薦
- github repo源碼
- kind
- 張晉濤博客 kind的開發者之一