(精華)2020年10月4日 微服務 k8s部署專案
k8s如何部署專案
什麼是微服務
我們開發一個專案,這個專案有很多很多的模組,如果是一個單體專案,我們所有的模組一起部署,這個時候如果一個模組需要進行升級和維護,那我們必須停止這個專案,修改後再進行部署,會導致業務停止,那麼這個時候,我們有一個需求,修改了這個模組,不停止專案也能正常提供其服務,所有我們將這個單體專案進行拆分成為一個個的子專案,這些子專案獨立維護,獨立部署,互不影響,那麼我們把這些服務叫做微服務。
例如:好比,我們開發一個電商專案,電商專案裡面有很商品,訂單,使用者,支付模組,這些模組獨立部署,獨立升級,獨立維護,那麼我們把服務叫做微服務
再來舉個例子:
我們現在要去開一個軟體公司,公司會有技術部門,銷售部門,售後部門,測試部門,這些部門就是獨立操作業務,互不影響,這些部門就是微服務
為什麼要使用微服務
利於業務升級,利於業務管理,利於團隊管理。使系統更加更夠適應需求的變化。
什麼是docker
我們開發了一個 專案,需要部署到伺服器,windows或者linux上,我們需要準備環境,配置起來比較麻煩,而且非常耗時間
如果這些時候,客戶需要進行叢集部署,那麼我們需要重啟搞一臺linux,同時進行部署,我們又需要準備環境和配置。
如果我們需要叢集100臺呢,那我們就需要配置100臺了。為了解決,專案橫向擴充套件,環境準備的問題,所以我們就用docker容器技術來解決。
什麼是docker容器,映象,映象倉庫
我們現在部署一個專案到docker容器中,是可以執行,但是如果我們執行100個專案到容器中,執行之後,我們如何維護這些專案,這些專案形態各異,都不是一個人開發,docker的發明人也遇到了這樣的問題,所以呢,他們說我們搞一定規範來解決的,這個規範的名字還要能夠推廣我們的產品,所以取名叫做容器,聽起來非常高大上。而且也好賣,所有容器就成為了專案在docker裡面的另外一個身份。
但是這個時候,如果我們想在其他docker裡面也執行這些容器,可是容器執行了,無法移植啊,難道我們又要搞一個這樣的操作嗎,那是非常麻煩的。docker那幫人了為了解決這個容器移植的問題,就發明了映象,映象專門來進行移植容器到不同的linux docker裡面,我們知道有多少專案容器,就有多少個映象,那我們去哪裡找到這些映象呢?docker那般人發明了映象倉庫,這些儲存了所有的映象,需要什麼映象直接取就可以了。
總結:我們-------映象倉庫----------映象 ---------執行容器
什麼是k8s
這個時候我們啟動一個專案需要經歷生成映象,然後根據映象執行得到容器,最後再進行移植。
如果我們需要啟動1千個專案怎麼辦,那麼這麼大的維護量,一般都接受不了啊,所以我們出現了k8s來解決
三個情況
多個專案執行在docker?
一個專案執行在不同docker?
如果容器當機了?
總結:k8s是容器編排引擎,換句話說,就是用來批量操作容器的,維護容器的生命週期
例如:docker和k8s關係,就好比docker是一艘船,那麼k8s就是這艘船的方向盤,我們就是船長,想讓這艘船駛向哪裡,就駛向哪裡。
什麼是swarm
swam是k8s的同父異母兄弟,都是在美國開發的,但是是不同的美國人開發的。
k8s和swarm對比
swarm 和 k8s 對比
swarm:
優點
1、部署非常簡單
2、啟動速度快
缺點:
1、無法對容器提供精細化管理
2、網路問題
3、容器可靠性
k8s:
優點
1、提供精細化容器管理
2、健康監控機制
3、能夠應對複雜的網路環境
缺點:
1、配置,學習成本高
2、啟動速度慢
k8s安裝
見安裝檔案
什麼是pod
k8s要執行docker裡面的容器,或者執行其他容器技術裡面的容器,不同容器技術肯定的容器標準又是不一樣的,所以為了規範不同容器技術的容器,所以就出現了,pod來對不同容器技術中容器進行統一規範。
什麼是service
pod需要對外提供訪問,我們可以直接對外提供訪問,但是如果有多個pod 是一個叢集呢?為了解決這個問題,所以出現了service
service 是專門用來解決這個問題的。
微服務專案部署到k8s中
條件
1、微服務系統
3、微服務映象
4、service
步驟
1、建立團隊專案映象
通過dockerfile檔案進行建立
2、運用專案映象
先通過pod執行,
然後再通過service進行暴露訪問
teamservice 映象
執行命令
kubectl run teamservice --image=teamservice3 --port=80 --image-pull-policy=Never
釋出命令
kubectl expose pod teamservice --port=80 --target-port=80 --type=NodePort
sqlserver 映象
執行命令
kubectl run sqlserver --image=mcr.microsoft.com/mssql/server:2017-latest --port=1433 --image-pull-policy=IfNotPresent --env=“ACCEPT_EULA=Y” --env=“SA_PASSWORD=zjh520WTR”
釋出命令
kubectl expose pod sqlserver --cluster-ip=10.1.120.1 --port=1433 --target-port=1433 --type=NodePort
批量部署微服務到k8s
使用pod.yml service.yml進行部署
什麼是yml檔案
yml檔案是配置檔案,和json檔案一樣的,只是格式不一樣。類似的檔案有很多,json,xml等的,yml就是其中一種
yml檔案地址
官網地址:https://www.runoob.com/w3cnote/yaml-intro.html
為什麼要使用
方便部署,使用部署變成工程化
YAML是專門用來寫配置檔案的語言,非常簡潔和強大,使用比json更方便。它實質上是一種通用的資料序列化格式
如何使用yml檔案
yml檔案配置參考地址:https://www.runoob.com/w3cnote/yaml-intro.html
yml檔案配置描述
1、物件
例如
companies:{id: 1,name: company1,price: 200W}
或
companies:
id: 1
name: company1
price: 200W
2、陣列
例如
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
或
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
3、基本變數型別 int float string boolean date datetime null
如何使用pod.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-name
labels:
app: web
spec:
containers:
- name: pod-container
image: nginx
ports:
- containerPort: 80
apiVersion:此處值是v1,這個版本號需要根據安裝的Kubernetes版本和資源型別進行變化,記住不是寫死的。
kind:此處建立的是Pod,根據實際情況,此處資源型別可以是Deployment、Job、Ingress、Service等。
metadata:包含Pod的一些meta資訊,比如名稱、namespace、標籤等資訊。
spec:包括一些container,storage,volume以及其他Kubernetes需要的引數,以及諸如是否在容器失敗時重新啟動容器的屬性。可在特定Kubernetes API找到完整的Kubernetes Pod的屬性。
- apiVersion: 表示版本
- kind: 表示資源
- metadata: 表示元資訊
- spec: 資源規範欄位
檢視apiVersion版本
kubectl api-versions
如何使用service.yml檔案
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
ports:
- port: 88
targetPort: 80
selector:
app: nginx
名詞解釋
apiVersion: 指定版本
kind: 型別
name: 指定服務名稱
labels: 標籤
port: Service 服務暴露的埠
targetPort: 容器暴露的埠
seletor: 關聯的Pod的標籤
如何專案需要進行動態伸縮
什麼是動態伸縮
就是動態的增加和刪除服務例項,不影響系統正常的使用
如何實現動態伸縮
使用deployment來進行 實現
什麼是deployment
deployment是一個集合,是pod的集合
形象例子:好比c#的物件集合一樣。
如何使用deployment來進行實現
條件
1、deployment
步驟
建立副本集deployment
kubectl create 命令
建立nginx副本deployment
kubectl create deployment nginx-deployment --image=nginx
檢視nginx副本deployment
kubectl create deployment -o wide
暴露nginx副本deployment
kubectl expose deployment nginx-deployment --port=80 --target-port=8000 --type=NodePort
檢視暴露nginx副本deployment service
kubectl get service -o wide
動態擴容nginx副本deployment
kubectl scale deployment/nginx --replicas=3
如何使用deployment.yml檔案進行動態伸縮
apiVersion: v1 #k8s版本號
kind: Deployment #部署型別(資源型別)
metadata: #後設資料(用於定義資源資訊)
name: nginx-deployment-tony5 #資源名稱
labels: #資源標籤(版本號)
app: nginx
spec: #資源相關資訊規範
replicas: 3 #副本數
selector: #選擇哪一個版本
matchLabels:
app: nginx
template: #模板
metadata: #資源的後設資料/屬性
labels: #設定資源的標籤
app: nginx
spec: #資源規範欄位(規範容器配置)
containers: #指定容器
- name: nginx #容器名稱
image: nginx #容器使用的映象
ports: #埠號
- containerPort: 80 #容器對應的埠號
nginx暴露service
apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中
kind: Service # 指定建立資源的角色/型別
metadata: # 資源的後設資料/屬性
name: service-tony # 資源的名字,在同一個namespace中必須唯一
namespace: default # 部署在哪個namespace中
labels: # 設定資源的標籤
app: demo
spec: # 資源規範欄位
type: NodePort # ClusterIP 型別
ports:
- port: 8080 # service 埠
targetPort: 80 # 容器暴露的埠
protocol: TCP # 協議
name: http # 埠名稱
selector: # 選擇器(選擇什麼資源進行釋出給外界進行訪問:pod deployment 等等資源)
app: nginx
附件
pod.yml詳解
# yaml格式的pod定義檔案完整內容:
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,後設資料
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的名稱空間
labels: #自定義標籤
- name: string #自定義標籤名字
annotations: #自定義註釋列表
- name: string
spec: #必選,Pod中容器的詳細定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的映象名稱
imagePullPolicy: [Always | Never | IfNotPresent] #獲取映象的策略 Alawys表示下載映象 IfnotPresent表示優先使用本地映象,否則下載映象,Nerver表示僅使用本地映象
command: [string] #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
args: [string] #容器的啟動命令引數列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內部的儲存卷配置
- name: string #引用pod定義的共享儲存卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #儲存卷在容器內mount的絕對路徑,應少於512字元
readOnly: boolean #是否為只讀模式
ports: #需要暴露的埠庫號列表
- name: string #埠號名稱
containerPort: int #容器需要監聽的埠號
hostPort: int #容器所在主機需要監聽的埠號,預設與Container相同
protocol: string #埠協議,支援TCP和UDP,預設TCP
env: #容器執行前需設定的環境變數列表
- name: string #環境變數名稱
value: string #環境變數的值
resources: #資源限制和請求的設定
limits: #資源限制的設定
cpu: string #Cpu的限制,單位為core數,將用於docker run --cpu-shares引數
memory: string #記憶體限制,單位可以為Mib/Gib,將用於docker run --memory引數
requests: #資源請求的設定
cpu: string #Cpu請求,容器啟動的初始可用數量
memory: string #記憶體清楚,容器啟動的初始可用數量
livenessProbe: #對Pod內個容器健康檢查的設定,當探測無響應幾次後將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設定其中一種方法即可
exec: #對Pod容器內檢查方式設定為exec方式
command: [string] #exec方式需要制定的命令或指令碼
httpGet: #對Pod內個容器健康檢查方法設定為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內個容器健康檢查方式設定為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動完成後首次探測的時間,單位為秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,預設1秒
periodSeconds: 0 #對容器監控檢查的定期探測時間設定,單位秒,預設10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略,Always表示一旦不管以何種方式終止執行,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
nodeSelector: obeject #設定NodeSelector表示將該Pod排程到包含這個label的node上,以key:value的格式指定
imagePullSecrets: #Pull映象時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路
volumes: #在該pod上定義共享儲存卷列表
- name: string #共享儲存卷名稱 (volumes型別有很多種)
emptyDir: {} #型別為emtyDir的儲存卷,與Pod同生命週期的一個臨時目錄。為空值
hostPath: string #型別為hostPath的儲存卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用於同期中mount的目錄
secret: #型別為secret的儲存卷,掛載叢集與定義的secre物件到容器內部
scretname: string
items:
- key: string
path: string
configMap: #型別為configMap的儲存卷,掛載預定義的configMap物件到容器內部
name: string
items:
- key: string
service.yml詳解
apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中
kind: Service # 指定建立資源的角色/型別
metadata: # 資源的後設資料/屬性
name: demo # 資源的名字,在同一個namespace中必須唯一
namespace: default # 部署在哪個namespace中
labels: # 設定資源的標籤
app: demo
spec: # 資源規範欄位
type: ClusterIP # ClusterIP 型別
ports:
- port: 8080 # service 埠
targetPort: http # 容器暴露的埠
protocol: TCP # 協議
name: http # 埠名稱
selector: # 選擇器
app: demo
Deployment.yml 詳解
apiVersion: extensions/v1beta1 #介面版本
kind: Deployment #介面型別
metadata:
name: cango-demo #Deployment名稱
namespace: cango-prd #名稱空間
labels:
app: cango-demo #標籤
spec:
replicas: 3
strategy:
rollingUpdate: ##由於replicas為3,則整個升級,pod個數在2-4個之間
maxSurge: 1 #滾動升級時會先啟動1個pod
maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
template:
metadata:
labels:
app: cango-demo #模板名稱必填
sepc: #定義容器模板,該模板可以包含多個容器
containers:
- name: cango-demo #映象名稱
image: swr.cn-east-2.myhuaweicloud.com/cango-prd/cango-demo:0.0.1-SNAPSHOT #映象地址
command: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #啟動命令
args: #啟動引數
- '-storage.local.retention=$(STORAGE_RETENTION)'
- '-storage.local.memory-chunks=$(STORAGE_MEMORY_CHUNKS)'
- '-config.file=/etc/prometheus/prometheus.yml'
- '-alertmanager.url=http://alertmanager:9093/alertmanager'
- '-web.external-url=$(EXTERNAL_URL)'
#如果command和args均沒有寫,那麼用Docker預設的配置。
#如果command寫了,但args沒有寫,那麼Docker預設的配置會被忽略而且僅僅執行.yaml檔案的command(不帶任何引數的)。
#如果command沒寫,但args寫了,那麼Docker預設配置的ENTRYPOINT的命令列會被執行,但是呼叫的引數是.yaml中的args。
#如果如果command和args都寫了,那麼Docker預設的配置被忽略,使用.yaml的配置。
imagePullPolicy: IfNotPresent #如果不存在則拉取
livenessProbe: #表示container是否處於live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨後kubelet將kill掉container,並根據RestarPolicy進行進一步的操作。預設情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;
httpGet:
path: /health #如果沒有心跳檢測介面就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 60 ##啟動後延時多久開始執行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
readinessProbe:
httpGet:
path: /health #如果沒有心跳檢測介面就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 30 ##啟動後延時多久開始執行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
resources: ##CPU記憶體限制
requests:
cpu: 2
memory: 2048Mi
limits:
cpu: 2
memory: 2048Mi
env: ##通過環境變數的方式,直接傳遞pod=自定義Linux OS環境變數
- name: LOCAL_KEY #本地Key
value: value
- name: CONFIG_MAP_KEY #局策略可使用configMap的配置Key,
valueFrom:
configMapKeyRef:
name: special-config #configmap中找到name為special-config
key: special.type #找到name為special-config裡data下的key
ports:
- name: http
containerPort: 8080 #對service暴露埠
volumeMounts: #掛載volumes中定義的磁碟
- name: log-cache
mount: /tmp/log
- name: sdb #普通用法,該卷跟隨容器銷燬,掛載一個目錄
mountPath: /data/media
- name: nfs-client-root #直接掛載硬碟方法,如掛載下面的nfs目錄到/mnt/nfs
mountPath: /mnt/nfs
- name: example-volume-config #高階用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名檔案,直接覆蓋。
mountPath: /etc/config
- name: rbd-pvc #高階用法第2中,掛載PVC(PresistentVolumeClaim)
#使用volume將ConfigMap作為檔案或目錄直接掛載,其中每一個key-value鍵值對都會生成一個檔案,key為檔名,value為內容,
volumes: # 定義磁碟給上面volumeMounts掛載
- name: log-cache
emptyDir: {}
- name: sdb #掛載宿主機上面的目錄
hostPath:
path: /any/path/it/will/be/replaced
- name: example-volume-config # 供ConfigMap檔案內容到指定路徑使用
configMap:
name: example-volume-config #ConfigMap中名稱
items:
- key: log-script #ConfigMap中的Key
path: path/to/log-script #指定目錄下的一個相對路徑path/to/log-script
- key: backup-script #ConfigMap中的Key
path: path/to/backup-script #指定目錄下的一個相對路徑path/to/backup-script
- name: nfs-client-root #供掛載NFS儲存型別
nfs:
server: 10.42.0.55 #NFS伺服器地址
path: /opt/public #showmount -e 看一下路徑
- name: rbd-pvc #掛載PVC磁碟
persistentVolumeClaim:
claimName: rbd-pvc1 #掛載已經申請的pvc磁碟
相關文章
- (精華)2020年10月3日 微服務 Docker-叢集(swarm)微服務DockerSwarm
- SpringCloud微服務專案搭建與部署教程SpringGCCloud微服務
- 2020 年微服務專案活躍度報告微服務
- 十一、Docker搭建部署SpringCloud微服務專案DemoDockerSpringGCCloud微服務
- k8s 部署 Java 專案K8SJava
- 微服務部署微服務
- 微服務從程式碼到k8s部署應有盡有大結局(k8s部署)微服務K8S
- Serverless與微服務探索(二)- SpringBoot專案部署實踐Server微服務Spring Boot
- 微服務專案實踐之中建專案微服務
- K8s微服務自動化部署容器(Rancher流水線)K8S微服務
- 微服務實踐Aspire專案釋出到遠端k8s叢集微服務K8S
- (精華)2020年7月10日 Node.js express(router路由的使用)Node.jsExpress路由
- 通過 docker-compose 一鍵部署一個微服務專案Docker微服務
- (精華)2020年6月28日 Canvas 進度條Canvas
- (精華)2020年8月18日 快取機制快取
- 微服務下的持續整合-Jenkins自動化部署GitHub專案微服務JenkinsGithub
- 微服務架構專案淺析微服務架構
- Blazor+Dapr+K8s微服務之基於WSL安裝K8s叢集並部署微服務BlazorK8S微服務
- (精華)2020年6月28日 Canvas 基礎知識Canvas
- (精華)2020年7月18日 vue clipboard複製剪下Vue
- (精華)2020年7月17日 vue mixins的使用Vue
- (精華2020年5月31日更新) react基礎篇 手寫ssr服務端渲染React服務端
- 微服務從程式碼到k8s部署應有盡有系列(七、支付服務)微服務K8S
- 微服務從程式碼到k8s部署應有盡有系列(十四、部署環境搭建)微服務K8S
- 微服務從程式碼到k8s部署應有盡有系列(一)微服務K8S
- 05 常見微服務專案結構微服務
- 小型專案的微服務架構指南微服務架構
- .NET平臺微服務專案彙集微服務
- (精華)2020年8月2日 TypeScript 裝飾器的使用TypeScript
- (精華)2020年6月26日 C#類庫model OptionListInputDTOC#
- (精華)2020年6月26日 C#類庫model RoleTypesC#
- (精華)2020年6月26日 C#類庫model DbTableInfoC#
- (精華)2020年6月26日 C#類庫model AjaxResultC#
- (精華)2020年6月26日 C#類庫model ErrorResultC#Error
- (精華)2020年6月26日 C#類庫model TableInfoC#
- (精華)2020年6月26日 C#類庫model BusExceptionC#Exception
- (精華)2020年6月26日 C#類庫model PageResultC#
- (精華)2020年6月26日 C#類庫model PageInputC#