零、前置说明

一些镜像是国外的,你可能没有科学上网,下载不了的话,可以上网找找其它的镜像代替,是别人下载好的一样的,只是tag不同,当然我强烈建议你使用阿里云的,阿里云这些镜像肯定都是有的
比如,下面这个,你到阿里云镜像仓库中找这个名称,换了tag就行,又快又好用
在这里插入图片描述

一、整体说明

镜像资源管理工具 Docker SwarmMESOS APACHE

  • 2019-5 Twitter 将 MESOS APACHE 分布式资源管理框架 换成 Kubernetes
  • 2019-07 阿里云宣布 剔除 Docker Swarm

1.1、borg

Kubernetes Google 10年容器化基础架构 (google 内部使用的比k8s更好) GO 语言 Borg

特点:

  • 轻量级:消耗资源小
  • 开源
  • 弹性伸缩
  • 负载均衡:IPVS

1.2、HELM

类似于 Linux yum ,HELM可以模板自定义,并部署一些常用插件

1.3、Kubeadm

目前都是使用 Kubeadm 来进行安装 k8s,但是默认证书期限为1年,期间你直接更新k8s,那么证书也会更新,但是对于一些内网的公司来说,可能部署完成之后,就不大可能会动了,所以我们需要在后面将证书期限改的久一点

1.4、内部相关资源组件

组件大致说明
APISERVER所有服务访问统一入口
CrontrollerManager维持副本期望数目
Scheduler负责介绍任务,选择合适的节点进行分配任务(如:打了污点的节点不允许运行xx镜像,又或者将某些打了标签的镜像跑在某些节点上,都是由当前组件来协调)
ETCD键值对数据库 储存K8S集群所有重要信息(持久化),后面我们说Flanneld组件为什么可以找到其它pod的节点信息,因为你只要创建的pod,那么etcd上面就会有这个信息,根据pod容器内部的ip,找打其所在的node机器的ip即可。
Kubelet直接跟容器引擎交互实现容器的生命周期管理,也是我们经常使用的客户端
Kube-proxy负责写入规则至 IPTABLES、IPVS 实现服务映射访问的
COREDNS可以为集群中的SVC创建一个域名IP的对应关系解析
DASHBOARD给 K8S 集群提供一个 B/S 结构访问体系
INGRESS CONTROLLER官方只能实现四层代理,INGRESS 可以实现七层代理
FEDERATION提供一个可以跨集群中心多K8S统一管理功能
PROMETHEUS提供K8S集群的监控能力
ELK提供 K8S 集群日志统一分析介入平台

二、Pod概念

  • 自主式Pod
  • 控制器管理的Pod
类型说明
ReplicationController & ReplicaSet& Deployment > HPA (HorizontalPodAutoScale)ReplicationController 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod 来替代;而如果异常多出来的容器也会自动回收。在新版本的 Kubernetes 中建议使用 ReplicaSet 来取代 ReplicationControlle,ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector(比如通过标签删除管理pod),虽然 ReplicaSet 可以独立使用,但一般还是建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持rolling-update 但 Deployment 支持), Deployment为Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替 代以前的 ReplicationController 来方便的管理应用。典型的应用场景包括:1、定义 Deployment,来创建 Pod 和 ReplicaSet;2、滚动升级和回滚应用;3、扩容和缩容4、暂停和继续Deployment。这个图就是说Depliyment的自动扩容的能力01
Horizontal Pod Autoscaling这个组件和前面的rs和Deployment是一样的,但是单独按出来说,因为这个组件我没有在华为云和腾讯云的k8s后台看到过, Horizontal Pod Autoscaling 仅适用于 Deployment 和 Replicaset , 在 vlalpha 版本中,支持根据内存和用户自定义的metric扩缩容。如下面这张图,说明当CPU大于80%时,可以扩容到10,但是最多10,当CPU下来时,可以缩减,但是最少也得有2个。在这里插入图片描述
StatefullSetStatefulset 是为了解决有状态服务的问题(对应 Deployments 和 Replicasets 是为无状态服务而设计),其应用场景包括:1、稳定的持久化存储,即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现;2、稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service (即没有 Cluster IP 的 Service )来实现;3、有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0 到 N - - 1 ,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态) , 基于 init containers 来实现;4、有序收缩,有序删除(即从 N 一 1 到 0 )
DaemonSetDaemonset 确保全部(或者一些) Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 Daemonset 将会删除它创建的所有 Pod 。使用 Daemonset 的一些典型用法:1、运行集群存储 daemon ,例如在每个 Node 上运行 glusterd 、 ceph ;2、在每个 Node 上运行日志收集 daemon ,例如 fluentd 、 logstash 。3、在每个 Node 上运行监控 daemon ,例如 Prometheus Node Exporter
Job,CronjobJob 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束 Crofi Job 管理基于时间的 Job ,即:在给定时间点只运行一次周期性地在给定时间点运行

三、网络通信方式

Kubernetes 的网络模型假定了所有 Pod 都在一个可以直接连通的扁平的网络空间中,这在 GCE ( Google Copute Engine )里面是现成的网络模型, Kubernetes 假定这个网络已经存在。而在私有云里搭建 Kub ernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后运行 Kubernetes。

类型有以下三种:

  • 同一个 Pod 内的多个容器之间:pod内部localhost

因为同一个pod内部初始化一个 pause,其内部容器都是使用这pause的网络栈,如下图 共享pause网络栈所以同一个pod的内部容器互相访问是不成问题的,但是也要主要同一个pod内部的多个容器不能同时启动多个相同端口的容器,这肯定不行,想都能想到

  • 各 Pod 之间的通讯: overlay Network (其中可能是不通主机/节点的Pod)

这个时候就需要 Flannel了, Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。而且它还能在这些 IP 地址之间建立一个覆盖网络( Overiay Notwork ) ,通过这个覆盖网络,将数据包原封不动地传递到目标容器内,如图Flannel解决不通Pod的网络互通,包括不同主机的Pod 其实最主要的就是Flannel的消息传递的报文封装,如何知道目的地的Pod,在那个节点上,这一点可以从etcd中获取。
ETCD 之 Flannel 提供说明:存储管理 Fl annel 可分配的 IP 地址段资源监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Ped 节点路由表。
那这里可能会有一个疑问,是不是不同的机器上安装的docker,不能使用相同的网段。比如图中的2个节点,docker 的网段是不一样的一个是15网段,一个是20网段,如果相同的话,可能就不太好找了

  • Pod 与 Service 之间的通讯:各节点的 Iptables 规则

总结下网络说明:

项目Value
同一个 Pod 内部通讯同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协议栈
Podl1至 Pod21、Pod1 与 Pod2 不在同一台主机, Pod 的地址是与 docker0在同一个网段的,但 docker0 网段与宿主机网卡是两个完全不同的 IP 网段,并且不同 Node 之间的通信只能通过宿主机的物理网卡进行。将 Pod 的 IP 和所在 Node 的 IP 关联起来,通过这个关联让 Pod 可以互相访问;2、Pod1 与 Pod2 在同一台机器,由 Dockero 网桥直接转发请求至 Pod2 ,不需要经过 Flannel 演示 Pod 至 Service 的网络:目前基于性能考虑,全部为 iPtables 维护和转发 Pod 到外网
外网访问 PodService (svc组件)
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐