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
经常使用命令