2022-10-03 分類: 網站建設
云原生!它終于來了。毫無疑問,云必將是未來數字世界最重要、也是最必不可少的基礎設施,每個程序員都應該要了解它,因為你的代碼大概率會運行在云上。接下來,我將以系列專題的形式從云原生的關鍵技術、微服務間通信方式、Serverless 架構等方面以淺顯易懂的語言來介紹云領域的相關知識,目的只有一個:當有人再整概念的時候,不管是干貨還是水貨,我們都能鑒別出來。
1、什么是云原生云原生不是一項具體的技術,它是一種行為方式和設計理念。凡是能夠提高云上資源利用率和應用交付效率的行為或方式都可以稱之為云原生的。云原生由一系列技術支撐起來的,代表技術包括容器、服務網格、微服務、不可變基礎設施和聲明式 API。
2、云原生代表技術 2.1、容器容器帶來的好處,不用多說,用過的都知道。容器使得應用服務能從底層架構中分離出來,實現了完全的可移植性(在任何操作系統或環境上運行應用的能力),當應用程序有很多獨立組件構成,也可以為每個組件分配一個容器。
2.2、微服務微服務是為了解決傳統單體應用的缺點而誕生的,它是一種分布式架構設計理念。它把應用程序中的具體功能獨立出來,抽象為『服務』。一個微服務就是一個獨立的實體,可以獨立的部署在 PAAS 平臺上,也可以作為一個獨立的進程在主機中運行。為了推動細粒度服務的使用,這些服務要能協同工作,每個服務都有自己的生命周期。服務之間可以通過網關 API、RPC(遠程服務調用)、SideCar(后續文章會介紹) 等多種方式訪問,修改一個服務不會影響其它服務。關于微服務,我之前的文章比較詳細地介紹過:從單體到微服務,論軟件系統如何逐步地進行解耦
2.3、服務網格服務網格(英文名:Service Mesh)是一個基礎設施層,用于處理服務間的通信,云原生應用有著復雜的服務拓撲,服務網格負責在這些拓撲中實現請求的可靠傳遞,在實踐中,服務網格通常實現為一組輕量級的網絡代理,它們與應用程序部署在一起,但對應用程序透明。
A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.”
- William Morgan
SideCar 由控制面和數據面構成,典型代表是istio,其中控制面采用的是envoy
Service Mesh 并不是指一項具體的技術,它是應用了某種技術(比如 SideCar)后呈現的形態。服務網格利用容器之間的網絡設置來控制或改變應用程序中不同組件之間的交互。
綠色表示純業務應用,藍色就是 SideCar
我們來看一個具體的例子:
假如你想測試 Nginx 的新版本,檢查它是否與你的 Web 應用兼容。你用新的 Nginx 版本創建了一個新的容器 (Container2),并從當前容器 (Container1) 中復制了當前的 Nginx webserver 配置。但你不想影響組成 web 應用的其他微服務(假設每個容器對應一個單獨的微服務)—— 就是 MySQL 數據庫、Node.js 前端、負載均衡器等。
所以使用服務網格,你可以立即只把 webserver 微服務改成 Container2(新 Nginx 版本的那個)進行測試。如果確定它不能工作,比如因為它導致網站出現一些兼容性問題,那么你就調用服務網格來快速切換回原來的 Container1。而這一切都不需要對其他容器進行任何配置變更 —— 這些變更對其他容器是完全透明的。
如果沒有服務網格,對容器來說這項工作將十分繁瑣,因為這涉及到逐一更改所有其他容器上的配置,將它們所包含的服務從 Container1 指向 Container2,然后在測試失敗后,將它們全部改回來。
2.4、不可變基礎設施K8s 中的不可變基礎設施就是 Pod,容器技術就是不可變基礎設施的一種具體實現。Chad Fowler 于 2013 年提出的一個很有前瞻性的構想:在這種模式中,任何基礎設施的實例(包括服務器、容器等各種軟硬件)一旦創建之后便成為一種只讀狀態,不可對其進行任何更改。如果需要修改或升級某些實例,唯一的方式就是創建一批新的實例以替換。
所以,不可變基礎設施是一個自包含、自描述可以完全在不同環境中遷移的東西。
2.5、聲明式設計Declarative(聲明式設計)是相對 Imperative 或 Procedural(過程式設計)而言的。在 Declarative 中,我們描述的是目標狀態(Goal State),而在 Imperative 模式中,我們描述的是一系列的動作。這一系列的動作如果被正確的順利執行,最終結果是這個事物達到了我們期望的目標狀態的。SQL 其實就是一種常見的聲明式『編程語言』,它能夠讓開發者自己去指定想要的數據是什么。
我們來看下述兩條命令:
docker service create--name nginx --replicas 2 nginx docker service update--image nginx:1.7.9 nginx用 Docker Swarm 啟動了兩個 Nginx 容器實例。其中,第一條 create 命令創建了這兩個容器,而第二條 update 命令則把它們『滾動更新』變成了一個新的鏡像。
那么,像上面這樣的創建和更新兩個 Nginx 容器的操作,在 K8s 里是怎么做的呢?
首先,需要在本地編寫一個 Deployment 的 yaml 文件:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - container Port: 80接下來,使用 kubectl apply 命令來創建這個 Deployment:
kubectl apply -f nginx.yaml這樣,Nginx 的 Deployment 就被創建了出來。然后,再修改一下 nginx.yaml 里定義的鏡像:
... spec: containers: - name: nginx image: nginx:1.7.9在修改完這個 yaml 文件之后,繼續執行如下 kubectl apply 命令:
kubectl apply -f nginx.yaml這時,K8s 就會立即觸發這個 Deployment 的『滾動更新』。kubectl apply 相當于執行了一個對原有 API 對象的 PATCH 操作??偨Y下:
所謂『聲明式』,指的就是我只需要提交一個定義好的 API 對象來『聲明』我所期望的狀態是什么樣子,具體該怎么操作才能達到我想要的狀態由工具內部實現;
『聲明式』 API 允許有多個 API 寫端,以 PATCH 的方式對 API 對象進行修改,而無需關心本地原始 yaml 文件的內容。
3、云原生能帶來什么云原生帶來的好處顯而易見:
敏捷 可靠 高彈性 易擴展 故障隔離保護 不中斷業務持續更新它能提升研發效率、加速日常迭代、加速新技術落地應用、方便自動化測試、降低運維成本,同時,面向微服務設計和動態資源管理,能夠讓集群資源得到最高效的利用。
分享標題:詳解云原生五大關鍵技術
當前地址:http://m.newbst.com/news6/201056.html
成都網站建設公司_創新互聯,為您提供手機網站建設、企業網站制作、外貿網站建設、響應式網站、微信小程序、網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯
猜你還喜歡下面的內容