kubernetes主要概念介绍及一键部署(转载请注明出处)
2016-08-31 12:35
543 查看
author: | zqh |
---|---|
date: | 2016-8-26 |
什么是kubernetes
Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。
主要功能
将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题。
自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。
kubernetes角色组成
POD:Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成; 同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace。
ReplicationController(RC):
RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后, 系统会根据定义好的副本数来创建Pod数量。 在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod, 反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。
Service:
Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。 集合根据定义的Label和selector完成,当创建一个Service后, 会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。
Label:
Label是用于区分Pod、Service、RC的key/value键值对; Pod、Service、RC可以有多个label,但是每个label的key只能对应一个; 主要是将Service的请求通过lable转发给后端提供服务的Pod集合;
kubernetes组件
kubectl:客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。
kube-apiserver:
作为整个系统的控制入口,以REST API服务提供接口。
kube-controller-manager:
用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
kube-scheduler:
负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。
etcd:
负责节点间的服务发现和配置共享。
kube-proxy:
运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。
kubelet:
运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
DNS:
一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。
Tip
kubernetes简称k8s,下面部署中我们用k8s这个名称。
k8s部署过程
环境
宿主机以ubuntu16.04_raw镜像创建的openstack虚拟机两台
网络
可访问公网
目标
host | private ip | public ip | role | service |
---|---|---|---|---|
k8s-1 | 10.0.0.107 | 10.68.7.160 | master minon | etcd docker flannel kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy |
k8s-2 | 10.0.0.108 | NULL | minon | docker flannel kubelet kube-proxy |
准备工作
修改hosts文件>>> vim /etc/hosts
内容如下::
10.0.0.107 k8s-1 10.0.0.108 k8s-2
打通ssh
>>> ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:NvOph1CVJmmQfbNFYT5rRPJQQaoEPtwTyp8Tyn/qvKs root@k8s-1 The key's randomart image is: +---[RSA 2048]----+ | o+..o=Oo | | +.+=.*O. | | *.==.+= | | . =.=.. o | | o.S o | | .o = o | | ...+ | | ..+. | | EoB+ | +----[SHA256]-----+
>>> ssh-copy-id root@10.0.0.107 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host '10.0.0.107 (10.0.0.107)' can't be established. ECDSA key fingerprint is SHA256:zYRv0YqekuRHesQbrHLF4JXKlEYqRoKUQ48jMH/QKw4. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install t he new keys root @10.0.0.107's password: Numb er of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@10.0.0.107'" and check to make sure that only the key(s) you wanted were added.
Note
每个主机都要把自己的密钥复制到其它节点上,包括本机。
安装docker
Tip
gitlab上有部署docker的脚本,这里略过
准备k8s
下载k8s完整二进制包
https://storage.googleapis.com/kubernetes-release/release/v1.3.4/kubernetes.tar.gz https://github.com/kubernetes/kubernetes/releases/ 目前最新版本是v1.3.4,大小为1.4G
解压k8s压缩包
>>> tar xzf kubernetes.tar.gz
Note
解压后会在解压目录生成kubernetes目录。
解压salt
>>> tar zxf kubernetes/server/kubernetes-salt.tar.gz >>> cp -r kubernetes/saltbase kubernetes/cluster/saltbase
修改k8s安装脚本
Warning
在实际部署过程中遇到很多问题,通过修改脚本可以顺利安装。
修改common.sh
>>> vim kubernetes/cluster/common.sh >>> %s/python/python3/g
Note
common脚本中调用了python,实际环境中是python3,需要全部替换一下。
修改download-release.sh
Note
download-release脚本功能是curl联网下载需要安装的组件并做一些安装准备工作, 过程非常缓慢还会超时,我们可以注释掉下载的动作,手工下载组件到指定位置。
注释掉清理动作
function cleanup { # cleanup work # rm -rf flannel* kubernetes* etcd* binaries echo "cleanup not execute" # 函数不可空,随便添加一句,否则报错 } # trap cleanup SIGHUP SIGINT SIGTERM
注释掉下载flannel
# curl -L https://github.com/coreos/flannel/releases/download/v${FLANNEL_VERSION}/flannel-${FLANNEL_VERSION}-linux-amd64.tar.gz -o flannel.tar.gz
注释掉下载etcd
# curl -L https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${ETCD}.tar.gz -o etcd.tar.gz
注释掉获取k8s version并指定版本号
# KUBE_VERSION=$(get_latest_version_number | sed 's/^v//') KUBE_VERSION=1.3.4
注释掉下载k8s
# curl -L https://github.com/kubernetes/kubernetes/releases/download/v${KUBE_VERSION}/kubernetes.tar.gz -o kubernetes.tar.gz
注释掉删除动作
# rm -rf flannel* kubernetes* etcd*
修改utils.sh
修改kubelet选项
KUBELET_OPTS="\ --hostname-override=${1} \ --api-servers=http://${2}:8080 \ --logtostderr=true \ --cluster-dns=${3} \ --cluster-domain=${4} \ --pod-infra-container-image=vsc3.vsct.io/kubernetes/pause:latest \ --config=${5} \ $cni_opts"
Note
此处是修改默认镜像,k8s内部使用pause镜像启动容器, 这里会默认去gcr获取,gcr的域名被GFW封掉了,我们可先去 dockerhub上下载,然后push到私有registry上。
注释掉下载easy-rsa
# curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz > /dev/null 2>&1 >>> cp easy-rsa.tar.gz ~/kubernetes/cluster/
Note
easy-rsa包是用来生成访问https的证书的工具,我们同样下载下来,放到指定位置。
other
Note
脚本中对于服务的创建只把启动脚本放到/etc/init.d目录下, 并没有添加启动脚本,我们需要执行update-rc.d命令来添加脚本, 由于启动的地方比较多,这里不在修改脚本内容,放到安装完成后 手工添加并启动服务。
修改服务模块启动选项
切到ubuntu目录
>>> cd ~/kubernetes/cluster/ubuntu
修改启动脚本中的启动选项
>>> vim master/init_scripts/etcd >>> vim master/init_scripts/kube-apiserver >>> vim master/init_scripts/kube-controller-manager >>> vim master/init_scripts/kube-scheduler >>> vim minon/init_scripts/kubelet >>> vim minon/init_scripts/kube-proxy >>> vim master-flannel/init_scripts/flanneld >>> vim minion-flannel/init_scripts/flanneld
例:
ETCD_START="start-stop-daemon \ --start \ --background \ --quiet \ --exec $ETCD \ --make-pidfile \ --pidfile $ETCD_PIDFILE \ -- $ETCD_OPTS" # \ # >> $ETCD_LOGFILE 2>&1"
Note
服务在启动时会把重定向>>符当做选项来解析报错,注释掉后面的输出log和错误重定向。
开始安装
切换到群集安装目录>>> cd ~/kubernetes/cluster/ubuntu
执行安装脚本
>>> KUBERNETES_PROVIDER=ubuntu ./kube-up.sh ... Starting cluster using provider: ubuntu ... calling verify-prereqs Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) ... calling kube-up ~/kubernetes/cluster/ubuntu ~/kubernetes/cluster Prepare flannel 0.5.5 release ... Prepare etcd 2.3.1 release ... Prepare kubernetes 1.3.4 release ... Done! All your binaries locate in kubernetes/cluster/ubuntu/binaries directory ~/kubernetes/cluster Deploying master and node on machine 10.0.0.107 make-ca-cert.sh 100% 4028 3.9KB/s 00:00 easy-rsa.tar.gz 100% 42KB 42.4KB/s 00:00 config-default.sh 100% 5315 5.2KB/s 00:00 util.sh 100% 29KB 28.7KB/s 00:00 kubelet.conf 100% 644 0.6KB/s 00:00 kube-proxy.conf 100% 684 0.7KB/s 00:00 kubelet 100% 2163 2.1KB/s 00:00 kube-proxy 100% 2238 2.2KB/s 00:00 kube-controller-manager.conf 100% 744 0.7KB/s 00:00 etcd.conf 100% 709 0.7KB/s 00:00 kube-apiserver.conf 100% 674 0.7KB/s 00:00 kube-scheduler.conf 100% 674 0.7KB/s 00:00 etcd 100% 2079 2.0KB/s 00:00 kube-apiserver 100% 2363 2.3KB/s 00:00 kube-scheduler 100% 2365 2.3KB/s 00:00 kube-controller-manager 100% 2677 2.6KB/s 00:00 reconfDocker.sh 100% 2074 2.0KB/s 00:00 etcd 100% 16MB 15.9MB/s 00:00 flanneld 100% 16MB 15.8MB/s 00:00 etcdctl 100% 14MB 13.7MB/s 00:01 kube-apiserver 100% 105MB 104.6MB/s 00:01 kube-scheduler 100% 56MB 56.2MB/s 00:01 kube-controller-manager 100% 95MB 94.9MB/s 00:01 kubelet 100% 103MB 51.3MB/s 00:02 flanneld 100% 16MB 15.8MB/s 00:00 kube-proxy 100% 48MB 48.3MB/s 00:01 flanneld.conf 100% 577 0.6KB/s 00:00 flanneld 100% 2126 2.1KB/s 00:00 flanneld.conf 100% 568 0.6KB/s 00:00 flanneld 100% 2136 2.1KB/s 00:00 Warning: etcd.service changed on disk. Run 'systemctl daemon-reload' to reload units. {"Network":"172.16.0.0/16", "Backend": {"Type": "vxlan"}} Connection to 10.0.0.107 closed. Deploying node on machine 10.0.0.108 config-default.sh 100% 5315 5.2KB/s 00:00 util.sh 100% 29KB 28.7KB/s 00:00 reconfDocker.sh 100% 2074 2.0KB/s 00:00 kubelet.conf 100% 644 0.6KB/s 00:00 kube-proxy.conf 100% 684 0.7KB/s 00:00 kubelet 100% 2163 2.1KB/s 00:00 kube-proxy 100% 2238 2.2KB/s 00:00 kubelet 100% 103MB 102.6MB/s 00:01 flanneld 100% 16MB 15.8MB/s 00:00 kube-proxy 100% 48MB 48.3MB/s 00:00 flanneld.conf 100% 577 0.6KB/s 00:00 flanneld 100% 2126 2.1KB/s 00:00 Warning: flanneld.service changed on disk. Run 'systemctl daemon-reload' to reload units. Connection to 10.0.0.108 closed. Validating master Validating root@10.0.0.107 Validating root@10.0.0.108 Using master 10.0.0.105 cluster "ubuntu" set. user "ubuntu" set. context "ubuntu" set. switched to context "ubuntu". Wrote config for ubuntu to /root/.kube/config ... calling validate-cluster Found 2 node(s). NAME STATUS AGE 10.0.0.107 Ready 1h 10.0.0.108 Ready 1h Validate output: NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"} Cluster validation succeeded Done, listing cluster services: Kubernetes master is running at http://10.0.0.107:8080 kubernetes-dashboard is running at http://10.0.0.107:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Note
刚才提到,安装脚本中把启动脚本放到init.d路径下,没有更新脚本,如果在执行过程中卡住不动, 则是脚本在检查服务启动,而服务实际上没有启动成功,我们可以执行update-rc.d [服务名] defaults 来更新启动服务,此命令还可以控制启动顺序,比如docker必须在flannel后面启动。
测试master服务
刚才安装打印显示http服务在http://10.0.0.107:8080上,对应public ip是10.68.7.160,打开效果如下:
{ "paths": [ "/api", "/api/v1", "/apis", "/apis/apps", "/apis/apps/v1alpha1", "/apis/autoscaling", "/apis/autoscaling/v1", "/apis/batch", "/apis/batch/v1", "/apis/batch/v2alpha1", "/apis/extensions", "/apis/extensions/v1beta1", "/apis/policy", "/apis/policy/v1alpha1", "/apis/rbac.authorization.k8s.io", "/apis/rbac.authorization.k8s.io/v1alpha1", "/healthz", "/healthz/ping", "/logs/", "/metrics", "/swaggerapi/", "/ui/", "/version" ] }
部署dashboard
需要的yaml文件
>>> ls kubernetes/cluster/addons/dashboard dashboard-controller.yaml dashboard-service.yaml MAINTAINERS.md README.md
修改dashboard-controller.yaml
image: vsc3.vsct.io/larry0208/kubernetes-dashboard-amd64-google:v1.1.1
Note
默认镜像指向gcr,我们同样在docker hub上pull下此镜像放到私有registry上。 另外此yaml文件中一些名称的版本也修改成v1.1.1
创建命名空间
Note
安装k8s的时候已经默认创建了个kube-system命名空间, dashboard属于系统服务,所以这里不需要再创建命名空间。
创建pod
>>> kubectl -s 10.68.7.160:8080 create -f dashboard-controller.yaml
查看pod状态
>>> kubectl get pods -o wide --namespace=kube-system NAME READY STATUS RESTARTS AGE IP NODE kubernetes-dashboard-v1.1.1-a8dgy 1/1 Running 0 20h 172.16.17.2 10.0.0.108
创建service
>>> kubectl -s 10.68.7.160:8080 create -f dashboard-service.yaml
查看service状态
>>> kubectl --namespace=kube-system get ep kubernetes-dashboard NAME ENDPOINTS AGE kubernetes-dashboard 172.16.17.2:9090 20h
查看效果
在浏览器输入:http://10.68.7.160:8080/ui
相关文章推荐
- Kubernetes概念介绍和v1版本部署过程
- [zz]Xen 4.0新特性介绍(本文已投稿《微型计算机》,Superymk版权所有,转载注明出处)
- Kubernetes概念介绍和v1版本部署过程
- Play Framework介绍1--主要概念
- SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)
- 异步交互技术在工程中的运用与思考(一)iframe(原创 ,转载请注明出处)
- 2007年7月最受关注的20篇技术文章!(转载本文,请注明出处为CSDN)
- Core Aduio API--Vista中音量控制的新特点(原创,转载请注明出处)
- 动态表单——个人心得,转载请注明出处:http://blog.csdn.net/coolwzjcool
- 漂浮窗口之相对完善版(原创,转载请注明出处)
- SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(1)--说明篇(原创)(转载本文请注明出处)
- DataGridView绑定DataTable排序的误区(转载请注明出处)
- 抽象类和接口在语法和设计原则上的区别(原创,转载注明出处)
- 转载请注明出处!!
- 【原创】Quartus “Error: Project too complex: hierarchy path is too long ”解决办法(如需转载,请注明出处)
- 从考公务员的大军透视国民心态(待续……欢迎跟帖转载抄袭,请注明出处即可)
- Vista中服务运行与NT5的差别(原创,转载请注明出处)
- 正式声明:转载本Blog文章请注明原始出处和作者
- 引用请注明出处和转载请注明出处?我的看法
- S3C2450自动升级[原创作品,转载请注明出处]