1. 建立集羣html
Kubernetes集羣 node
Kubernetes協調一個高可用的計算機集羣,做爲一個單獨的單元來一塊兒工做。有了這種抽象,在Kubernetes中你就能夠將容器化的應用程序部署到集羣中,而沒必要將它們特定地綁定到單獨的機器上。爲了利用這種新的部署模型,應用程序須要以一種將它們與單個主機解耦的方式打包:它們須要被容器化。與過去的部署模型(PS:應用程序被直接安裝到特定的機器上)相比,容器化應用程序更加靈活和可用。Kubernetes以更高效的方式自動化分發和調度應用容器。Kubernetes是一個開源平臺,能夠投入生產。linux
Kubernetes集羣由兩類資源組成:web
集羣大概是這樣的:docker
Master負責管理集羣。Master協調集羣中的全部活動,好比調度應用程序、維護應用程序所需的狀態、擴展應用程序和推送新的更新。api
在一個Kubernetes集羣中,節點是一個虛擬機或物理機,它是做爲worker存在的。每一個節點都有一個Kubelet,它是一個代理,用於管理該節點和master之間的通訊。生產環境中,Kubernetes集羣應該至少有三個節點。服務器
當你部署應用程序到Kubernetes上時,你其實是告訴master啓動應用程序容器。master調度容器在集羣節點上運行。節點和master之間的通訊經過Kubernetes API來完成。終端用戶還能夠直接使用Kubernetes API與集羣交互。網絡
Kubernetes集羣能夠部署在物理機器或虛擬機器上。要學習Kubernetes的開發,可使用Minikube。Minikube是一個輕量級Kubernetes實現,它在本地機器上建立一個虛擬機,並部署一個只包含一個節點的簡單集羣。app
本節回顧(劃重點)負載均衡
Kubernetes是用於協調一個高可用的計算機集羣做爲一個總體單元的開源平臺,它的主要工做是協調應用程序容器的放置和執行。也就是說,Kubernetes屏蔽了底層的細節,使得一個集羣看起來就跟一臺機器同樣,就是這麼整齊劃一。理解了這一層之後,就很好理解爲何它能夠跨集羣節點自動調度了。(PS:想到一個例子,閱兵的時候,兵哥哥們組成一個方陣,步調一致,動做整齊劃一,那麼多人走在一塊兒就像一我的同樣。若是咱們把一臺機器想象成一個方陣中的一個兵哥哥的話,那麼一個集羣就是一個方陣,這個方陣改怎麼走就是Kubernetes要作的事情。)
一個集羣中有一個Master和多個Node。Master管理集羣,負責集羣中的全部活動。Node負責具體任務的執行,它是worker。每一個Node上都有一個Kubelet,用於和Master通訊。
敲黑板,劃重點:
一、Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit. 二、Kubernetes automates the distribution and scheduling of application containers across a cluster in a more efficient way. 三、Kubernetes is a production-grade, open-source platform that orchestrates the placement (scheduling) and execution of application containers within and across computer clusters. 四、Kubernetes集羣中有兩種類型的資源:Master 和 Nodes 五、The Master is responsible for managing the cluster. 六、A node is a VM or a physical computer that serves as a worker machine in a Kubernetes cluster. 七、Masters manage the cluster and the nodes are used to host the running applications.
2. 部署應用
Kubernetes Deployments
爲了將容器化的應用部署到Kubernetes集羣中,須要建立一個Kubernetes Deployment配置。Deployment指示Kubernetes如何建立和更新應用程序的實例。一旦建立了Deployment,Kubernetes master調度就會將應用程序實例放到集羣中的各個節點上。
應用程序實例被建立之後,Kubernetes Deployment Controller將會持續監視這些實例。若是承載實例的節點宕機或被刪除,部署控制器將使用集羣中另外一個節點上的實例替換該實例。這就提供了一種自我修復機制來處理機器故障或維護。
在預先編排的世界中,安裝腳本一般用於啓動應用程序,但它們沒法從機器故障中恢復。經過建立應用程序實例並讓它們跨節點運行,Kubernetes部署爲應用程序管理提供了一種徹底不一樣的方法。
可使用Kubernetes命令行接口Kubectl來建立和管理部署。Kubectl使用Kubernetes API與集羣交互。
建立部署的時候,須要爲應用程序指定容器鏡像和要運行的副本數量。固然,後續能夠經過更新部署來更改該信息。
本節回顧(劃重點)
Deployment就是將容器化的應用程序部署到Kubernetes集羣中。這個很好理解,就是咱們平時開發完打jar包部署到服務器上。
敲黑板,劃重點:
一、A Deployment is responsible for creating and updating instances of your application.
二、Applications need to be packaged into one of the supported container formats in order to be deployed on Kubernetes.
3. 查看應用
3.1. Pods
建立部署時,Kubernetes會建立一個Pod來承載應用程序實例。一個Pod是一個Kubernetes抽象,它表示一組(一個或多個)應用程序容器(例如:Docker),以及這些容器的一些共享資源。這些資源包括:
Pod爲一個特定應用程序的「邏輯主機」建模,並能夠包含不一樣的應用程序容器,這些容器是相對緊密耦合的。例如,一個Pod可能包含Node.js應用程序的容器和一個不一樣的容器,後者提供Node.js web服務器要發佈的數據。Pod中的容器共享一個IP地址和端口空間,老是同時定位和同時調度,並在同一節點上的共享上下文中運行。
Pods是Kubernetes平臺上的原子單位。當咱們在Kubernetes上建立部署的時候,這個部署會建立包含容器的Pods(而不是直接建立容器)。每一個Pod都綁定到預約的節點,並一直保持到終止(根據重啓策略)或刪除。萬一節點出現故障,集羣中其餘可用節點上調度相同的Pods將會被調度。
3.2. Nodes
Pod老是在節點上運行。節點是Kubernetes中的工做機,根據集羣的不一樣,它能夠是虛擬機,也能夠是物理機。每一個節點由Master管理。一個節點能夠有多個pod, Kubernetes Master跨集羣節點自動處理調度pod。Master的自動調度考慮到每一個節點上的可用資源。
每一個Kubernetes節點至少運行:
經常使用的kubelet命令:
# list resources
kubectl get
# show detailed information about a resource
kubectl describe
# print the logs from a container in a pod
kubectl logs
# execute a command on a container in a pod
kubectl exec
本節回顧(劃重點)
一個Pod是一組應用程序容器,包括運行這組容器所需的共享存儲、IP等資源。能夠這樣理解,將一組容器打包在一塊兒就是一個Pod。
Pod老是運行在Node上的。Node是一臺物理或虛擬機。
若是容器之間是緊密耦合的,而且須要共享磁盤等資源,那麼應該將它們放在單個(同一個)Pod中。
綜上所述,咱們不難理解:
也就是說,在節點上咱們看到的是一個一個的Pod,而Pod裏面是一個一個的容器
敲黑板,劃重點:
一、A Pod is a group of one or more application containers (such as Docker or rkt) and includes shared storage (volumes), IP address and information about how to run them.
二、Containers should only be scheduled together in a single Pod if they are tightly coupled and need to share resources such as disk.
三、A node is a worker machine in Kubernetes and may be a VM or physical machine, depending on the cluster. Multiple Pods can run on one Node.
4. 發佈應用
Pods也是有生命週期的。當一個工做節點(worker node)死亡時,該節點上運行的Pods也會隨之丟失。而後,副本集可能經過建立新pod來動態地將集羣恢復到所需的狀態,以保持應用程序的運行。Kubernetes集羣中的每一個Pod都有一個唯一的IP地址,即便是在同一個節點上的Pods,所以須要一種方法來自動協調Pods之間的變化,以保證應用程序正常運行。
Kubernetes中的Service是一個抽象,它定義了一組邏輯Pods和訪問它們的策略。Services支持有依賴關係的Pods之間的鬆散耦合。與全部Kubernetes對象同樣,Service是使用YAML(首選)或JSON定義的。哪些Pods被選中用來組成一個Service一般是由標籤選擇器決定的。
儘管每一個Pod都有惟一的IP地址,可是若是沒有Service,這些IP不會暴露在集羣以外。Service容許應用程序接收流量。經過在ServiceSpec中指定類型,能夠以不一樣的方式公開服務:
4.1. Services and Labels
Service在一組Pod之間路由流量。Services是容許Pod在Kubernetes中死亡和複製而又不影響應用程序的抽象。Pods之間的發現和路由,由Kubernetes Services來處理。
Services經過使用標籤和選擇器匹配Pods。標籤是附加到對象上的鍵/值對,能夠以多種方式使用:
標籤能夠在對象建立時或之後附加到對象,能夠隨時修改它們。
本節回顧(劃重點)
Kubernetes服務是一個抽象層,它定義一組Pods做爲一個邏輯單元併爲這些Pod啓用外部流量公開,負載平衡和服務發現。
多個容器組成一個Pod,多個Pod組成一個服務。服務是一種更高層次的抽象,它經過標籤和選擇器匹配一些Pods,這些被選中的Pods造成一個服務,共同對外提供服務。
再對比一下Pod和Service的定義:
A Pod is a Kubernetes abstraction that represents a group of one or more application containers (such as Docker or rkt), and some shared resources for those containers.
A Service in Kubernetes is an abstraction which defines a logical set of Pods and a policy by which to access them.
敲黑板,劃重點
一、A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.
二、You can create a Service at the same time you create a Deployment by using
--expose in kubectl.
三、A Service routes traffic across a set of Pods.
四、Services match a set of Pods using labels and selectors.
5. 擴展應用(擴容、伸縮)
5.1. Scaling an application
部署只建立了一個Pod來運行咱們的應用程序。當流量增長時,咱們須要擴展應用程序以知足用戶需求。
擴展是經過更改部署中的副本數量來實現的。
擴展部署將確保建立新Pod並將其調度到具備可用資源的節點上。縮放會將Pod的數量增長到新的所需狀態。Kubernetes還支持Pods的自動縮放。縮放到零也是可能的,它將終止指定Deployment的全部Pod。
運行一個應用程序的多個實例將須要一種將流量分配給全部實例的方法。 服務具備集成的負載均衡器,能夠將網絡流量分發到公開部署的全部Pod。服務將使用端點連續監視正在運行的Pod,以確保流量僅發送到可用Pod。
一旦運行了一個應用程序的多個實例,就能夠在不停機的狀況下進行滾動更新。
本節回顧(劃重點)
Scale(伸縮)是經過改變副本數量來實現的。伸縮會將Pod的數量增長到新的所需的狀態。當應用從一個實例變成多個實例後,服務自帶的負載均衡器會將流量分發到全部公開的Pods上。
敲黑板,劃重點:
一、Scaling is accomplished by changing the number of replicas in a Deployment.
二、You can create from the start a Deployment with multiple instances using the --replicas parameter for the kubectl run command.
6. 更新應用
6.1. Rolling updates
用戶指望應用程序一直可用,而開發人員指望天天屢次部署它們的新版本。在Kubernetes中,這是經過滾動更新來完成的。 滾動更新容許經過用新的Pod實例增量更新Pod實例,從而在零停機時間內進行Deployment的更新。新的Pod將被調度到具備可用資源的節點上。
默認狀況下,在更新過程當中不可用的Pod的最大數量和能夠建立的新Pod的最大數量爲1。這兩個選項均可以配置爲數字或百分比(按Pod)。 在Kubernetes中,對更新進行版本控制,而且任何部署更新均可以還原爲先前(穩定)的版本。
與應用程序擴展相似,若是公開部署,則該服務將在更新過程當中僅將流量負載均衡到可用Pod。可用的Pod是可供應用程序用戶使用的實例。
滾動更新容許執行如下操做:
本節回顧(劃重點)
滾動更新容許經過用新的Pod實例增量更新Pod實例,從而在實如今不停機(服務不中斷)的狀況下內進行Deployment的更新。
若是部署是公開公開的,則該服務將在更新期間僅將流量負載平衡到可用的Pod。
總之,一句話,滾動更新能夠實現平滑升級(平滑上線)。(PS:能夠聯想一下Nginx)
敲黑板,劃重點:
一、Rolling updates allow Deployments' update to take place with zero downtime by incrementally updating Pods instances with new ones.
二、If a Deployment is exposed publicly, the Service will load-balance the traffic only to available Pods during the update.
7. 命令和文檔
https://kubernetes.io/docs/tutorials/
# 安裝minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube
install minikube /usr/local/bin/
minikube version
# 部署應用
minikube start
kubectl version
kubectl cluster-info
kubectl get nodes
kubectl get deployments
kubectl get pods
kubectl describe pods
kubectl get services
kubectl delete service
kubectl expose
kubectl exec
kubectl scale
kubectl rollout status
7.1. Hello Minikube
啓動集羣
minikube start --image-mirror-country cn \
--vm-driver=virtualbox \
--iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.6.0.iso \
--registry-mirror=https://9q0y37ef.mirror.aliyuncs.com
7.2. 演示
首先,構建鏡像
新建一個文件命名爲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(8080);
再建立一個Dockerfile文件
FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js
構建鏡像
docker image build . -t hello-world
docker tag hello-world:latest cheng1234/hello-world:v1.0
docker login
docker push cheng1234/hello-world:v1.0
推送到遠程鏡像倉庫,這裏推到默認的Docker Hub上
半個小時之後,我後悔了,超級慢,根本推送不上去,速度慢得讓人想砸電腦,重試了好幾回。當成功推送上去的時候已是次日了。
後來,我想,畢竟是國外的。。。
遂決定,推送到阿里雲容器鏡像倉庫
docker login registry.cn-hangzhou.aliyuncs.com
docker tag hello-world:latest registry.cn-hangzhou.aliyuncs.com/chengjs/hello-world:1.0
docker push registry.cn-hangzhou.aliyuncs.com/chengjs/hello-world:1.0
部署服務
kubectl create deployment hello-world --image=registry.cn-hangzhou.aliyuncs.com/chengjs/hello-world:1.0
kubectl get deployments
kubectl get pods
kubectl expose deployment hello-world --type=LoadBalancer --port=8080
kubectl get services
minikube service hello-world
8. 阿里雲容器鏡像服務
https://cr.console.aliyun.com/
阿里雲
https://www.aliyun.com/product/acr
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
https://help.aliyun.com/document_detail/60743.html
https://help.aliyun.com/product/85222.html
https://developer.aliyun.com/group/kubernetes
Docker
https://docs.docker.com/engine/reference/commandline/image_build/
https://docs.docker.com/engine/reference/commandline/tag/
Kubernetes
https://kubernetes.io/docs/tutorials
https://kubernetes.io/docs/setup/best-practices/
鏡像加速器
https://www.jianshu.com/p/5a911f20d93e
https://blog.51cto.com/14423403/2417029
https://yq.aliyun.com/articles/696286
經常使用命令