在Kubernetes上進行微服務部署
大多數人在生產環境中執行Docker,是把它作為構建和移動部署配置的一種方式。然而,他們的部署模型要麼非常整體化,要麼有幾個大的服務模組組成。使用真實的容器化微服務最大的障礙在於,很多人不太清楚如何管理和協調容器大規模負載。今天我們將探討如何基於微服務部署來構建Kubernetes。作為google 長期經營的Borg專案的開源的繼承者,Kubernetes有將近10年的執行大規模負載的歷史了。雖然也存在一些缺點,但Kubernetes是現今最成熟的容器編排系統之一。
啟動Kubernetes環境
在Kubernetes官方文件中可以找到如何在不同環境下建立Kubernetes叢集,本文中我主要講解使用Rancher容器管理平臺來部署Kubernetes。首先設定Rancher server,選擇環境/預設>環境管理>新增環境。從容器編排選項中選擇並建立環境。然後選擇基礎設施(Infrastructure)>主機(Hosts) >新增主機(Add Host),且為Kubernetes創立幾個節點以便執行。
注意:為了執行Rancher 代理容器,我們建議至少新增3臺主機。當主機建立成功,你將會看到以下螢幕內容,幾分鐘內叢集建立成功並準備就緒。
使用Rancher來執行Kubernetes有很多優勢。大多數情況下能使使用者和IT團隊部署和管理工作更加方便。Rancher自動在Kubernetes後端實現etcd 的HA,並且將所需要的服務部署到此環境下的任何主機中。在設定訪問控制,可以輕易連線到現有的LDAP和AD基礎構架。Rancher還可以自動實現容器聯網以及為Kubernetes提供負載均衡服務。通過使用Rancher,你將會在幾分鐘內有擁有Kubernetes的HA實現。
名稱空間
現在我們的叢集已經運行了,讓我們進入並檢視一些基本的Kubernetes資源吧。你可以訪問Kubernetes叢集也可以直接通過kubectl CLI訪問,或者通過Rancher UI 訪問。Rancher的訪問管理圖層控制可以訪問叢集,所以你需要在訪問CLI前從Rancher UI那裡生成API密匙。
我們來看下第一個Kubernetes資源名稱空間,在給定的名稱空間中,所有資源名稱必須有唯一性。此外,標籤是用來連線劃定到單個名稱空間的資源。這就是為什麼同一個Kubernetes叢集上可以用名稱空間來隔離環境。例如,你想為應用程式建立Alpha, Beta和生產環境,以便可以測試最新的更改且不會影響到真正的使用者。最後建立名稱空間,複製下面的文字到namespace.yaml檔案,並且執行kubectl -f namespace.yaml
kind: Namespace
apiVersion: v1
metadata:
name: beta
labels:
name: beta
當然你還可以使用頂部的名稱空間選單欄從Rancher UI上建立、檢視和選擇名稱空間。
你可以使用下面的命令,用kubectl來為CLI互動設定名稱空間:
$ kubectl config set-context Kubernetes --namespace=beta.
為了驗證目前context是否已經被設定好,你可以使用config view命令,驗證一下輸出的名稱空間是否滿足你的期望。
$ kubectl config view | grep namespace command
namespace: beta
Pods
現在我們已經定義好了名稱空間,接下來開始建立資源。首先我們要看的資源是Pod。一組一個或者多個容器的Kubernetes稱為pod,容器在pod 裡按組來部署、啟動、停止、和複製。在給定的每個主機種類裡,只能有一個Pod,所有pod裡的容器只能在同一個主機上執行,pods可以共享網路名稱空間,通過本地主機域來連線。Pods也是基本的擴充套件單元,不能跨越主機,因此理想狀況是使它們儘可能接近單個工作負載。這將消除pod在擴充套件或縮小時產生的副作用,以及確保我們建立pods不太耗資源而影響到主機。
我們來給名為mywebservice的pod定義,在規範命名web-1-10中它有一個容器並使用nginx容器映象,然後把埠為80下的文字新增至pod.yaml文件中。
apiVersion: v1
kind: Pod
metadata:
name: mywebservice
spec:
containers:
- name: web-1-10
image: nginx:1.10
ports:
- containerPort: 80
使用kubetl create命令建立pod,如果您使用set-context command設定了您的名稱空間,pods將會在指定名稱空間中被創立。在通過執行pods命令去驗證pod狀態。完成以後,我們可以通過執行kubetl delete命令刪除pod。
$ kubectl create -f ./pod.yaml
pod "mywebservice" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mywebservice 1/1 Running 0 37s
$ kubectl delete -f pod.yaml
pod "mywebservice" deleted
在Rancher UI 中檢視pod,通過頂端的選單欄選擇Kubernetes > Pods。
Replica Sets
Replica Sets,顧名思義,它定義了每個pod副本執行有多少。Replica Sets還能監控並保障所需要pods數量正在執行,並將那些停止的pods替換掉。需要注意的一點是,Replica Sets是Replication Controllers的替代者,然而,在大部分案例中將不能直接使用Replica Sets設定,而是要使用Deployments。Deployments包裝了Replica Sets,在應用程式中設定並添加回滾更新升級功能。
部署
部署是一個用於管理你的應用程式回滾及更新的宣告機制。基於這點,我們用上述對pod 的定義來定義我們的第一次部署。唯一的區別是,我們採用name parameter作為我們容器的名稱,這個名稱將會被部署自動收集。下面的文字顯示我們用於部署的配置。你可以將它複製到deployment.yaml的文件中。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mywebservice-deployment
spec:
replicas: 2 # We want two pods for this deployment
template:
metadata:
labels:
app: mywebservice
spec:
containers:
- name: web-1-10
image: nginx:1.10
ports:
- containerPort: 80
用kubectl create命令啟動你的部署,然後驗證你的部署是否使用get deployments命令而成功了。
$ kubectl create -f ./deployment.yaml
deployment "mywebservice-deployment" create
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
mywebservice-deployment 2 2 2 2 7m
你可以使用describe deployment命令來顯示deployment的細節。在describe命令下,其中一個有用的輸出專案是一組事件。由describe命令得出的輸出,請見以下經刪減的例子。目前你的部署應顯示以下資訊:Scaled up replica set ... to 2
。
$ kubectl describe deployment mywebservice
Name: mywebservice-deployment
Namespace: beta
CreationTimestamp: Sat, 13 Aug 2016 06:26:44 -0400
Labels: app=mywebservice
.....
..... Scaled up replica set mywebservice-deployment-3208086093 to 2
擴充套件部署
你可以及早的更新deployment.yaml文件,用replicas:3替換replicas:2,來修改部署的規模,然後如下圖展示:執行apply命令。如果你再次執行describe deployment 命令,將會第二次看到這個資訊:Scaled up replica set mywebservice-deployment-3208086093 to 3
。
$ kubectl apply -f deployment.yaml
deployment "mywebservice-deployment" configured
更新部署
你可以靠改變映象版本來使用apply命令更新你的應用程式。先將映象nginx:1.10 替換成映象nginx:1.11,執行kubectl apply命令來修改deployment.yaml 文件。如果你再次運行了describe deployment命令,你會看到如下資訊。你可以看出來新的deployment (2303032576)是如何一步步進行擴充套件的,也可以看到舊的deployment (3208086093)如何縮小的。雖然圍繞在deployment的pod總數保持不變,但pods正逐漸從舊的deployment向新的deployment移動,這使得我們不中斷服務的情況下執行負載deployment。
Scaled up replica set mywebservice-deployment-2303032576 to 1
Scaled down replica set mywebservice-deployment-3208086093 to 2
Scaled up replica set mywebservice-deployment-2303032576 to 2
Scaled down replica set mywebservice-deployment-3208086093 to 1
Scaled up replica set mywebservice-deployment-2303032576 to 3
Scaled down replica set mywebservice-deployment-3208086093 to 0
如果在部署過程中或之後你意識到出現錯誤或者已經出現問題,可以使用rollout命令來取消之前的部署,這將執行反向操作,將負載移動至之前版本的容器。
$ kubectl rollout undo deployment/mywebservice-deployment
deployment "mywebservice-deployment" rolled back
Health check
利用部署,我們已經瞭解如何擴充套件我們的service,以及如何對他們進行部署。然而,當在生產環境中執行服務的時候,其中實時監控或更換服務例項也是非常重要的。Kubernetes提供Health check來解決問題。你可以在規定部分新增livenessProbe配置,來更新deployment.yaml文件。有三種liveness probe可供選擇:http、tcp和container exec。前兩者檢查Kubernetes是否能使http或者tcp連線至指定埠。container exec probe可用來執行容器裡的指定命令,並維護容器裡的停止響應程式碼。如下所示的程式碼片段中,我們使用http probe傳送Root URL,使用 GET請求到埠80。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mywebservice-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: mywebservice
spec:
containers:
- name: web-1-11
image: nginx:1.11
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
timeoutSeconds: 1
如果你用額外的health check重新建立你的部署,並且執行describe deployment的話,你將會看到Kubernetes現在會辨認出有3個replicas是不能使用的。如果你在初始延遲30秒後再次執行deployment,你會發現replicas現在標記為可用。在Kubernetes 開始路由擁堵前給你的應用程式啟動時間,這是為了確保你的容器是健康的。
$ kubectl create -f deployment.yaml
deployment "mywebservice-deployment" created
$ kubectl describe deployment mywebservice
...
Replicas: 3 updated | 3 total | 0 available | 3 unavailable
服務
既然現在我們擁有了在負載情況下可更新可擴充套件並且被監控著了的部署,現在是時候將這些服務展現給真實使用者了。拷貝以下內容至service.yaml的文件中。你的叢集中的每個節點暴露的埠都可使用Kube Proxy將路由堵塞轉移至replicas。
apiVersion: v1
kind: Service
metadata:
name: mywebservice
labels:
run: mywebservice
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
name: http
selector:
app: mywebservice
通過service.yaml文件,我們建立一個create命令服務,然後我們可以使用describe service 命令查詢Node Port。例如,在我們服務中可以使用任何 Kubernetes/Rancher 代理節點(agent nodes)訪問埠31673的應用程式。如果節點規模變大或者縮小,或變得不健康甚至重新啟動,Kubernetes將自動將流量路由到可用節點。
$ kubectl create -f service.yaml
service "mywebservice" created
$ kubectl describe service mywebservice | grep NodePort
NodePort: http 31673/TCP
這篇文章研究了名稱空間、pods、deployments和Services等一些基本的Kubernetes資源,還有如何手動擴充套件或縮小應用程式的規模,以及如何執行應用程式的回滾更新。最後為了從外部展示我們的應用程式,我們看了配置服務。在後續文章中,我們將關注如何協調使用這些資源並編排一個更實際的部署。我們將更細緻地探討如何設定SSL / TLS終端、多服務部署、服務發現、及應用要如何應對失敗場景等。
點選這裡報名參加11月6日成都「Docker & CI/CD技術沙龍」
相關推薦
在Kubernetes上進行微服務部署
大多數人在生產環境中執行Docker,是把它作為構建和移動部署配置的一種方式。然而,他們的部署模型要麼非常整體化,要麼有幾個大的服務模組組成。使用真實的容器化微服務最大的障礙在於,很多人不太清楚如何管理和協調容器大規模負載。今天我們將探討如何基於微服務部署來構建
使用Netsil監控Kubernetes上的微服務_Kubernetes中文社群
Kubernetes是容器編排和排程領域的王者,它擊敗了競爭對手Docker Swarm和Apache Mesos,開啟了閃耀的未來,微服務可以自修復,可以自動擴充套件,可以跨zone,region甚至跨雲供應商進行federate。在這樣的雲原生應用程式的新紀元裡,能夠以簡單的方式洞察服務之
Spring cloud開發的微服務部署到Linux上內存過高的問題
linux系統服務 內存參數 中間 size 但是 aps 內存占用 style 驗證 【問題描述】 在使用spring cloud過程中一個很嚴重的資源問題就是內存占用過高,而實際上開發測試並沒有很大的量,甚至卻出現了服務無法正常訪問的問題。 【原因分析】 主
docker微服務部署之:七、Rancher進行微服務擴容和縮容
href url http 部署 logs doc .html htm 服務 docker微服務部署之:六、Rancher管理部署微服務 docker微服務部署之:七、Rancher進行微服務擴容和
將微服務部署到 Azure Kubernetes 服務 (AKS) 實踐
> 本文是對 [《.NET Tutorial - Deploy a microservice to Azure》](https://dotnet.microsoft.com/learn/aspnet/deploy-microservice-tutorial/intro) 的翻譯和實踐。入門級踩坑實踐,k
微服務實戰(六):選擇微服務部署策略
因此 區別 嚴重 http 虛擬化 one rose 精確 命名空間 微服務實戰(一):微服務架構的優勢與不足 微服務實戰(二):使用API Gateway 微服務實戰(三):深入微服務架構的進程間通信 微服務實戰(四):服務發現的可行方案以及實踐案例 微服務實踐(五)
為什麼 kubernetes 天然適合微服務 (2)
此文已由作者劉超授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 三、微服務化的十個設計要點 微服務有哪些要點呢?第一張圖是 SpringCloud 的整個生態。 第二張圖是微服務的 12 要素以及在網易雲的實踐。 第三張圖是
為什麽 kubernetes 天然適合微服務 (3)
連接 paas client mic keys lse nor con 模塊 此文已由作者劉超授權網易雲社區發布。歡迎訪問網易雲社區,了解更多網易技術產品運營經驗 四、Kubernetes 本身就是微服務架構 基於上面這十個設計要點,我們再回來看 Kubernetes,會發
為什麼 kubernetes 天然適合微服務 (1)
此文已由作者劉超授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 最近總在思考,為什麼在支撐容器平臺和微服務的競爭中,Kubernetes 會取得最終的勝出,事實上從很多角度出發三大容器平臺從功能方面來看,最後簡直是一摸一樣。 參考 Docker
基於SpringCloud+不同主機上的微服務相互呼叫報錯:java.net.UnknownHostException:主機名
專案背景:採用Spring Cloud+IEDA+Maven搭建了由多個微服務組成的專案,部署上線是用的是Docker容器技術。 問題描述:部署上線過程中,各個微服務都正常啟動,而且都註冊到了eureka註冊中心,但是相互呼叫時報java.net.Unknown
一次微服務部署手冊
etc ipaddress web 單體 share erro -o oop inux 新一代數據訂閱系統部署手冊 1.系統介紹 關區新一代數據訂閱系統采用SpringBoot技術開發,基本的架構如下: 2.部署準備工作 首先將程序打包為一個單體JAR包
微服務部署之Maven外掛構建Docker映象
https://www.jianshu.com/p/f4c99b98851f1.背景微服務架構下,微服務在帶來良好的設計和架構理念的同時,也帶來了運維上的額外複雜性,尤其是在服務部署和服務監控上。單體應用是集中式的,就一個單體跑在一起,部署和管理的時候非常簡單,而微服務是一個網狀分佈的,有很多服務需要維護和管
基於kubernetes和SpringCloud微服務構建方案
很久沒有寫部落格了,不是因為最近學習鬆懈,而是因為發現自己以前寫的部落格大多都比較水,真正有意義、有價值的文章需要大量的學習與時間去積澱。以後儘量提高自己部落格的質量,走的再遠,工作再忙,也要堅持看書,堅持學習,成長的道路有多長?我想大概是一生。這篇文章算是我這
91APP新零售平臺實踐分享:靠Kubernetes實現IT微服務架構_Kubernetes中文社群
儘管多數是.NET系統,91APP也積極擁抱輕量級容器技術,通過“鄉村包圍城市”的策略,新興系統先擁抱容器,下一步想轉型更高彈性的微服務架構,關鍵就是匯入Kubernetes來管理複雜的容器叢集 臺灣知名的新零售平臺供貨商91APP,已有超過1萬家品牌企業,通過91APP平臺經營電商生意。為了
DevOps架構下如何進行微服務效能測試?
一. 微服務架構下的效能測試挑戰 微服務與DevOps 微服務是實現DevOps的重要架構 微服務3S原則 DevOps核心點 微服務架構下的業務特點 億級使用者的平臺 單服務業務隨時擴容 服務之間存在相互呼叫關係 版本更新快,上線週期短
如何把spring微服務部署為Windows Service並開機自動啟動
當採用spring boot完成微服務開發以後,作為windows service部署到伺服器,當出現問題,重啟伺服器就可以實現重啟微服務,這對於不熟悉程式設計和伺服器環境的使用者來說是最容易重啟微服務的方法。 如何將微服務部署為windows service總結下來包
白皮書:Amazon EC2 Container Service(ECS)上的微服務架構(下篇)
ECS上構建微服務架構 在構建微服務架構時面臨的一個主要問題就是,如果減輕執行、維護、擴充套件和管理微服務架構所需大規模分散式叢集資源的工作量和複雜性。目前主流的解決此問題的方案之一就是通過容器化部署和執行服務,降低運維和部署的複雜性。Amazon EC2 Container
Kubernetes安裝配置與服務部署
修改/etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379" KUBE_ADMISSION_CONTROL="
使用jMeter構造大量併發HTTP請求進行微服務效能測試
比如我開發好了一個微服務,想測試其在大併發請求下的效能表現如何。 比較方便的一個做法是使用工具jMeter來構造這些請求。 建立一個新的工程: 建立一個新的Thread Group,下圖意思是這個工程會使用3個執行緒同時發請求,每個請求執行一次。
【筆記】微服務部署:藍綠部署、滾動部署、灰度釋出、金絲雀釋出
在專案迭代的過程中,不可避免需要”上線“。上線對應著部署,或者重新部署;部署對應著修改;修改則意味著風險。 目前有很多用於部署的技術,有的簡單,有的複雜;有的得停機,有的不需要停機即可完成部署。本文的目的就是將目前常用的佈署方案做一個總結。 一、藍綠佈署 Blu