Kubernets
是Google开源的容器集群系统,是基于Docker构建一个容器的调度服务,提供资源调度,均衡容灾,服务注册,动态伸缩等功能套件;node
Kubernets
提供应用部署,维护,扩展机制等功能,利用Kubernetes能方便地管理跨主机运行容器化的应用,其主要功能以下:python
Kubernetes
的我修复机制使得容器集群老是运行在用户指望的状态当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。docker
1)Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核; Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。 2)Mesos负责管理集群管资源(动态运行时,某机器有额外的资源,通知master来分配); Kubernetes抽象出新的容器组合模型而且对其编排管理(把容器自由组合提供服务这事儿搞定了,从而微服务,serverless等才真 正的优雅地在开发和运维之间不吵架地被实现),并且kubernetes把之前运维的不少很难搞的东西都变得容易了。好比OpenStack, Kubernetes是把OpenStack里面的VM换成了容器,可是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。 3)Mesos相比Kubernetes发展的时间更久,整体状况更成熟,在生产环境有更多的使用经验,国外使用Mesos的公司有Twitter,Apple, Airbnb,Uber等,国内也有大批知名公司在使用Mesos,好比:小米、当当、豆瓣、去哪儿、携程、惟品会、知乎、新浪微博、爱奇艺、 七牛、惟品会、bilibili、中国联通、中国移动、中国电信、华为、数人云等等。中大型公司会更倾向于使用Mesos, 由于自己这些公司有必定的开发能力,Mesos提供了良好的API并且有很是多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper 正常状况能够知足绝大部分需求,只须要写JSON或者DSL定义好service/application就好,只有一些特殊状况才确实须要写本身的Framework。 而kubernetes(k8s)如今也正在慢慢成熟起来,它在生产环境显然还须要更多时间来验证。京东目前已经在kubernetes上跑15W+容器了。 Mesos如今愈来愈适应而且被添加上了不少Kubernete的概念同时支持了不少Kubernetes的API。所以若是你须要它们的话,它将是对你的 Kubernetes应用去得到更多能力的一个便捷方式(好比高可用的主干、更加高级的调度命令、去管控很大数目结点的能力),同时可以很好的 适用于产品级工做环境中(毕竟Kubernetes任然仍是一个初始版本)。 4)若是你是一个集群世界的新手,Kubernetes是一个很棒的起点。它是最快的、最简单的、最轻量级的方法去摆脱束缚,同时开启面向集群开发的实践。 它提供了一个高水平的可移植方案,由于它是被一些不一样的贡献者所支持的( 例如微软、IBM、Red Hat、CoreOs、MesoSphere、VMWare等等)。 若是你已经有已经存在的工做任务(Hadoop、Spark、Kafka等等),Mesos给你提供了一个可让你将不一样工做任务相互交错的框架,而后混合进一个 包含Kubernetes 应用的新的东西。 若是你尚未用Kubernetes 系列框架完成项目的能力,Mesos给了你一个减压阀。
在kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象一个Pod,Pod是一个能够被建立,销毁,调度,管理的最小的部署单元,好比一个或一组容器。Pod是kubernetes的最小操做单元,一个pod能够由一个或多个容器组成;同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;shell
RC用来管理Pod,一个RC能够由一个或多个pod组成,在RC被建立后,系统会根据定义好的副本数来建立Pod数量。在运行过程当中,若是Pod数量小于定义的,就会重启中止的或从新分配Pod,反之则杀多余的。固然,也能够动态伸缩运行的Pods规模或熟悉。RC经过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。json
Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,每每一个应用须要多个Pod来支撑,而且能够保证其复制的
副本数,即便副本所调度分配的宿主机出现异常,经过Replication Controller能够保证在其它主宿机启用同等数量的Pod。Replication Controller
能够经过repcon模板来建立多个Pod副本,一样也能够直接复制已存在Pod,须要经过Label selector来关联vim
Service定义了一个Pod逻辑集合的抽象资源,Pod集合汇总的容器提供相同的功能。集合根据定义的Label和selector完成,当建立一个Service后,会分配一个Cluster ip,这个IP与定义的端口提供这个集合一个统一的访问接口,而且实现负载均衡后端
Services是Kubernetes最外围的单元,经过虚拟一个访问IP及服务端口,能够访问咱们定义好的Pod资源,目前的版本是经过iptables的nat转发来实现,
转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。centos
Label是用于区分Pod、Service、RC的key/value键值对;仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元自己进行操做时得使用name标签。Pod、Service、RC能够有多个label,可是每一个label的key只能对应一个;主要是将Service的请求经过lable转发给后端提供服务的Pod集合;api
客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,做为整个系统的操做入口。网络
做为整个系统的控制入口,以REST API服务提供接口
用来执行整改系统的后台任务,包括节点状态情况,pod个数,pods和service的关联等。
负责节点资源管理,接受来自kube-apiserver建立Pods任务,并分配到某个节点
负责节点间的服务发现和配置共享
运行在每一个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来作相应的策略
运行在每一个计算节点上,做为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
一个可选DNS服务,用于为每一个Service对象建立DNS记录,选择全部的Pod就能够经过DNS访问服务来。
根据上图可知Kubelet是Kubernetes集群中每一个Minion和Master API Server的链接点,Kubelet运行在每一个Minion上,是Master API Server和Minion之间的桥梁,接收Master API Server分配给它的commands和work,与持久性键值存储etcd,file,server和http进行交互,读取配置信息。Kubelet的主要工做是管理Pod和容器的生命周期,其包括Docker,Client,Root Directory,Pod Worders,Etcd Client,Cadvisor Client以及Health Checker组件,具体工做以下:
主机名 IP 节点及功能 系统版本 k8s-master 10.211.55.12 Master,etcd,registry centos 7.2 node1 10.211.55.21 Node1 centos 7.2 node2 10.211.55.22 Node1 centos 7.2
# 设置三台机器的主机名 Master上执行: [root@localhost ~]# hostnamectl --static set-hostname k8s-master Node1上执行: [root@localhost ~]# hostnamectl --static set-hostname node1 Node2上执行: [root@localhost ~]# hostnamectl --static set-hostname node2 # 在三台机器上都要设置hosts,均执行以下命令: [root@k8s-master ~]# vim /etc/hosts 10.211.55.12 k8s-master 10.211.55.12 etcd 10.211.55.12 registry 10.211.55.21 node1 10.211.55.22 node2 # 关闭三台机器上的防火墙 [root@k8s-master ~]# systemctl disable firewalld.service [root@k8s-master ~]# systemctl stop firewalld.service
1)先安装docker环境 [root@k8s-master ~]# yum install -y docker 配置Docker配置文件,使其容许从registry中拉取镜像 [root@k8s-master ~]# vim /etc/sysconfig/docker #添加下面一行内容 ...... OPTIONS='--insecure-registry registry:5000' [root@k8s-master ~]# systemctl start docker 2)安装etcd k8s运行依赖etcd,须要先部署etcd,下面采用yum方式安装: [root@k8s-master ~]# yum install etcd -y yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件: [root@k8s-master ~]# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak [root@k8s-master ~]# cat /etc/etcd/etcd.conf #[member] ETCD_NAME=master #节点名称 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #数据存放位置 #ETCD_WAL_DIR="" #ETCD_SNAPSHOT_COUNT="10000" #ETCD_HEARTBEAT_INTERVAL="100" #ETCD_ELECTION_TIMEOUT="1000" #ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001" #监听客户端地址 #ETCD_MAX_SNAPSHOTS="5" #ETCD_MAX_WALS="5" #ETCD_CORS="" # #[cluster] #ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380" # if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..." #ETCD_INITIAL_CLUSTER="default=http://localhost:2380" #ETCD_INITIAL_CLUSTER_STATE="new" #ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001" #通知客户端地址 #ETCD_DISCOVERY="" #ETCD_DISCOVERY_SRV="" #ETCD_DISCOVERY_FALLBACK="proxy" #ETCD_DISCOVERY_PROXY="" 启动etcd并验证状态 [root@k8s-master ~]# systemctl start etcd [root@k8s-master ~]# ps -ef|grep etcd etcd 28145 1 1 14:38 ? 00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001 root 28185 24819 0 14:38 pts/1 00:00:00 grep --color=auto etcd [root@k8s-master ~]# lsof -i:2379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME etcd 28145 etcd 6u IPv6 1283822 0t0 TCP *:2379 (LISTEN) etcd 28145 etcd 18u IPv6 1284133 0t0 TCP localhost:53203->localhost:2379 (ESTABLISHED) ........ [root@k8s-master ~]# etcdctl set testdir/testkey0 0 0 [root@k8s-master ~]# etcdctl get testdir/testkey0 0 [root@k8s-master ~]# etcdctl -C http://etcd:4001 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379 cluster is healthy [root@k8s-master ~]# etcdctl -C http://etcd:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379 cluster is healthy 3)安装kubernets [root@k8s-master ~]# yum install kubernetes 配置并启动kubernetes 在kubernetes master上须要运行如下组件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler [root@k8s-master ~]# cp /etc/kubernetes/apiserver /etc/kubernetes/apiserver.bak [root@k8s-master ~]# vim /etc/kubernetes/apiserver ### # kubernetes system config # # The following values are used to configure the kube-apiserver # # The address on the local server to listen to. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" # The port on the local server to listen on. KUBE_API_PORT="--port=8080" # Port minions listen on # KUBELET_PORT="--kubelet-port=10250" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies #KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" # Add your own! KUBE_API_ARGS="" [root@k8s-master ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak [root@k8s-master ~]# vim /etc/kubernetes/config ### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=false" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://k8s-master:8080" 启动服务并设置开机自启动 [root@k8s-master ~]# systemctl enable kube-apiserver.service [root@k8s-master ~]# systemctl start kube-apiserver.service [root@k8s-master ~]# systemctl enable kube-controller-manager.service [root@k8s-master ~]# systemctl start kube-controller-manager.service [root@k8s-master ~]# systemctl enable kube-scheduler.service [root@k8s-master ~]# systemctl start kube-scheduler.service
1)安装docker [root@node1 ~]# yum install -y docker 配置Docker配置文件,使其容许从registry中拉取镜像 [root@node1 ~]# vim /etc/sysconfig/docker #添加下面一行内容 ...... OPTIONS='--insecure-registry registry:5000' [root@node1 ~]# systemctl start docker 2)安装kubernets [root@node1 ~]# yum install kubernetes 配置并启动kubernetes 在kubernetes master上须要运行如下组件:Kubelet、Kubernets Proxy [root@node1 ~]# cp /etc/kubernetes/config /etc/kubernetes/config.bak [root@node1 ~]# vim /etc/kubernetes/config ### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow-privileged=false" # How the controller-manager, scheduler, and proxy find the apiserver KUBE_MASTER="--master=http://k8s-master:8080" [root@node1 ~]# cp /etc/kubernetes/kubelet /etc/kubernetes/kubelet.bak [root@node1 ~]# vim /etc/kubernetes/kubelet ### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=0.0.0.0" # The port for the info server to serve on # KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname-override=node1" #特别注意这个,在另外一个node2节点上,要改成k8s-node-2 # location of the api-server KUBELET_API_SERVER="--api-servers=http://k8s-master:8080" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" # Add your own! KUBELET_ARGS="" 启动服务并设置开机自启动 [root@node1 ~]# systemctl enable kubelet.service [root@node1 ~]# systemctl start kubelet.service [root@node1 ~]# systemctl enable kube-proxy.service [root@node1 ~]# systemctl start kube-proxy.service # 在master上查看集群中节点及节点状态 [root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node NAME STATUS AGE k8s-node-1 Ready 10m k8s-node-2 Ready 1m [root@k8s-master ~]# kubectl get nodes NAME STATUS AGE k8s-node-1 Ready 10m k8s-node-2 Ready 1m
查看node主机 [root@k8s-master ~]# kubectl get node //有的环境是用monion,那么查看命令就是"kubectl get minions" 查看pods清单 [root@k8s-master ~]# kubectl get pods 查看service清单 [root@k8s-master ~]# kubectl get services //或者使用命令"kubectl get services -o json" 查看replicationControllers清单 [root@k8s-master ~]# kubectl get replicationControllers 删除全部pods(同理将下面命令中的pods换成services或replicationControllers,就是删除全部的services或replicationContronllers) [root@k8s-master ~]# for i in `kubectl get pod|tail -n +2|awk '{print $1}'`; do kubectl delete pod $i; done -------------------------------------------------------------------------- 除了上面那种查看方式,还能够经过Server api for REST方式(这个及时性更高) 查看kubernetes版本 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/version | python -mjson.tool 查看pods清单 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/pods | python -mjson.tool 查看replicationControllers清单 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/replicationControllers | python -mjson.tool 查查看node主机(或者是minion主机,将下面命令中的node改为minion) [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/node | python -m json.tool 查看service清单 [root@k8s-master ~]# curl -s -L http://10.211.55.12:8080/api/v1beta1/services | python -m json.tool
1)安装Flannel(在master、node上均执行以下命令,进行安装) [root@k8s-master ~]# yum install flannel 2)配置Flannel(在master、node上均编辑/etc/sysconfig/flanneld) [root@k8s-master ~]# cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak [root@k8s-master ~]# vim /etc/sysconfig/flanneld # Flanneld configuration options # etcd url location. Point this to the server where etcd runs FLANNEL_ETCD_ENDPOINTS="http://etcd:2379" # etcd config key. This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_PREFIX="/atomic.io/network" # Any additional options that you want to pass #FLANNEL_OPTIONS="" 3)配置etcd中关于flannel的key(这个只在master上操做) Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,因此须要在etcd上进行以下配置:('/atomic.io/network/config'这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错) [root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.211.55.0/24" }' { "Network": "10.211.55.0/24" } 4)启动Flannel 启动Flannel以后,须要依次重启docker、kubernete。 在master执行: [root@k8s-master ~]# systemctl enable flanneld.service [root@k8s-master ~]# systemctl start flanneld.service [root@k8s-master ~]# service docker restart [root@k8s-master ~]# systemctl restart kube-apiserver.service [root@k8s-master ~]# systemctl restart kube-controller-manager.service [root@k8s-master ~]# systemctl restart kube-scheduler.service 在node上执行: [root@node1 ~]# systemctl enable flanneld.service [root@node1 ~]# systemctl start flanneld.service [root@node1 ~]# service docker restart [root@node1 ~]# systemctl restart kubelet.service [root@node1 ~]# systemctl restart kube-proxy.service 而后经过ifconfig命令查看maste和node节点,发现docker0网桥网络的ip已是上面指定的182.48.0.0网段了。而且在master和node节点上建立的容器间都是能够相互通讯的,能相互ping通!