设为首页 收藏本站
查看: 1348|回复: 0

[经验分享] Docker集群管理系统Kubernetes-ZJ的记事本

[复制链接]

尚未签到

发表于 2018-9-16 07:50:58 | 显示全部楼层 |阅读模式
  一、Kubernetes简介
  Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件,利用Kubernetes能方便地管理跨机器运行容器化的应用。而且Kubernetes支持GCE、vShpere、CoreOS、OpenShift、Azure等平台上运行,也可以直接部署在物理主机上。
  二、Kubernetes架构
DSC0000.jpg

  1. Pod
  在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个可以被建、销毁、调度、管理的最小的部署单元;
  Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;
  同一个Pod只能运行在同一个主机上;
  同一个Pod共享着相同的volumes,network命名空间。
  2. ReplicationController(RC)
  RC是用来管理Pod的,每个RC可以由一个或多个的Pod组成,在RC被创建后,系统将会保持RC中的可用Pod的个数与创建RC时定义的Pod个数一致,如果Pod个数小于定义的个数,RC会启动新的Pod,反之则会杀死多余的Pod;
  RC通过定义的Pod模板被创建,创建后对象叫做Pods(也可以理解为RC),可以在线的修改Pods的属性,以实现动态缩减/扩展Pods的规模或属性;
  RC通过label关联对应的Pods,通过修改Pods的label可以删除对应的Pods
  在需要对Pods中的容器进行更新时,RC采用一个一个的替换原则来更新整个Pods中的Pod.
  3、Service
  Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源;
  Service也是Kubernetes的最小操作单元,是真实应用服务的抽象;
  Service通常用来将浮动的资源与后端真实提供服务的容器进行关联;
  Service对外表现为一个单一的访问接口,外部不需要了解后端的规模与机制。
  Service其实是定义在集群中一组运行Pod集合的抽象资源,它提供所有相同的功能。当一个Service资源被创建后,将会分配一个唯一的IP(也叫集群IP),这个IP地址将存在于Service的整个生命周期,Service一旦被创建,整个IP无法进行修改。Pod可以通过Service进行通信,并且所有的通信将会通过Service自动负载均衡到所有的Pod中的容器。
  4、Label
  Labels是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、 Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签;
  Pod、Service、RC可以有多个label,但是每个label的key只能对应一个value;
  整个系统都是通过Label进行关联,得到真正需要操作的目标。
  5、Proxy
  Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。
  三、Kubernetes相关组件
  Kubernetes主要包括:kubectl、kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet,当然这些并不能组成一个完整的kubernetes系统,整个系统中的信息还需要一个存储介质Etcd,网络服务Flannel(可选)
  1.Kubectl
  一个命令行工具,将接收到的命令,格式化后,发送给kube-apiserver,作为对整个平台操作的入口。
  2.Kube-apiserver
  作为整个系统的控制入口,以RESTAPI的形式公开。它可以横向扩展在高可用架构中。
  3.Kube-controller-manager
  用来执行整个系统中的后台任务,它其实是多个控制进程的合体。大致包括如下:
  Node Controller    ##负责整个系统中node up或down的状态的响应和通知
  Replication Controller    ##负责维持Pods中的正常运行的pod的个数
  Endpoints Controller       ##负责维持Pods和Service的关联关系
  Service Account & Token Controllers     ##负责为新的命名空间创建默认的账号和API访问Token
  4.Kube-scheduler
  负责监视新创建的Pods任务,下发至未分配的节点运行该任务
  5.Kube-proxy
  kube-proxy运行在每个节点上,它负责整个网络规则的连接与转发,使kubernetes中的service更加抽象化
  6.Kubelet
  kubelet运行在每个节点上,作为整个系统的agent,监视着分配到该节点的Pods任务,(通过apiserver或者本地配置文件),负责挂载Pods所依赖的卷组,下载Pods的秘钥,运行Pods中的容器(通过docker),周期获取所有容器的可用状态,通过导出Pod和节点的状态反馈给REST系统
  7.Pod
  一组共享上下文的应用程序叫做一个pod,在上下文中,程序也可以应用单独的cgroup隔离。一个pod的模型就是一组运行指定应用的容器环境(逻辑主机),他可以容纳一个或多个应用程序,但是在一个容器世界里,这表现的相对较耦合。它们会运行在相同的物理主机或虚拟主机上
  pod中的上下文是结合Linux命令空间来定义的,这里包含:
  pod namespace(pod中的应用程序可以看到其他的进程)
  network namespace(应用程序获得相同的IP和端口空间)
  ipc namespace(pod中应用程序可以使用SystemV IPC或者POSIX消息队列来通信)
  uts namespace(pod中的应用程序共享主机名)
  资源共享和通信
  pod中所有的应用程序使用相同的网络命名空间,应用程序间可以使用localhost来发现其他程序及通信。每一个pod都有一个IP地址,用来和其他物理节点及跨网络的容器进行通信。
  pod作为部署的最小单位,支持水平扩展和复制.
  四、kubernetes各组件功能介绍
  角色             组件                                       功能
  Master         apiserver                         提供PESTful接口
  Master         scheduler              负责调度,将Pod分配到Slave节点
  Master     controller-manager            负责Master的其他功能
  Master           etcd                  存储配置信息,节点信息,pod信息等
  Slave           kubelet                     负责管理Pod、容器和容器镜像
  Slave            proxy      将访问Service的请求转发给对应的Pod,做一些负载均衡
  客户端          kubectl              命令行工具,向apiserver发起创建Pod等请求
  五、kubernetes安装
  1.yum安装
# yum -y install etcd kubernetes  2.升级(覆盖bin文件即可)
  ①升级etcd
# curl -L  https://github.com/coreos/etcd/releases/download/v2.2.3/etcd-v2.2.3-linux-amd64.tar.gz -o etcd-v2.2.3-linux-amd64.tar.gz  
# tar -zxvf etcd-v2.2.3-linux-amd64.tar.gz
  
# cd etcd-v2.2.3-linux-amd64
  
# cp etcd* /bin/
  
# etcd -version
  
etcd Version: 2.2.3
  
Git SHA: 05b564a
  
Go Version: go1.5.2
  
Go OS/Arch: linux/amd64
  
# etcd > /var/log/etcd.log 2>&1 &                ##启动etcd
  
# curl 127.0.0.1:4001/version
  
{"etcdserver":"2.2.3","etcdcluster":"2.2.0"}
  
#  etcdctl member list                ##查看etcd集群
  
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001
  ②升级kubernetes
# wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.2.0-alpha.5/kubernetes.tar.gz  
# tar -zxvf kubernetes.tar.gz
  
# cd kubernetes/server
  
# tar -zxvf kubernetes-server-linux-amd64.tar.gz
  
# cd kubernetes/server/bin/
  
# cp -a kubectl kubelet kube-controller-manager kube-scheduler kube-apiserver kube-proxy /usr/bin/
  a.运行kube-apiserver[systemctl start kube-apiserver]
# kube-apiserver --address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range='10.254.0.0/16' --kubelet_port=10250 --v=0 --logtostderr=false --log_dir=/var/log/kube --etcd_servers=http://127.0.0.1:4001 --allow_privileged=false &  
# kubectl version
  
Client Version: version.Info{Major:"1", Minor:"2+", GitVersion:"v1.2.0-alpha.5", GitCommit:"9c0e7775672b26ab2005db8651890a60253478e2", GitTreeState:"clean"}
  
Server Version: version.Info{Major:"1", Minor:"2+", GitVersion:"v1.2.0-alpha.5", GitCommit:"9c0e7775672b26ab2005db8651890a60253478e2", GitTreeState:"clean"}
  
# ss -tlnp|grep apiserver
  
LISTEN     0      128                      :::6443                    :::*      users:(("kube-apiserver",1811,27))
  
LISTEN     0      128                      :::8080                    :::*      users:(("kube-apiserver",1811,26))
  b.运行kube-scheduler[systemctl start kube-scheduler]
# kube-scheduler --v=0 --logtostderr=false --log_dir=/var/log/kube --master='127.0.0.1:8080' &  
# ss -tlnp|grep scheduler
  
LISTEN     0      128               127.0.0.1:10251                    *:*      users:(("kube-scheduler",1933,9))
  c.运行kube-controller-manager[systemctl start kube-controller-manager]
# kube-controller-manager --v=0 --logtostderr=false --log_dir=/var/log/kube  --port=10252 --master=127.0.0.1:8080 &  
# ss -tlnp|grep controller
  
LISTEN     0      128               127.0.0.1:10252                    *:*      users:(("kube-controller",1880,9))
  Minion(需先启动docker才能运行kubelet)
  a.运行kube-proxy[systemctl start kube-proxy]
# kube-proxy --v=0 --logtostderr=false --log_dir=/var/log/kube --master=http://master:8080 &  
# ss -tlnp|grep proxy
  
LISTEN     0      128               127.0.0.1:10249                    *:*      users:(("kube-proxy",1635,3))
  
LISTEN     0      128                      :::54921                   :::*      users:(("kube-proxy",1635,7))
  b.运行kubelet[systemctl start kubelet]
# kubelet --v=0 --logtostderr=false --allow-privileged=false --log_dir=/var/log/kube --address=0.0.0.0 --port=10250 --register-node=true --api_servers=mastr:8080 &  
# ss -tlnp|grep kubelet
  
LISTEN     0      128               127.0.0.1:10248                    *:*      users:(("kubelet",6277,14))
  
LISTEN     0      128                      :::4194                    :::*      users:(("kubelet",6277,11))
  
LISTEN     0      128                      :::10250                   :::*      users:(("kubelet",6277,18))
  
LISTEN     0      128                      :::10255                   :::*      users:(("kubelet",6277,15))
  Master
# kubectl get nodes              ##查看node清单  
NAME                    LABELS                         STATUS    AGE
  
127.0.0.1      kubernetes.io/hostname=127.0.0.1       NotReady   23d
  
localhost.localdomain   kubernetes.io/hostname=localhost.localdomain   NotReady   21d
  
minion        kubernetes.io/hostname=minion           NotReady   21d
  
# kubectl get pods                ##查看pods清单
  
NAME      READY     STATUS    RESTARTS   AGE
  
# kubectl get services             ##查看service清单
  
NAME         CLUSTER_IP   EXTERNAL_IP   PORT(S)   SELECTOR   AGE
  
kubernetes   10.254.0.1           443/TCP        4d
  
# kubectl get replicationcontrollers   ##查看replicationControllers清单
  
CONTROLLER   CONTAINER(S)   IMAGE(S)   SELECTOR   REPLICAS



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-584314-1-1.html 上篇帖子: 一 kubernetes 直连路由 OSPF 等价路由 下篇帖子: Kubernetes 安装配置笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表