摘要:應用實例創建完成后,會持續監視這些實例。創建時,會創建了一個來托管應用。通過請求,可以從集群的外部訪問一個服務。使用云提供商的負載均衡器如果支持,可以向外部暴露服務。使用在中部署第一個應用本文以為例進行。目標是將簡單的應用部署在上運行。
Kubernetes是什么?
Kubernetes是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。可以在物理或虛擬機的Kubernetes集群上運行容器化應用,Kubernetes能提供一個以“容器為中心的基礎架構”。如果你曾經用過Docker容器技術部署容器,那么可以將Docker看成Kubernetes內部使用的低級別組件。Kubernetes不僅僅支持Docker,還支持Rocket,這是另一種容器技術。
通過Kubernetes你可以:
自動化容器的部署和復制
快速擴展應用
將容器組織成組,并且提供容器間的負載均衡
無縫對接新的應用功能
想理解Kubernetes集群,需要先搞明白其中的幾個重要概念。
DeploymentDeployment負責創建和更新應用,當創建Deployment后,Kubernetes master 會將Deployment創建好的應用實例調度到集群中的各個節點。
應用實例創建完成后,Kubernetes Deployment Controller會持續監視這些實例。如果管理實例的節點被關閉或刪除,那么 Deployment Controller將會替換它們,實現自我修復能力。
創建Deployment時,Kubernetes會創建了一個Pod來托管應用。Pod是Kubernetes中一個抽象化概念,由一個或多個容器組合在一起得共享資源。Pod是獨立運行的基本單位,包含一組容器和卷。同一個Pod里的容器共享同一個網絡命名空間,可以使用localhost互相通信。Pod是短暫的,不是持續性實體。
當在Kubernetes上創建Deployment時,該Deployment將會創建具有容器的Pods(而不會直接創建容器),每個Pod將被綁定調度到Node節點上,并一直保持在那里直到被終止(根據配置策略)或刪除。在節點出現故障的情況下,群集中的其他可用節點上將會調度之前相同的Pod。
一個Pod總是在一個(Node)節點上運行,Node是Kubernetes中的工作節點,可以是虛擬機或物理機。每個Node由 Master管理,Node上可以有多個pod,Kubernetes Master會自動處理群集中Node的pod調度,同時Master的自動調度會考慮每個Node上的可用資源。
Replication ControllerReplication Controller確保任意時間都有指定數量的Pod“副本”在運行。如果為某個Pod創建了Replication Controller并且指定3個副本,它會創建3個Pod,并且持續監控它們。如果某個Pod不響應,那么Replication Controller會替換它。如果在運行中將副本總數改為5,Replication Controller會立刻啟動2個新Pod,保證總數為5。
Service事實上,Pod是有生命周期的。當一個工作節點(Node)銷毀時,節點上運行的Pod也會銷毀,然后通過ReplicationController動態創建新的Pods來保持應用的運行。
舉個例子,考慮一個圖片處理 backend,它運行了3個副本,這些副本是可互換的 —— 前端不需要關心它們調用了哪個 backend 副本。也就是說,Kubernetes集群中的每個Pod都有一個獨立的IP地址,因此需要有一種方式來自動協調各個Pod之間的變化,以便應用能夠持續運行。
Kubernetes中的Service 是一個抽象的概念,它定義了Pod的邏輯分組和一種可以訪問它們的策略,讓你的這組Pods能被Service訪問。借助Service,可以方便的實現服務發現與負載均衡。
Service可以被指定四種類型:
ClusterIP - 在集群中內部IP上暴露服務。此類型使Service只能從群集中訪問。
NodePort - 通過每個 Node 上的 IP 和靜態端口(NodePort)暴露服務。NodePort 服務會路由到 ClusterIP 服務,這個 ClusterIP 服務會自動創建。通過請求
LoadBalancer - 使用云提供商的負載均衡器(如果支持),可以向外部暴露服務。外部的負載均衡器可以路由到 NodePort 服務和 ClusterIP 服務。(一般常用此類型向外暴露端口,并做負載均衡)
ExternalName - 通過返回 CNAME 和它的值,可以將服務映射到 externalName 字段的內容,沒有任何類型代理被創建。
Label你可以賦予標簽(鍵值對)來標識你的Pod、Deployment、Service。之后就可以通過選擇標簽來做具體的指令。
使用Minikube在kubernetes中部署第一個應用本文以 MAC OS X 為例進行。目標是將簡單的Hello World Node.js應用部署在Kubernetes上運行。因此你可能需要Node.js環境。
Minikube 是一個使我們很容易在本地運行 kubernetes 的工具,由Kubernetes社區開發。
Node.js
Docker
VM - VirtualBox
Minikube
Kubectl
對于Node.js、Docker、VirtualBox的安裝,在這里不做詳細介紹。可以直接到官網下載安裝最新穩定版本。
創建Minikube集群使用curl下載并安裝最新版本Minikube:
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
使用Homebrew下載kubectl命令管理工具:
$ brew install kubectl
默認的VM驅動程序VirtualBox,因此可直接啟動Minikube:
$ minikube start
接下來會打印出類似信息...
Starting local Kubernetes v1.9.4 cluster... Starting VM... Getting VM IP address... Moving files into cluster... Setting up certs... Connecting to cluster... Setting up kubeconfig... Starting cluster components... Kubectl is now configured to use the cluster. Loading cached images from config file.
驗證kubectl是否安裝成功:
$ kubectl cluster-info
會打印出類似的信息:
Kubernetes master is running at https://192.168.99.100:8443創建Node.js應用
編寫應用程序。將這段代碼保存在一個名為hellonode的文件夾中,文件名server.js:
var http = require("http"); var handleRequest = function(request, response) { console.log("Received request for URL: " + request.url); response.writeHead(200); response.end("Hello World!"); }; var www = http.createServer(handleRequest); www.listen(3000);
啟動應用:
$ node server.js
現在可以在 http://localhost:3000 中查看到“Hello World!”消息。
Ctrl-C停止正在運行的Node.js服務器。
在hellonode文件夾中創建一個Dockerfile命名的文件。
FROM node:8.10.0 EXPOSE 3000 COPY server.js . CMD node server.js
我們使用Minikube,而不是將Docker鏡像push到registry,可以使用與Minikube VM相同的Docker主機構建鏡像,以使鏡像自動存在。為此,請確保使用Minikube Docker守護進程:
$ eval $(minikube docker-env)
注意:如果不在使用Minikube主機時,可以通過運行eval $(minikube docker-env -u)來撤消此更改。
使用Minikube Docker守護進程build Docker鏡像:
$ docker build -t hello-node:v1 .創建Deployment
Kubernetes Deployment 是檢查Pod的健康狀況,如果它終止,則重新啟動一個Pod的容器,Deployment管理Pod的創建和擴展。
使用kubectl run命令創建Deployment來管理Pod。
$ kubectl run hello-node --image=hello-node:v1 --port=3000
查看Deployment:
$ kubectl get deployments
輸出:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-node 1 1 1 1 5s
查看Pod:
$ kubectl get pods
輸出:
NAME READY STATUS RESTARTS AGE hello-node-6ddb5576c9-644xn 1/1 Running 0 1m
查看deployment的詳細信息:
$ kubectl describe deployment創建Service
Pod只能通過Kubernetes群集內部IP訪問。要使hello-node容器能從Kubernetes虛擬網絡外部訪問,須要使用Kubernetes Service暴露Pod。
我們可以使用kubectl expose命令將Pod暴露到外部環境:
$ kubectl expose deployment hello-node --type=LoadBalancer
查看Service:
$ kubectl get services
輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.110.94.178080:32081/TCP 2m kubernetes ClusterIP 10.96.0.1 443/TCP 6d
查看詳細信息:
$ kubectl describe service hello-node
輸出:
Name: hello-node Namespace: default Labels: run=hello-node Annotations:Selector: run=hello-node Type: LoadBalancer IP: 10.110.94.17 Port: 8080/TCP TargetPort: 8080/TCP NodePort: 32081/TCP Endpoints: 172.17.0.5:8080 Session Affinity: None External Traffic Policy: Cluster Events:
通過--type=LoadBalancer 來在群集外暴露Service,在支持負載均衡的云提供商上,將配置外部IP(EXTERNAL-IP,在Minikube顯示為:
$ minikube service hello-node
將打開瀏覽器,在本地IP地址為應用提供服務,顯示“Hello World”的消息。
可以查看到日志:
$ kubectl logs擴展實例//exp: kubectl logs hello-node-6ddb5576c9-644xn // 可通過 kubectl get pods 查看pod-name
根據線上需求,擴容和縮容是常會遇到的問題。Scaling 是通過更改 Deployment 中的副本數量實現的。一旦有多個實例,就可以滾動更新,而不會停止服務。通過kubectl scale指令來擴容和縮容。
$ kubectl scale deployments/hello-node --replicas=4
在查看pods:
$ kubectl get pods
輸出:
NAME READY STATUS RESTARTS AGE hello-node-9f5f775d6-6qdmn 1/1 Running 0 3s hello-node-9f5f775d6-9mrm6 1/1 Running 0 3s hello-node-9f5f775d6-jxb8z 1/1 Running 0 3s hello-node-9f5f775d6-tx8kg 1/1 Running 0 11m
總共有4個實例,那么就可通過Service 的 --type=LoadBalancer 進行負載均衡。
更新應用程序編輯server.js文件以返回新消息:
response.end("Hello World Again!");
docker build新版本鏡像:
$ docker build -t hello-node:v2 .
Deployment更新鏡像:
$ kubectl set image deployment/hello-node hello-node=hello-node:v2
再次在瀏覽器查看消息:
$ minikube service hello-node清理刪除
刪除在群集中創建的資源:
$ kubectl delete service hello-node $ kubectl delete deployment hello-node
查看pods:
$ kubectl get pods
輸出:
NAME READY STATUS RESTARTS AGE hello-node-9f5f775d6-6qdmn 1/1 Terminating 0 6m hello-node-9f5f775d6-9mrm6 1/1 Terminating 0 6m hello-node-9f5f775d6-jxb8z 1/1 Terminating 0 6m hello-node-9f5f775d6-tx8kg 1/1 Terminating 0 18m
全部在停止中... 稍等一分鐘,再查看,輸出 No resources found.
停止$ minikube stop
輸出:
Stopping local Kubernetes cluster... Machine stopped.
完畢
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/32640.html
摘要:應用實例創建完成后,會持續監視這些實例。創建時,會創建了一個來托管應用。通過請求,可以從集群的外部訪問一個服務。使用云提供商的負載均衡器如果支持,可以向外部暴露服務。使用在中部署第一個應用本文以為例進行。目標是將簡單的應用部署在上運行。 Kubernetes是什么? Kubernetes是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。可以在物...
摘要:的核心是以容器為中心的管理環境。命名空間提供了名稱范圍。換句話說,確保或同類組始終可用。用于管理有狀態應用程序,它管理一組的部署和擴展,并提供有關這些的排序和唯一性的保證。 條分縷析帶你充分理解Kubernetes的各個細節與部分:它是什么,它如何解決容器編排問題,它包含哪些你必須掌握的關鍵對象,以及如何快速上手部署使用Kubernetes。 showImg(https://segme...
摘要:發布不到兩天,上數已近,這個業界大熱的史上最輕量的開源發行版,你試過了沒資深架構師來教你走出嘗鮮第一步使用教程在此前言昨天,正式發布了一款史上最輕量的開源發行版。大小只有,極簡,輕便,易于使用。 發布不到兩天,GitHub上Star數已近3000,這個業界大熱的、史上最輕量的開源Kubernetes發行版,你試過了沒? Rancher資深架構師來教你走出嘗鮮第一步!使用教程在此! sh...
摘要:本文分享了擴展以及管理混合云環境時可能遇到的挑戰,以及如何簡單高效地完成擴展。跨云擴展的挑戰你已經決定使用云了,所以讓我們回過頭來思考一下最初的問題。節點組件是中的。在向上或向下擴展或調整集群大小時,為部署命中公有,響應狀態代碼始終為。 流量突增時,我們需要擴展應用程序以滿足用戶需求。本文分享了擴展Kubernetes以及管理混合云環境時可能遇到的挑戰,以及如何簡單高效地完成Kuber...
摘要:公司始于名為的平臺即服務供應商。跨多個機器之間協調這些容器需要額外的工具,這稱之為容器編排。的核心優勢是為應用程序開發人員提供了用于編排無狀態容器的強大工具。有無數的文章都在討論和比較Docker、Kubernetes 以及Mesos。如果你是初學者,那么你可能會認為這三個開源項目正為了稱霸容器界而殊死搏斗。雖然這三種技術都使得使用容器部署、管理和伸縮應用成為可能,但實際上它們各自解決了不同...
閱讀 3697·2021-11-12 10:36
閱讀 3837·2021-09-22 15:48
閱讀 3549·2019-08-30 15:54
閱讀 2603·2019-08-29 16:44
閱讀 2371·2019-08-29 16:08
閱讀 2417·2019-08-29 16:06
閱讀 1291·2019-08-29 15:21
閱讀 3177·2019-08-29 12:39