Kubernetes實戰 - 從零開始搭建微服務 - 1 使用kind構建一個單層架構Node/Express網絡應用程序


1 使用kind構建一個單層架構Node/Express網絡應用程序

Kubernetes實戰-從零開始搭建微服務

k8s structure

前言

准備寫一個Kubernetes實戰系列教程,畢竟cnblogs作為國內最早的技術博客現在都已經開始遷移到Kubernetes了,此處要有掌聲給博客園。系列會更加偏向於實戰,對於理論只在需要時講解。

Docker hub 上我個人覺着有兩個奇葩的鏡像image

  1. dind, docker in docker
  2. 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

2 創建第一個cluster

需要大概2~3分鍾, kind create cluster
kind create

會創建一個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 獲取所有cluster
  • kubectl 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 小提示

源碼,參考和推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM