大家好,我是比特桃。本文為《極速上手k8s,Kubernetes 從入門到摸魚系列》的實(shí)戰(zhàn)篇,旨在快速上手k8s。如沒有閱讀過(guò)k8s相關(guān)理論的朋友,可以先閱讀理論篇。
1. 實(shí)踐環(huán)境
k8s 的意義在于分布式大規(guī)模容器編排,所以如果我們想要在實(shí)際中發(fā)揮它的最大價(jià)值,至少也得需要 3 臺(tái)機(jī)器。其中一臺(tái)是主節(jié)點(diǎn),剩余兩臺(tái)是工作節(jié)點(diǎn)。當(dāng)然,也可以通過(guò)虛擬機(jī)中創(chuàng)建三個(gè)操作系統(tǒng)來(lái)實(shí)踐。但這樣操作還是很繁瑣,其實(shí)在學(xué)習(xí)中,有更方便的辦法進(jìn)行。
- minikube
能讓你在本地運(yùn)行 Kubernetes。 minikube 在你本地的個(gè)人計(jì)算機(jī)(包括 Windows、macOS 和 Linux PC)運(yùn)行一個(gè)單節(jié)點(diǎn)的 Kubernetes 集群,以便你來(lái)嘗試 Kubernetes 或者開展每天的開發(fā)工作。 - Kind
另一個(gè)Kubernetes SIGs項(xiàng)目,但與minikube相比有很大不同。顧名思義,它將集群移動(dòng)到Docker容器中。與生成VM相比,這將顯著加快啟動(dòng)速度。 - Docker Desktop
在Windows、Mac中常用的Docker Desktop 中也內(nèi)置了一個(gè) k8s 功能,只需要在設(shè)置中即可打開使用。
生產(chǎn)環(huán)境上的集群安裝和配置不建議使用 kind 或者 minikube。本文采用 minikube 來(lái)開展,使用其他的環(huán)境其實(shí)并沒有太大區(qū)別。minikube的安裝可以查閱官網(wǎng),根據(jù)自身不同的操作系統(tǒng)進(jìn)行安裝。minikube 是可以選擇依賴于容器還是本機(jī)VM:
所以我們可以選擇使用 Docker 來(lái)當(dāng)做 minikube 運(yùn)行的地方,命令:
minikube start --driver='docker’
# 如果你在Docker Desktop版本中使用,建議將 Docke Engine 切換為 Linux的版本
docker context ls
docker context use default
2. 配置
在 k8s 中的核心思想就是:聲明式無(wú)狀態(tài)。
所以當(dāng)我們想通過(guò) API 或 CLI 和 k8s 中主節(jié)點(diǎn)中的 API Server 進(jìn)行通訊的時(shí)候,必須采取一種格式。而 CLI 是使用 YAML 格式來(lái)進(jìn)行的, YAML 對(duì)于后臺(tái)開發(fā)者來(lái)說(shuō)并不陌生,Spring 中的配置文件也是這個(gè)格式。k8s 的 YAML 聲明文件分為三個(gè)部分:1)metadata;2)specification;3)status。
細(xì)心地朋友會(huì)發(fā)現(xiàn),第三個(gè) status 好像并沒有在文件中聲明。這是因?yàn)樗怯?k8s 自動(dòng)生成編輯的。它的主要作用就是,時(shí)刻將容器的現(xiàn)有狀態(tài)(status)與聲明狀態(tài)(specification)相比較,如果發(fā)現(xiàn)有區(qū)別,則會(huì)向聲明狀態(tài)所靠攏。
比如這里在聲明文件中是要兩個(gè) Nginx,但實(shí)際運(yùn)行中發(fā)現(xiàn)只有一個(gè),k8s 發(fā)現(xiàn)后會(huì)主動(dòng)的再創(chuàng)建一個(gè)讓兩者相匹配。status 實(shí)際是由 etcd 進(jìn)行維護(hù)的。
3. 實(shí)例
這個(gè)實(shí)例是一個(gè) Node 應(yīng)用程序,通過(guò)訪問(wèn)MongoDB進(jìn)行數(shù)據(jù)訪問(wèn),部署方式如下所示:
所涉及到的技術(shù)點(diǎn)為:
- ConfigMap:MongoDB 連接信息
- Secret:MongoDB 用戶名及密碼
- Deployment & Service :應(yīng)用組合及服務(wù)
3.1 MongoDB
首先創(chuàng)建 ConfigMap,k8s作為一個(gè)工具類的產(chǎn)品,其實(shí)可以直接仿照官網(wǎng)的例子來(lái)去改寫。
將官網(wǎng)的例子復(fù)制下來(lái),改寫成如下形式:
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-config
data:
mongo-url: mongo-service
然后創(chuàng)建 Secret,這里需要注意的是,Secret 默認(rèn)采用了Opaque 的加密方式。我們的用戶名和密碼需要通過(guò) base64 加密后,粘貼上去。
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
data:
mongo-user: bW9uZ291c2Vy
mongo-password: bW9uZ29wYXNzd29yZA==
最后,我們來(lái)聲明 Deployment & Service,這兩個(gè)可以單獨(dú)寫,但也可以寫在一起:
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deployment
labels:
app: mongo
spec:
replicas: 1
selector:
matchLabels:
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongodb
image: mongo:5.0
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-user
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
---
apiVersion: v1
kind: Service
metadata:
name: mongo-service
spec:
selector:
app: mongo
ports:
- protocol: TCP
port: 27017
targetPort: 27017
其中的 template
我們第一次見到,它是為了聲明 Pod 的,內(nèi)部也有自己的元數(shù)據(jù)(metadata)和聲明(specification)。這里面最為重要的就是聲明中的容器(containers),其實(shí)可以理解為 docker-compose 中聲明的 image 信息。labels
是一個(gè)標(biāo)簽,k8s 可以為任何組件指定一個(gè)標(biāo)簽,可以作為一個(gè)標(biāo)識(shí)符。比如 Pod 的名字是變化莫測(cè),就可以使用標(biāo)簽(labels)來(lái)快速識(shí)別和尋找特定的組件。
YMAL 語(yǔ)法中,使用---
三個(gè)破折號(hào)來(lái)區(qū)分多個(gè)配置文件,所以我們使用破折號(hào)分割后,又聲明了 Service。其中targetPort
為 Pod 中聲明的端口,port
則可以任意指定未使用的端口。
3.2 Application
如法炮制,我們來(lái)聲明部署應(yīng)用部分。webapp.yaml如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
labels:
app: webapp
spec:
replicas: 1
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nanajanashia/k8s-demo-app:v1.0
ports:
- containerPort: 3000
env:
- name: USER_NAME
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-user
- name: USER_PWD
valueFrom:
secretKeyRef:
name: mongo-secret
key: mongo-password
- name: DB_URL
valueFrom:
configMapKeyRef:
name: mongo-config
key: mongo-url
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
type: NodePort
selector:
app: webapp
ports:
- protocol: TCP
port: 3000
targetPort: 3000
nodePort: 30100
其中,我們?cè)?APP 的 Service 中聲明了 NodePort
,它的作用旨在讓外部瀏覽器訪問(wèn)。nodePort則為該 k8s 節(jié)點(diǎn)中 ip 所綁定的端口,只是它會(huì)有端口范圍的限制。
4. 運(yùn)行
將 YAML 文件寫好后,就可以通過(guò) Kubectl 告訴 k8s 集群,我們要這些服務(wù)組件。首先創(chuàng)建ConfigMap、Securit:
kubectl apply -f mongo-config.yaml
kubectl apply -f mongo-secret.yaml
然后創(chuàng)建MongoDB 和 APP應(yīng)用:
kubectl apply -f mongo.yaml
kubectl apply -f webapp.yaml
執(zhí)行kubectl get all
查看當(dāng)前組件狀態(tài):
這里只能看到我們的Deployment、Service、Pod,但配置文件需要單獨(dú)的命令查詢:
kubectl get configmap
kubectl get secret
如果想查看該組件的詳細(xì)信息,則可以使用該命令:
kubectl describe service webapp-service
在Docker中我們經(jīng)常查看容器的Log,在 k8s 中查看 pod 日志的命令:
kubectl logs pod名稱 -f
總之,kubectl 作為 k8s 最強(qiáng)大的交互工具,它所含的命令集非常多,我們也很難全部記住。就像Linux命令一樣,善用-- help
~
最后,我們來(lái)訪問(wèn)一下這個(gè) k8s 所部署的應(yīng)用,查詢minikube的ip地址:
可以看到minikube的ip是192.168.64.26
,直接訪問(wèn):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-569941.html
5. 總結(jié)
本文我們通過(guò)組合理論篇所學(xué)習(xí)到的組件,通過(guò)一個(gè) Node.js 網(wǎng)頁(yè)應(yīng)用連接 MongoDB 的例子,實(shí)現(xiàn)了在 k8s 中部署使用。雖然在本機(jī)環(huán)境下用 minikube 會(huì)顯得比 Docker Compose 要麻煩的多,但只要我們上了集群,就可以凸顯出 k8s 的強(qiáng)大之處了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-569941.html
到了這里,關(guān)于極速上手k8s,Kubernetes 從入門到摸魚系列-實(shí)踐篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!