(一)k8s了解
一、说明镜像资源管理工具 Docker Swarm,MESOSAPACHE2019-5Twitter将 MESOSAPACHE分布式资源管理框架换成 Kubernetes2019-07阿里云宣布剔除 Docker Swarm1.1、KubernetesGoogle10年容器化基础架构borg(google 内部使用的比k8s更好)GO 语言Borg特点:轻量级:消耗资源小开源弹性伸缩负载均衡:IP
零、前置说明
一些镜像是国外的,你可能没有科学上网,下载不了的话,可以上网找找其它的镜像代替,是别人下载好的一样的,只是tag不同,当然我强烈建议你使用阿里云的,阿里云这些镜像肯定都是有的
比如,下面这个,你到阿里云镜像仓库中找这个名称,换了tag就行,又快又好用
一、整体说明
镜像资源管理工具 Docker Swarm,MESOS 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的自动扩容的能力 |
Horizontal Pod Autoscaling | 这个组件和前面的rs和Deployment是一样的,但是单独按出来说,因为这个组件我没有在华为云和腾讯云的k8s后台看到过, Horizontal Pod Autoscaling 仅适用于 Deployment 和 Replicaset , 在 vlalpha 版本中,支持根据内存和用户自定义的metric扩缩容。如下面这张图,说明当CPU大于80%时,可以扩容到10,但是最多10,当CPU下来时,可以缩减,但是最少也得有2个。 |
StatefullSet | Statefulset 是为了解决有状态服务的问题(对应 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 ) |
DaemonSet | Daemonset 确保全部(或者一些) 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,Cronjob | Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束 Crofi Job 管理基于时间的 Job ,即:在给定时间点只运行一次周期性地在给定时间点运行 |
三、网络通信方式
Kubernetes 的网络模型假定了所有 Pod 都在一个可以直接连通的扁平的网络空间中,这在 GCE ( Google Copute Engine )里面是现成的网络模型, Kubernetes 假定这个网络已经存在。而在私有云里搭建 Kub ernetes 集群,就不能假定这个网络已经存在了。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后运行 Kubernetes。
类型有以下三种:
- 同一个 Pod 内的多个容器之间:pod内部localhost
因为同一个pod内部初始化一个 pause,其内部容器都是使用这pause的网络栈,如下图 所以同一个pod的内部容器互相访问是不成问题的,但是也要主要同一个pod内部的多个容器不能同时启动多个相同端口的容器,这肯定不行,想都能想到
- 各 Pod 之间的通讯: overlay Network (其中可能是不通主机/节点的Pod)
这个时候就需要 Flannel了, Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。而且它还能在这些 IP 地址之间建立一个覆盖网络( Overiay Notwork ) ,通过这个覆盖网络,将数据包原封不动地传递到目标容器内,如图 其实最主要的就是Flannel的消息传递的报文封装,如何知道目的地的Pod,在那个节点上,这一点可以从etcd中获取。
ETCD 之 Flannel 提供说明:存储管理 Fl annel 可分配的 IP 地址段资源监控 ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Ped 节点路由表。
那这里可能会有一个疑问,是不是不同的机器上安装的docker,不能使用相同的网段。比如图中的2个节点,docker 的网段是不一样的一个是15网段,一个是20网段,如果相同的话,可能就不太好找了
- Pod 与 Service 之间的通讯:各节点的 Iptables 规则
总结下网络说明:
项目 | Value |
---|---|
同一个 Pod 内部通讯 | 同一个 Pod 共享同一个网络命名空间,共享同一个 Linux 协议栈 |
Podl1至 Pod2 | 1、Pod1 与 Pod2 不在同一台主机, Pod 的地址是与 docker0在同一个网段的,但 docker0 网段与宿主机网卡是两个完全不同的 IP 网段,并且不同 Node 之间的通信只能通过宿主机的物理网卡进行。将 Pod 的 IP 和所在 Node 的 IP 关联起来,通过这个关联让 Pod 可以互相访问;2、Pod1 与 Pod2 在同一台机器,由 Dockero 网桥直接转发请求至 Pod2 ,不需要经过 Flannel 演示 Pod 至 Service 的网络:目前基于性能考虑,全部为 iPtables 维护和转发 Pod 到外网 |
外网访问 Pod | Service (svc组件) |
更多推荐
所有评论(0)