1.docker的三种编排工具

Docker的第一类编排工具:

a.docker compose(docker原生):只能对一个主机上的容器进行编排,无法编排多个主机上的容器;

b.docker swarm(docker原生):可以对多个主机上的容器进行编排;

c.docker machine(docker原生):可以将一个主机迅速初始化到docker swarm集群里.

以上三个称为docker三剑客

Docker的第二类编排工具:

mesos:它不是docker的编排工具,而是资源分配工具,所以mesos必须要依赖于容器编排框架marathon.

Docker的第三类编排工具:

kubernetes(简称k8s):这个容器编排工具占据了80%以上的市场份额.

有了容器和容器编排技术,对持续集成(CI)、持续交付Delivery(CD)和持续部署Deployment(CD)的需求有了很大帮助,这也就是DevOps的理念,DevOps并不是一种技术,而是一种运动、一种文化、一种思想.

2.k8s介绍

k8s的代码托管在github之上:https://github.com/kubernetes/kubernetes/releases

特性:

a.可以自动装箱,即:可以自动完成容器的部署,而不影响可用性;
b.可以自我修复,如果容器崩溃了,可以1s内重新启动,有了k8s后,我们不再关注个体,而是关注群体;
c.可以自动实现水平扩展,一个容器不够,再启动一个;
d.可以自动实现服务发现和负载均衡,可以自动发现每个微服务之间的关系,也可以自动对容器内多个服务做负载均衡;
e.可以实现自动发布和回滚;
f.可以实现密钥和配置管理,也就是说每个容器不是加载容器内的配置文件,而是加载远程服务器上(配置中心)的配置文件;
g.可以实现存储编排;
h.可以实现任务的批量处理执行.

k8s是一个有中心节点架构的集群,由master节点(至少三个)和nodes节点(运行容器的节点)组成,客户的启动容器等请求会先发给master节点,master节点有个调度器会分析node节点资源(cpu、内存)的可用状态,找到最佳适配的node来启动用户请求的容器.

master上的第一个组件叫调度器(Scheduler),它的工作原理有两步:第一步调度器先做预选,即先评估有多少个node符合容器需求;第二步调度器再做优选,即在符合的node中选择一个最佳的node来运行容器.如果node宕机了,那么托管在node之上的所有容器也就不见了,此时k8s可以在其他节点上创建出来和宕机node上一模一样的容器.

另外,master上还有一个组件叫控制器,它会不停的Loop,用来周期性监控每个node的健康状态;控制器是有多个的(因为有至少三个master),master上还有一个组件叫控制器管理器(Controller-Mnager),控制器管理器用来监控每个控制器的健康.

在k8s上运行的最小单元不是容器,而是pod.pod可以理解为容器外壳,pod里面装的就是容器.一个pod里面可以放多个容器,这些容器可以共享一个底层的网络名称空间、存储卷,这样一来,pod对外更像一个虚拟机.

一般说来,一个pod里只放一个容器;如果一个pod必须要放多个容器,那么里面有一个是主容器,其他都是辅助容器,辅助容器主要是为了辅助主容器的主程序的某些功能而设置的.

一个pod里面的所有容器只能运行在一个node上,最终用户无需再关注pod运行在哪个node之上,这也就是云的概念,也就是把很多的node做为一个资源池,来进行统一管理.pod尽量由控制器管理,而不要手工管理.

3.pod可以分为两类

a.自主式pod:即自我管理的pod.创建Pod,首先交给Apiserver,然后调度器调度给指定的node节点.如果容器需要启动,由node上kubelet组件来完成;如果node发生故障,那么pod也就消失了.

b.控制器管理的Pod(建议创建这种Pod):这种Pod是有生命周期的对象.由master上的调度器将pod调度至某node进行运行或者停止,Replica Set(副本集控制器),但是该控制器并不直接使用,而是使用一个声明更新的控制器Deployment,这个也是用的最多的,Deployment控制器只能管理那些无状态的应用;有状态的应用是由Stateful Set控制器管理.

对于Deployment控制器,它还支持二级控制器,叫HPA(horizontalPodAutoscaler),该控制器可以自动水平扩展pod,也就是当一个pod压力大时,HPA控制器会自动水平扩展加几个新的pod来分解压力,具体加几个,HPA会根据当前节点的cpu、内存负荷来计算,一旦访问量小了,HPA还会自动减少pod个数;

如果我们想在一个Node上只运行一个副本,需要用DaemonSet控制器;

如果需要运行作业(如备份、清理数据等),需要conjob控制器.以上所讲的都是pod的控制器,用来管理不同类型的pod.

4.service

标签选择器(Lablel Selector)组件:是一个根据标签来过滤符合要求的资源机制,给pod打上标签(Lablel),可以实现分组效果.

客户端是通过service来找到pod的,service是通过pod的标签选择器来找到pod的.

service只是一个iptables方式的net地址转换路由规则,到了1.11版本,支持了ipvs方式的分发规则,支持各种调度算法,这也就实现了负载均衡,装完k8s,需要创建一个DNS pod,这是因为service的名字需要DNS服务器来解析,这种pod是k8s的组成部分,被称为k8s基础架构的pod,也被称为k8s的附件,英文名叫AddOns.这种DNS是用来解析service名字的,而不是pod的,DNS名称解析是K8s自动维护的,不需要人工干预.

一句话:service里面的地址存在于iptables net或者ipvs中,service是用来调度流量的,而不会启动或者停止容器.

pod的启动或者关闭、创建等是由控制器来做的,比如创建一个nginx pod,就得先创建一个nginx控制器,nginx控制器就会自动帮我们创建nginx pod;然后再创建一个nginx service,把nginx pod发布出去.

service有两种类型:一种是调度流量仅供k8s内部使用;另外一种则调度流量供k8s外部使用.

service是用来分发流量给pod,控制器是用来创建、启动和停止pod,标签选择器是让service根据标签来识别每个pod的.

5.网络

在k8s中,需要三种网络

a.各pod在一个网络中;
b.service在另外一个网络,即service的地址和pod的地址是不同网段的,
pod的地址是配置在pod内部的网络名称空间,是可以ping通的,
但service的地址是虚拟的,是假地址,只存在于iptables或者ipvs中.
c.node又存在于另外一个网络.
所以外部先到达node网络,然后再到service网络,最后才到pod网络.

pod之间怎么通信呢?同一个pod内的多个容器通过lo进行通信;

各pod之间通过overlay network(叠加网络)进行通信,即使pod之间跨主机,通信也没问题;

pod与service之间通过网关(也就是docker 零桥的地址)进行通信.

node上有个组件叫kube-proxy,它负责和ApiServer进行通信,kube-proxy一旦发现service背后的pod地址发生变化,就会改变service在ipvs中的pod地址,所以service的管理是靠kube-proxy来实现的.

kubelet--node上用于和master通信的一个组件,试图启动node上的容器,启动容器是由容器引擎来操作的,最流行的容器引擎是docker.

6.通信简介

在master(master是有多个的)上的数据并不存在master本地,而是存在共享存储DB中,这个共享DB叫etcd.etcd的数据以key-value形式存储,集群中所有状态信息都在etcd中,所以ectd要做冗余,一般至少三个节点,etcd通过https方式访问,etcd有一个端口用于集群内部通信(也就是和其它etcd通信),还有一个端口用于对ApiServer通信,所以etcd内部通讯需要点对点的专门证书,对ApiServer通信需要另外一套证书;ApiServer向客户端提供服务,需要一套证书;ApiServer和node上的kubelet组件和kube-proxy组件通信也需要CA证书,所以做K8s的部署,需要建立5个CA,这个比较考验功底.

把k8s归为以下三类节点:master、node(部署pod)和ectd(存储集群状态信息),彼此通过http或https进行通信,网络分为:pod网络、service网络和node网络.所以需要构建出三类网络,但是K8s自己不提供这三类网络,依赖于第三方插件CNI.

k8s通过CNI(容器网络接口)插件体系接入网络.目前常见的CNI插件是flannel,其实网络用于提供两个功能:一个是给pod、service等提供ip地址;另外就是提供网络测试的功能,来隔离不同Pod之间的通信.

flannel插件只支持网络配置(供ip地址的功能),不支持网络策略,CNI插件中的calico可以同时支持网络配置和网络策略,但是calico的部署和使用门槛比较高,于是,又有了第三个CNI插件canel,它用flannel提供网络配置,用calico提供网络策略.这些插件可以作为k8s之上的守护进程运行,也可以在k8s里面的容器运行.

名称空间--可以将不同种类的pod运行在不同的名称空间中.比如可以把名称空间分为开发名称空间、测试名称空间等,可以通过网络策略来定义名称空间之间、同一个名称空间的pod之间的网络行为.

参考博客:http://blog.itpub.net/28916011/viewspace-2213456/

k8s入门简介的更多相关文章

  1. K8s 入门

    中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84 小结大白话 Portainer 挺好 ...

  2. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  3. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. 掌握 Ajax,第 1 部分: Ajax 入门简介

    转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...

  6. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

  7. (转)Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

  8. NodeJS入门简介

    NodeJS入门简介 二.模块 在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. const http = require ...

  9. ASP.NET Core学习之一 入门简介

    一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问 ...

随机推荐

  1. Ubuntu 16.04系统安装步骤

    1.安装系统 2.设置更新源,自动检测最优更新源 3.关闭自动更新 4.设置终端样式 5.设置终端快捷键 6.安装vim,配置.vimrc 7.修改.bashrc第62行,小写w为大写W,设置终端不显 ...

  2. poj 1321 排兵布阵问题 dfs算法

    题意:有不规则地图,在上面放n个相同的棋子,要求摆放的时候不同行不同列.问:有多少种摆法? 思路:dfs+回溯 用一个book[]数组来表示当前列是否有放棋子 一行一行的遍历,对一行来说遍历它的列,如 ...

  3. luogu2394 yyy loves Chemistry I

    练习 #include <iostream> #include <cstdio> using namespace std; long double a; int main(){ ...

  4. const用法归纳总结 C++

    非常好的一篇分析const的总结归纳, 在此谢谢原作者:http://blog.csdn.net/zcf1002797280/article/details/7816977 在普通的非 const成员 ...

  5. 大数据学习——sparkRDD

    https://www.cnblogs.com/qingyunzong/p/8899715.html 练习1:map.filter //通过并行化生成rdd val rdd1 = sc.paralle ...

  6. day04_07 while循环01

    while循环结构: #while 条件: print("any") print("any") 死循环案例 num = 1 while num<=10 : ...

  7. ssh免密码登录远程服务器(不采用securecrt登录)

      http://blog.csdn.net/leexide/article/details/17252369       Linux/UNIX下使用ssh-keygen设置SSH无密码登录 标签:  ...

  8. [错误处理]UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    Stackoverflow 回答: 将byte类型转化:byte_string.decode('utf-8') Jinja2 is using Unicode internally which mea ...

  9. Hibernate框架简述(转)

    转自:http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html Hibernate的核心组件在基于MVC设计模式的JAVA WEB应用 ...

  10. iOS-----openGL--openGL ES iOS 入门篇2--->绘制一个多边形

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...