1 简介:
Kubernets是Google公司基于内部集群管理系统Borg开源的容器几圈管理项目,基于go语言,试图为基于容器的应用部署和管理打造一套强大并且易用的管理平台。基于K8s可以很容易的实现一套PaaS 如Openshift和Deis,目前在github.com/kubernetes/kubernetes进行维护,最新版本为1.3.X
2.核心概念:
从架构上看K8s集群(Cluster)也采用了典型的主-从架构,一个几圈主要由管理组件Master和工作节点Node组件构成。且K8s集群的主要任务始终围绕着应用的生命周期,通过将不同的资源进行不同层次的抽象画,K8s提供了灵活可靠的生命周期管理。核心抽象主要包括了:
容器组(Pod):由位于同一节点上若干容器组成 ,彼此共享网络命名空间和存储卷(volume),Pod是K8s中进行管理的最小资源单元,是最为基础的概念,跟容器一样,Pod是短暂的,随时可变化的。
服务(service):若干Pod形成的对外提供某个功能的抽象,不随着Pod改变而改变。带有唯一固定的访问路径。如IP地址或者域名
复制控制器(Replication Controller):负责启动Pod,并维护起健康运行的状态。用户管理Pod句柄。
部署(Deployment):创建Pod,并可根据参数自动创建管理Pod的复制控制器,并且支持升级。
横向Pod扩展器(Horizontal pod autoscaler ,Hpa):类似云里面的自动扩展组,根据Pod的使用率自动调整一个部署里面Pod的个数,保证服务可用性;
详情百度K8s核心概念图
此外还有 注解 标签 名字 命令空间 持久卷 秘密数据 选择器 Demon集,任务 资源限额 安全上下文 服务账号等。
2 集群组件:
集群组件由使用K8s组件管理的一组节点组成,这些节点提供了容器资源池供用户使用。主要包括管理Master组件和node组件
2.1 master组件
提供所有与管理先关的操作,如调度,监控,支持对资源的操作等master会通过node controller来定期检查所管理的Node资源的健康状态完成Node的生命周期管理。
2.2 Node组件
在K8s中,Node是实际工作的计算实例。节点可以是虚拟机或者物理机,在创建K8s集群过程中,都要预装一些必要的软件来响应Master的管理,目前node的配置还只能通过人工手动进行,未来可以支持通过master来自动配置
node节点有几个重要的属性:地址信息,阶段状态,资源绒里,节点信息。其中地址信息包括了主机名(HostName):节点所在系统的主要别名,基本不会用到:外部地址(ExternalIp):集群外部客户端可以通过该地址访问到的节点;内部地址(InternalIp):集群内可以访问的地址,外部往往2无法通过该地址访问节点。阶段状态包括:待定(Pending):新创建节点,还未就绪状态,需要进一步的配置。运行中(running):正常运行中的节点,可以分配Pod,会定期汇报运行状态。终止(Terminated):节点已经停止,处于不可用状态,
2.2.2资产抽象
K8s对集群中的资源进行了不同级别的抽象,每一个资源都是一个REST对象,通过API进行操作通过JSON/YML格式文件进行定义,在使用K8s过程中,要注意积累这些模板文件,在K8s代码包的example目录下自带了十分详尽的示例模板文件,推荐使用。
1.容器组(Pod)
在K8s中,并不直接操作容器,最小的管理单位是容器组(Pod),容器组由一个或者多个容器组成,K8s围绕容器组进行创建、调度、停止等生命周期管理。同一个Pod中,各个容器共享命名空间,cgroups限制和存储卷。各个容器之间是可以互访的,如通过localhost地址进行网络访问,通过信号了和共享内存进行进程间通信等。简单的将一个Pod当做是一个抽象的虚拟机,里面运行若干个不同的进程(实际是容器)。实现上,是先创建一个gcr.io/google_containers/pause容器,创建相关命名
空间,然后创建Pod中的其他容器,共享pause容器的命名空间.容器组内的若干容器往往是存在␀同的应用目的,彼此关联十分紧密,例如一个Web应用和对应的日志采集应用或状态监控应用。如果单纯把这些相关的应用放一个容器里面,又会造成过度耦合,管理升级都不方便.跟其他资源类似,容器组是一个REST对象,用户可以通过YAML或者
JSON模板来定义一个容器组资源,例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx-test
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
P660
在Docker中启动Kubernetes
1.依赖镜像
Kubernetes通过Docker容器方式部署依赖的镜像包括:
·gcr.io/google_containers/hyperkube:提供所有的Kubernetes组件支持;
·gcr.io/google_containers/etcd:提供Etcd数据库存储;
·gcr.io/google_containers/pause:一个轻量级的基础设施容器(不到
1MB),用于为每个pod提前创建命名空间,其他什么也不做。
2.启动服务
首先,查看目前gcr.io/google_containers/hyperkube可选版本信息:
$ curl -k -s -X GET https://gcr.io/v2/google_containers/hyperkube-amd64/tags/
list | jq -r '.tags[]'
v1.2.0
v1.2.0
v1.2.0-alpha.6
v1.2.0-alpha.7
v1.2.0-alpha.8
v1.2.0-beta.0
v1.2.0-beta.1
v1.2.1-beta.0
v1.3.0-alpha.0
这里选用较新的稳定版本v1.2.0。
本地启动etcd服务,监听到默认的4001端口。读者可自行查阅前面的第22
章。也可以使用容器方式快速启动etcd服务:
$ docker run -d -p 4001:4001 gcr.io/google_containers/etcd
最后,可以通过如下命令来一次性部署并启动Kubernete需要的所有服务:
$ docker run \
--volume=/:/rootfs:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:rw \
--volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
--volume=/var/run:/var/run:rw \
--net=host \
--pid=host \
--privileged=true \
-d \
gcr.io/google_containers/hyperkube-amd64:v1.2.0 \
/hyperkube kubelet \
--containerized \
--hostname-override="127.0.0.1" \
--address="0.0.0.0" \
--api-servers=http://localhost:8080 \
--config=/etc/kubernetes/manifests \
--cluster-dns=10.0.0.10 \
--cluster-domain=cluster.local \
--allow-privileged=true --v=2
执行后查看本地实际启动容器,包括5个容器:1个kubelet容器和1个主服务Pod(包括apiserver、scheduler、controller- manager和pause):
实际上,Pod中的各个容器是在hyperkube-amd64:v1.2.0镜像中的/ etc/
kubernetes/manifests/master文件指定的,内容如下。注意不同版本镜像的文件
内容可能略有不同:
{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {"name":"k8s-master"},
"spec":{
"hostNetwork": true,
"containers":[
{
"name": "controller-manager",
"image": "gcr.io/google_containers/hyperkube:v1.2.0",
"command": [
"/hyperkube",
"controller-manager",
"--master=127.0.0.1:8080",
"--v=2"
]
},
{
"name": "apiserver",
"image": "gcr.io/google_containers/hyperkube:v1.2.0",
"command": [
"/hyperkube",
"apiserver",
"--service-cluster-ip-range=10.0.0.1/24",
"--address=127.0.0.1",
"--etcd-servers=http://127.0.0.1:4001",
"--cluster-name=kubernetes",
"--v=2"
]
},
{
"name": "scheduler",
"image": "gcr.io/google_containers/hyperkube:v1.2.0",
"command": [
"/hyperkube",
"scheduler",
"--master=127.0.0.1:8080",
"--v=2"
]
}
]
}
}
此时,在主机访问本地访问8080端口,将获取到支持的部分API列表:
$ curl localhost:8080
$ curl localhost:8080/version
$ curl localhost:8080/api/v1
安装部署:
脚本安装:
Kubernetes提供了自带的本地部署脚本(支持Ubuntu 14.04 LTS系统),其中包括三个节点:一个Master+Node,两个Node。通过Flannel方案作为后端网络实现