Kubernetes實戰-從零開始搭建微服務
準備寫一個Kubernetes實戰系列教程,畢竟cnblogs做爲國內最先的技術博客如今都已經開始遷移到Kubernetes了,此處要有掌聲給博客園
。系列會更加偏向於實戰,對於理論只在須要時講解。javascript
Docker hub 上我我的覺着有兩個奇葩的鏡像imagejava
不少人對k8s的學習都是從minikube開始,可是,可是,可是,當你親身對比kind和minikube的時候,會發現kind至少速度快三倍(在我這臺mac老本上)。node
須要提早安裝好linux
brew install kind
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
試試運行 kind --version
確保kind的安裝正確。git
須要大概2~3分鐘, kind create cluster
github
會建立一個cluster 名字爲kind-kinddocker
kubectl cluster-info
瞭解下cluster 情況shell
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 planeexpress
若是再運行docker ps
, 至少會有一個kind-control-plane 的container 在運行。npm
能夠再試試如下命令:
kind get clusters
獲取全部clusterkubectl config get-contexts
kubectl get nodes -o wide
kubectl get svc
截止目前,一個單節點的k8s集羣就在本地的docker環境裏搭建好了。?
建立如下文件,並保存。
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
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"]
克隆全部須要的代碼和配置文件。 在push鏡像以前,不要忘了docker login
。
docker build -t {your dockerhub name}/a-node:v1 . docker push {your dockerhub name}/a-node:v1
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
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
你須要端口轉發
kubectl port-forward {your port name for deployment 你的pod名} 3000:3000
kubectl delete -f deployment.yml kubectl delete -f service.yml
kind delete cluster
至此,你的本地k8s 集羣生命終結。
動手去作永遠都會比只學習理論要快得多,但願這第一個教程可讓你們都快速上手,不被K8s複雜的概念嚇到。系列後續會寫一些更多關於Kubernetes 高可用性 和架構的。