运行环境
ubuntu 14.04
minikube version: v0.19.0
Docker version 1.12.1
安装minikube
minikube是kubernetes的单机试玩版。
Step 1
首先需要安装一个虚拟机软件,这里采用了VirtualBox。
Step 2
安装kubernetes的命令行工具kubectl
。
下载kubectl:
|
|
配置到环境中:
|
|
检查是否正常运行:
|
|
Step 3
下载并安装minikube:
|
|
deployment
Deployment可以来创建和更新一个app。
|
|
Pod和Node
Pod 表示了一组关系密切的容器,这些容器之间会共享一些资源,如存储资源、网络、端口等。
Pod运行在一个Node上,Node指一个物理机器或者一个虚拟机。Master负责管理Node,将Pod分配到Node上。Kubelet
负责Master和Node之间的通信。Container runtime (like Docker, rkt)负责获取容器镜像和运行容器。
Service
Service定义了一组pod的逻辑关系,并且设置了访问这些pod的策略。Pod拥有独立的IP,不对外暴露,Service负责将对外暴露地址。根据不同的暴露方式,Service被分为如下几类:
- ClusterIP(默认):在集群中暴露一个内容IP,所以只有在集群内部可以访问service。
- NodePort:使用NAT,暴露与集群中所选的Node的port相同的port。让外部可以通过集群IP的超集访问Service。
- LoadBalancer:在当前云中创建一个负载平衡器,并且给定一个外部IP给这个service。
- ExternalName:Exposes the Service using an arbitrary name (specified by externalName in the spec) by returning a CNAME record with the name. No proxy is used. This type requires v1.7 or higher of kube-dns.
A Kubernetes Service sis an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.
Service使用label和selector来匹配一组pod。label是一组key/value对,可以标记对象是开发版、测试版还是发布版,还可以标记版本号等。label可以在创建是赋予,也可以后随时更改。
假设集群中已经有一个deployment kubernetes-bootcamp。
添加service:
给pod打标签:
通过标签获取pod
删除services:
app扩展和缩减
前面的例子中,一个app只有一个pod和一个容器。有时候,我们会根据需要,扩展和缩减一个app的规模。
将原来的deployment扩展到4个副本:
Deployment数量发生变化:
Pod数量也发生改变:
通过定义的service暴露的端口,可以访问kubernetes-bootcamp应用,可以发现请求被发送到不同的pod上,从而体现了负载均衡的实现。
将app实例缩减到2个:
app更新
Rolling updates
可以增量的将pod更新到新版本,并且app不会因此中断。
在更新的时候,service会将业务负载平衡到可获得的pod上面。Rolling updates
支持以下操作:
- Promote an application from one environment to another (via container image updates)
- Rollback to previous versions
- Continuous Integration and Continuous Delivery of applications with zero downtime
下面来更新kubernetes-bootcamp应用的版本来体会一下更新的过程。
|
|
可以观察到如下更新过程:
|
|
如果新pod更新失败,则旧pod不会被全部杀死,至少会保留一个维持正常运行。docker pull jocatalin/kubernetes-bootcamp
测试更新后的效果。
首先获取service暴露的端口,31645:
获取节点IP:
发送请求,可以看到app服务版本确实更新了:
回滚,恢复到更新之前。
|
|