kubernetes研究.docx
《kubernetes研究.docx》由会员分享,可在线阅读,更多相关《kubernetes研究.docx(18页珍藏版)》请在冰豆网上搜索。
kubernetes研究
文件状态:
【√】草稿
【】正式发布
【】正在修改中
类别
云计算
项目名称
Kubernetes研究
版本
日期
作者
备注说明
1.0
2016/03/28
程成
初稿
审核
密级
秘密
应用范围
陕西省信息化工程研究院软件研发部
版权所有
陕西省信息化工程研究院
Kubernetes研究
1.Kubernetes架构
Kubernetes是Google开源的容器集群管理系统。
它构建于docker技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等整一套功能,本质上可看作是基于容器技术的mini-PaaS平台。
本文旨在梳理Kubernetes的架构、概念及基本工作流,并且通过运行一个简单的示例应用来介绍如何使用Kubernetes。
1.1.操作对象
Kubernetes以RESTFul形式开放接口,用户可操作的REST对象有三个:
pod:
是Kubernetes最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。
比如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。
service:
是pod的路由代理抽象,用于解决pod之间的服务发现问题。
因为pod的运行状态可动态变化(比如切换机器了、缩容过程中被终止了等),所以访问端不能以写死IP的方式去访问该pod提供的服务。
service的引入旨在保证pod的动态变化对访问端透明,访问端只需要知道service的地址,由service来提供代理。
replicationController:
是pod的复制抽象,用于解决pod的扩容缩容问题。
通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。
通过replicationController,可以指定一个应用需要几份复制,Kubernetes将为每份复制创建一个pod,并且保证实际运行pod数量总是与该复制数量相等(例如,当前某个pod宕机时,自动创建新的pod来替换)。
1.2.功能组件
master运行三个组件:
●apiserver:
作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。
它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
●scheduler:
负责集群的资源调度,为新建的pod分配机器。
这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
●controller-manager:
负责执行各种控制器,目前有两类:
endpoint-controller:
定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
replication-controller:
定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
slave(称作minion)运行两个组件:
●kubelet:
负责管控docker容器,如启动/停止、监控运行状态等。
它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。
同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
●proxy:
负责为pod提供代理。
它会定期从etcd获取所有的service,并根据service信息创建代理。
当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转
2.Kubernetes部署
2.1.源码安装
●安装docker:
add-apt-repositoryppa:
docker-maint/testing
apt-getupdate
wget
shindex.html
●安装golang:
add-apt-repositoryppa:
gophers/go
apt-getupdate
apt-getisntallgolang
通过dpkg-Lgolang查看其安装位置
●kubernetes源码安装
cdkubernetes
hack/local-up-cluster.sh
./cluster/kubectl.shgetservices
2.2.编译好的安装包
手动执行以下命令:
./etcd
./kube-apiserver--etcd-servers=http:
//127.0.0.1:
4001--insecure-bind-address=0.0.0.0--service-cluster-ip-range=10.10.10.0/24--insecure-port=8080
./kube-scheduler--master=127.0.0.1:
8080
./kube-controller-manager--master=127.0.0.1:
8080--address=0.0.0.0
./kube-proxy--master=127.0.0.1:
8080
./kubelet--logtostderr=true--api_servers=http:
//127.0.0.1:
8080
2.3.获取pause镜像
Kubnetes在创造pod或replicationController时,需要基于pause镜像的底层容器,默认会到谷歌的kubernetes的官方仓库下载,往往出现超时错误,因此需要用下面的方法获取pause镜像
方法一:
dockerpulldocker.io/kubernetes/pause
dockertagdocker.io/kubernetes/pausegcr.io/google_containers/pause:
2.0
方法二:
kubelet的启动参数里面指定:
--pod-infra-container-image="gcr.io/google_containers/pause:
2.0"
方法三:
可在配置文件中将仓库改为私有仓库,在kubelet配置文件中指定。
KUBELET_OPTS="--address=0.0.0.0--port=10250
--pod-infra-container-image=docker3:
5000/pause:
latest--hostname_override=docker3
--api_servers=http:
//docker3:
8080
--logtostderr=true--cluster_dns=192.168.3.10
--cluster_domain=cluster.local"
3.kubernester-UI部署
3.1.获取UI镜像
由于谷歌的官方仓库gcr.io/google_containers/无法访问,本文将获取国内提供的kubernetes-UI镜像
dockerpull
3.2.部署kubernester-UI
(1)创建Namespace:
kube-system
执行命令:
kubectlcreate-fnamespace.yaml
apiVersion:
v1
kind:
Namespace
metadata:
name:
kube-system
(2)创建rc:
kube-ui-v5,(注意image键值改为本地的的kube-ui镜像)
执行命令:
kubectlcreate-fkube-ui-rc.yaml
查看创建完成的pod(因设定了空间,查询时也要加上namespace,否则无法显示):
kubectlgetpod--namespace=kube-system
(3)创建service:
kube-ui
执行命令:
kubectlcreate-fkube-ui-svc.yaml
(4)部署完成后,可在minion节点中通过dockerps查看到运行的kube-ui和pause容器。
(5)通过kubectlcluster-info查看kube-ui的运行地址
(6)界面显示
http:
//10.10.10.159:
8080/api/v1/proxy/namespaces/kube-system/services/kube-ui/
3.3.FAQ
本文在创建过程中采用单节点架构,其中容器都正常运行,但在浏览器上UI不能正常访问。
通过netstate–nltp查看apiserver的8080端口没有开放。
原因在于在启动kube-apiserve时指定--insecure-bind-address=0.0.0.0
重新启动kube-apiserve后端口8080被释放。
4.kube-dashboard部署
4.1.获取UI镜像
同样谷歌的官方仓库gcr.io/google_containers/无法访问。
本文将获取国内提供的kubernetes-dashboard镜像brainqi/kubernetes-dashboard-amd64:
v1.0.0。
dockerpullbrainqi/kubernetes-dashboard-amd64:
v1.0.0
dockertagbrainqi/kubernetes-dashboard-amd64:
v1.0.0gcr.io/google_containers/kubernetes-dashboard-amd64:
v1.0.0
4.2.部署kube-dashboard
(1)在kube的addons文件夹中包含创建kube-dashboard的service和ReplicationController文件。
cd/root/kubernetes/cluster/addons/dashboard
kubectlcreate-fnamespace.yaml(在创建kube-ui时执行过,不用执行)
catnamespace.yaml
apiVersion:
v1
kind:
Namespace
metadata:
name:
kube-system
kubectlcreate-fdashboard-controller.yaml--namespace=kube-system
kubectlcreate-fdashboard-service.yaml--namespace=kube-system
kubectlproxy--port=9090--address=0.0.0.0&
(2)查看创建好的services和ReplicationController。
kubectlgetservices--namespace=kube-system
kubectlgetReplicationController--namespace=kube-system
kubectldescribeservicekubernetes-dashboard--namespace=kube-system
kubectldescribeReplicationControllerkube-ui-v5-1--namespace=kube-system
查看kube-dashboard可访问地址:
kubectlcluster-info
(3)界面显示
4.3.FAQ
同样在部署过程中遇到kube-dashboard无法访问的问题,出现500错误。
其原因在于创建kube-dashboardReplicationController(rc)没有指定api-server地址。
添加args,值为--apiserver-host=http:
//10.10.10.159:
8080。
重新创建rc和svc后,成功访问。
5.dockerRegistry私有仓库
5.1.搭建私有仓库
Docker将私有仓库的运行封装为registry容器,本文在10.10.10.142上运行dockerregistry。
sudodockerpullregistry:
2.2#获取镜像
dockerrun-d-v/opt/registry:
/var/lib/registry-p5000:
5000--restart=always--nameregistryregistry:
2.2#生成registry容器
验证是否成功:
http:
//10.10.10.142:
5000/v2
http:
//10.10.10.142:
5000/v2/_catalog
5.2.使用私有仓库
成功搭建好私有仓库后,本节镜像私有仓库中镜像的上传和下载。
本文将在10.10.10.159节点上将ubuntu镜像上传道私有仓库10.10.10.142中,之后在10.10.10.160节点从私有仓库中获取ubuntu镜像。
(1)(10.10.10.159上操作)首先用dockertag将10.10.10.159节点上的镜像Ubuntu打上标签,注意要注明版本号。
dockertagubuntu:
14.0410.10.10.142:
5000/ubuntu:
14.04
(2)将ubuntu:
14.04镜像上传到10.10.10.142节点上。
dockerpush10.10.10.142:
5000/ubuntu:
14.04
上传完成后可在10.10.10.142的/opt/data/registry/images目录下查看
(3)在10.10.10.160上获取ubuntu:
14.04镜像
dockerpull10.10.10.142:
5000/ubuntu:
14.04
5.3.容器生成镜像
Docker提供将运行的容器提交生成新镜像的方法,即dockercommit<容器id>debian02#把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合)
将镜像直接保存为tar格式便于转存的启动节点中。
dockersavedebian02>/root/debian02.tar#debian02镜像打包
在另外的机器上导入镜像
dockerload6.kubenetes中常见问题
6.1.kubernetes常用命令
kubectlgetminions
查看minion主机
kubectlgetpods
查看pods清单
kubectlgetservices-ojson
查看service清单
kubectlgetreplicationControllers
查看replicationControllers清单
kubectldescribepodsapache
描述pods信息
kubectlproxy--port=9090--address=0.0.0.0&
后台释放9090端口
kubectlcluster-info
kubectlgetnamespace
kubectldeletepodredis-master
foriin`kubectlgetpod|tail-n+2|awk'{print$1}'`;
dokubectldeletepod$i;
done
#删除所有pods
描述pods信息:
kubectldescribepodsapache-test-3253166744-em9rz
6.2.kubernetesresfulAPI
Kubernetes提供的RESTfulAPI(推荐,及时性更高)。
官方APIhttp:
//kubernetes.io/docs/api-reference/v1/operations/。
可通过火狐浏览器restclien工具验证:
#查看kubernetes版本
curl-s-Lhttp:
//192.168.1.200:
8080/api/v1beta1/version|python-mjson.tool
#查看pods清单
curl-s-Lhttp:
//192.168.1.200:
8080/api/v1beta1/pods|python-mjson.tool
#查看replicationControllers清单
curl-s-Lhttp:
//192.168.1.200:
8080/api/v1beta1/replicationControllers|python-mjson.tool
#查查看minion主机
#curl-s-Lhttp:
//192.168.1.200:
8080/api/v1beta1/minions|python-mjson.tool
#查看service清单
#curl-s-Lhttp:
//192.168.1.200:
8080/api/v1beta1/services|python-mjson.tool
7.参考文献
(1)Ustack贡献的方案:
(2)梁工使用方案
(3)Kubernetes应用部署模型解析(部署篇)
(4)官网:
http:
//kubernetes.io/docs/getting-started-guides/locally/
(5)API
http:
//kubernetes.io/docs/api-reference/v1/operations/
(6)Kubernetesdashboard官网
http:
//kubernetes.io/docs/user-guide/ui/
(7)下载
(8)kubernetes初探
http:
//kubernetes.io/docs/api-reference/v1/operations/
(9)ubuntu安装单机版kubernetes
(10)kubernetes集群中部署kube-ui
http:
//dockone.io/article/623?
utm_source=tuicool&utm_medium=referral
(11)docker详细的基础用法
http:
//www.open-
(12)管理工具shipyard的详细使用指南
(13)dockerRegistry私有仓库
(14)guestbook官方
(15)Kubernetes管理Docker集群之部署篇
基于OVS的Kubernetes多节点环境搭建
时速云基于Kubernetes打造容器云平台的实践
kubernetes集群部署
Kubernetes入门(三)-网络
http:
//www.open-
基于Kubernetes构建Docker集群管理详解(刘天斯)
kubernetes(k8s)搭建实践
使用FIT2CLOUD在青云QingCloud快速部署和管理Kubernetes集群