参考地址:
环境:
centos7
[fu@centos server]$ uname -aLinux centos 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
1,关闭centos自带防火墙
systemctl stop firewalld
systemctl disable firewalld
2.安装etcd和kubernetes 软件(自动安装)
添加yum源:
[root@centos fu]# cd /etc/yum.repos.d/[root@centos yum.repos.d]# lsCentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repoCentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo[root@centos yum.repos.d]# vi virt7-docker-common-release.repo[root@centos yum.repos.d]# yum install -y etcd kubernetes
virt7
-
docker
-
common
-
release
.
repo:
[virt7-docker-common-release]name=virt7-docker-common-releasebaseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/gpgcheck=0
安装 etcd与kubernetes:
[root@centos system]# yum install -y etcd kubernetes
3.安装完成后修改配制:
3.1 修改docker配制文件
[root@centos system]# vi /etc/sysconfig/docker
将:
OPTIONS='--selinux-enabled --log-driver=journald'
改为:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald'
3.2 修改hubernetes 配制文件
[root@centos system]# vi /etc/kubernetes/apiserver
把
--admission-control=后面的参数
ServiceAccount 删除掉
将:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
改为:
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
4.依次启动全部的服务:
[root@centos system]# systemctl start etcd[root@centos system]# systemctl start docker[root@centos system]# systemctl start kube-apiserver[root@centos system]# systemctl start kube-controller-manager[root@centos system]# systemctl start kube-scheduler[root@centos system]# systemctl start kubelet[root@centos system]# systemctl start kube-proxy
或者:
- kubelet kube-proxy
systemctl start etcd docker kube-apiserver kube-controller-manager kube-scheduler
好啦,安装完成!
5.运行测试案例:
Guestbook部署,最好是先将镜像pull下来,固然也能够交给kubernetees完成php
•redis-master: 用于前端Web应用进行“写”留言的操做,其中已经保存了一条内容为“Hello World!”的留言。
•guestbook-redis-slave: 用于前端Web应用进行“读”留言的操做,并与redis-master的数据保持同步。
•guestbook-php-frontend: PHP Web服务,在网页上展现留言内容,也提供一个文本输入框供访客添加留言。
#docker pull kubeguide/redis-master#docker pull kubeguide/guestbook-redis-slave#docker pull kubeguide/guestbook-php-frontend
咱们先建立pod ,而后定义与之关联的service
能够到git上下载所须的yaml文件:
而后统一运行:
cd 到存放目录
也能够一步步来,以下:
5.1 建立master-controller:redis-master-controller.yaml
apiVersion: v1kind: ReplicationControllermetadata: name: redis-master labels: name: redis-masterspec: replicas: 2 selector: name: redis-master template: metadata: labels: name: redis-master spec: containers: - name: master image: redis ports: - containerPort: 6379
运行 master-controller:
kubectl create -f redis-master-controller.yaml
5.2 建立master-service文件:redis-master-service.yaml
apiVersion: v1kind: Servicemetadata: name: redis-master labels: name: redis-masterspec: selector: name: redis-master ports: - port: 6379 targetPort: 6379
运行
master-service
:
kubectl create -f redis-master-service.yaml
5.3 建立:redis-slave-controller.yaml
[root@centos kube-guestbook]# cp /home/fu/redis-slave-controller.yaml /root/kube-guestbook/
apiVersion: v1kind: ReplicationControllermetadata: name: redis-slave labels: name: redis-slavespec: replicas: 2 selector: name: redis-slave template: metadata: labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave ports: - containerPort: 6379 env: - name: GET_HOSTS_FROM value: env
运行
slave-controller
:
[root@centos kube-guestbook]# kubectl create -f redis-slave-controller.yaml
5.4 建立 redis-slave-service.yaml:
[root@centos kube-guestbook]# cp /home/fu/redis-slave-service.yaml /root/kube-guestbook/
apiVersion: v1kind: Servicemetadata: name: redis-slave labels: name: redis-slavespec: selector: name: redis-slave ports: - port: 6379
运行:slave-service
[root@centos kube-guestbook]# kubectl create -f redis-slave-service.yaml
5.5 建立 frontend-controller.yaml:
[root@centos kube-guestbook]# cp /home/fu/frontend-controller.yaml /root/kube-guestbook/
apiVersion: v1kind: ReplicationControllermetadata: name: frontend labels: name: frontendspec: replicas: 3 selector: name: frontend template: metadata: labels: name: frontend spec: containers: - name: frontend image: kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80
运行
frontend-controller:
[root@centos kube-guestbook]# kubectl create -f frontend-controller.yaml
如遇到下面这些错,都是由于格式问题。复制时,空格或制表符都是很严格的
yaml: line 17: mapping values are not allowed in this context
error validating "redis-master-controller.yaml": error validating data: [found invalid field spec for v1.ReplicationControllerSpec, found invalid field labels for v1.PodTemplateSpec]; if you choose to ignore these errors, turn validation off with --validate=false
而后查看状态:
[root@centos kube-guestbook]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-rx769 0/1 ContainerCreating 0 3mredis-master-za6q6 0/1 ContainerCreating 0 3m[root@centos kube-guestbook]# kubectl get podsNAME READY STATUS RESTARTS AGEredis-master-rx769 0/1 ContainerCreating 0 3mredis-master-za6q6 0/1 ContainerCreating 0 3m
6.中止Pod和服务
kubectl stop rc redis-masterkubectl stop rc redis-slavekubectl stop rc frontendkubectl delete service redis-masterkubectl delete service redis-slavekubectl delete service frontend
6.1其余
kubectl get node 获取节点kubectl describe node xxx 详细信息
获取全部的pod (容器实例,docker container)
- [root@centos yum.repos.d]# kubectl get pods
获取全部的service (服务,selector 肯定把哪些pod对应到本服务)
[root@centos yum.repos.d]# kubectl get service
获取全部的RC,(rc根据template生成指定的pod实例)
[root@centos yum.repos.d]# kubectl get rc
最终效果:
你们有必要先理解Kubernetes几个核心概念及其承担的功能。如下为Kubernetes的架构设计图:

1. Pods
在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个被建立、销毁、调度、管理的最小的部署单元。好比一个或一组容器。
2. Replication Controllers
Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,每每一个应用须要多个Pod来支撑,而且能够保证其复制的副本数,即便副本所调度分配的宿主机出现异常,经过Replication Controller能够保证在其它主宿机启用同等数量的Pod。Replication Controller能够经过repcon模板来建立多个Pod副本,一样也能够直接复制已存在Pod,须要经过Label selector来关联。
3. Services
Services是Kubernetes最外围的单元,经过虚拟一个访问IP及服务端口,能够访问咱们定义好的Pod资源,目前的版本是经过iptables的nat转发来实现,转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。若是与咱们自建的平台进行整合?请关注下篇《kubernetes与HECD架构的整合》文章。
4. Labels
Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元自己进行操做时得使用name标签。
5. Proxy
Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。
说说我的一点见解,目前Kubernetes 保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不一样版本操做方法的差别,另外官网文档更新速度相对滞后及欠缺,给初学者带来必定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对我的私有云还未推出一套可行的接入解决方案。在v0.5版本中才引用service代理转发的机制,且是经过iptables来实现,在高并发下性能使人担心。但做者依然看好Kubernetes将来的发展,至少目前还未看到另一个成体系、具有良好生态圈的平台,相信在V1.0时就会具有生产环境的服务支撑能力。
1.Kubernetes介绍html
1.1 简介
Kubernetes是什么?
首先,它是一个全新的基于容器技术的分布式架构领先方案。
其次,它是一个开放的开发平台。
最后,它是一个完备的分布式系统支撑平台。
Kubernetes是Google团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为Go语言。
Kubernetes特色是:
•易学:轻量级,简单,容易理解
•便携:支持公有云,私有云,混合云,以及多种云平台
•可拓展:模块化,可插拔,支持钩子,可任意组合
•自修复:自动重调度,自动重启,自动复制。
Kubernets目前在https://github.com/kubernetes/kubernetes进行维护。
1.2 基本概念
•Node(节点):在Kubernetes中,节点是实际工做的点,较早版本称为Minion。节点能够是虚拟机或者物理机器,依赖于一个集群环境。每一个节点都有一些必要的服务以运行Pod容器组,而且它们均可以经过主节点来管理。在Node上运行的服务进程包括docker daemon,Kubelet和 Kube-Proxy。
•Pod(容器组):是Kubernetes的基本操做单元,把相关的一个或多个容器构成一个Pod,一般Pod里的容器运行相同的应用。Pod包含的容器运行在同一个节点上,看做一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。
•Pod的生命周期:Pod的生命周期是经过Replication Controller来管理的。在整个过程当中,Pod处于4种状态之一:Pending, Running, Succeeded, Failed。
•Replication Controller(RC):用于定义Pod副本的数量。确保任什么时候候Kubernetes集群中有指定数量的Pod副本在运行, 若是少于指定数量的Pod副本,Replication Controller会启动新的Pod,反之会杀死多余的以保证数量不变。
•Service(服务):一个Service能够看做一组提供相同服务的Pod的对外访问接口。
•Volume(存储卷):Volume是Pod中可以被多个容器访问的共享目录。
•Label(标签):用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller能够有多个label,可是每一个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是经过标识容器的labels来选择正确的容器。一样,Replication Controller也使用labels来管理经过pod 模板建立的一组容器,这样Replication Controller能够更加容易,方便地管理多个容器,不管有多少容器。
•Proxy(代理):是为了解决外部网络可以访问跨机器集群中容器提供的应用服务而设计的。Proxy提供TCP/UDP sockets的proxy,每建立一种Service,Proxy主要从etcd获取Services和Endpoints的配置信息,或者也能够从file获取,而后根据配置信息在Minion上启动一个Proxy的进程并监听相应的服务端口,当外部请求发生时,Proxy会根据Load Balancer将请求分发到后端正确的容器处理。
•Namespace(命名空间):经过将系统内部的对象“分配”到不一样的Namespace中,造成逻辑上的不一样分组,便于在共享使用整个集群的资源同时还能分别管理。
•Annotation(注解):与Label相似,但Label定义的是对象的元数据,而Annotation则是用户任意定义的“附加”信息。
1.3 组件
1.3.1 Master运行三个组件:
•apiserver:做为kubernetes系统的入口,封装了核心对象的增删改查操做,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
•scheduler:负责集群的资源调度,为新建的Pod分配机器。这部分工做分出来变成一个组件,意味着能够很方便地替换成其余的调度器。
•controller-manager:负责执行各类控制器,目前有两类:
(1)endpoint-controller:按期关联service和Pod(关联信息由endpoint对象维护),保证service到Pod的映射老是最新的。
(2)replication-controller:按期关联replicationController和Pod,保证replicationController定义的复制数量与实际运行Pod的数量老是一致的。
1.3.2 Worker运行两个组件:
•kubelet:负责管控docker容器,如启动/中止、监控运行状态等。它会按期从etcd获取分配到本机的Pod,并根据Pod信息启动或中止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报Pod的运行状态。
•proxy:负责为Pod提供代理。它会按期从etcd获取全部的service,并根据service信息建立代理。当某个客户Pod要访问其余Pod时,访问请求会通过本机proxy作转发。