k8s架构
master节点
k8s的集群由master和node组成,节点上运行着若干k8s服务。
master节点之上运行着的后台服务有kube-apiserver 、kube-scheduler、kube-controller-manager、etcd和pod网络。如下图所示
1. API Server(kube-apiserver)
API Server是k8s的前端接口,各种客户端工具以及k8s其他组件可以通过它管理集群的各种资源。
2.Scheduler(kube-scheduler)
scheduer负责决定将pod放在哪个node上运行。另外scheduler在调度时会充分考虑集群的架构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
3.Controller Manager(kube-controller-manager)
负责管理集群的各种资源,保证资源处于预期的状态。
4.etcd
负责保存k8s集群的配置信息和各种资源的状态信息,当数据发生变化时,etcd会快速的通知k8s相关组件。
5.pod网络
pod要能够相互通信,k8s集群必须掌握pod网络,fannel是其中一个可选的方案。
node节点
node是pod运行的地方。node上运行的k8s组件有kublet、kube-proxy和pod网络(例如flannel),如下图所示:
1.kubelet
是node的agent,当scheduler去确定在某个node上运行pod后,会将pod的具体配置信息发送给该节点的kubelet,kubelet会根据遮羞信息创建和运行容器,并向master报告运行状态。
2.kube-proxy
每个node都会运行kube-proxy服务,外界通过service访问pod,kube-proxy负责将降访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。
3.pod网络
pod能能够互相通信,k8s集群必须部署pod网络,flannel是其中一个可以选择的方案
完整的架构图
为什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?
这是因为 Master 上也可以运行应用,即 Master 同时也是一个 Node。
几乎所有的 Kubernetes 组件本身也运行在 Pod 里,执行如下命令:

[root@ken ~]# kubectl get pod --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-78d4cf999f-dbxpc 1/1 Running 0 4h40m 10.244.0.2 ken <none> <none>
kube-system coredns-78d4cf999f-q9vq2 1/1 Running 0 4h40m 10.244.0.3 ken <none> <none>
kube-system etcd-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none>
kube-system kube-apiserver-ken 1/1 Running 0 4h39m 172.20.10.2 ken <none> <none>
kube-system kube-controller-manager-ken 0/1 CrashLoopBackOff 23 4h39m 172.20.10.2 ken <none> <none>
kube-system kube-flannel-ds-amd64-bq6jx 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none>
kube-system kube-flannel-ds-amd64-fd8mv 1/1 Running 0 4h24m 172.20.10.2 ken <none> <none>
kube-system kube-flannel-ds-amd64-ssqcl 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none>
kube-system kube-proxy-7cnsr 1/1 Running 0 4h5m 172.20.10.7 host1 <none> <none>
kube-system kube-proxy-gwmr2 1/1 Running 0 4h40m 172.20.10.2 ken <none> <none>
kube-system kube-proxy-n6zxl 1/1 Running 0 4h4m 172.20.10.9 host2 <none> <none>
kube-system kube-scheduler-ken 0/1 CrashLoopBackOff 21 4h39m 172.20.10.2 ken <none> <none>

Kubernetes 的系统组件都被放到kube-system namespace 中。这里有一个kube-dns 组件,它为 Cluster 提供 DNS 服务,我们后面会讨论。kube-dns是在执行kubeadm init 时作为附加组件安装的。
kubelet 是唯一没有以容器形式运行的 Kubernetes 组件,它在系统中通过 Systemd 运行。

[root@ken ~]# systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since Tue 2019-01-29 10:39:16 CST; 4h 44min ago
Docs: https://kubernetes.io/docs/
Main PID: 6350 (kubelet)
Tasks: 35
Memory: 87.7M
CGroup: /system.slice/kubelet.service
└─6350 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kub... ...

k8s集群架构工作演示
部署httpd应用
[root@ken ~]# kubectl run httpd-ken --generator=run-pod/v1 --image=httpd --replicas=2
pod/httpd-ken1 created
等待一段时间,应用部署完成。
[root@ken ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-ken 2/2 2 2 20m
k8s 部署了k8s httpd-ken,有两个副本 Pod,分别运行在k8s-node1和k8s-node2。

[root@ken ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-ken-5c949b96f-9cd52 1/1 Running 0 3m50s 10.244.1.3 host1 <none> <none>
httpd-ken-5c949b96f-twdsd 1/1 Running 0 3m50s 10.244.2.3 host2 <none> <none>

整个部署过程:
① kubectl 发送部署请求到 API Server。
② API Server 通知 Controller Manager 创建一个 deployment 资源。
③ Scheduler 执行调度任务,将两个副本 Pod 分发到 k8s-node1 和 k8s-node2。
④ k8s-node1 和 k8s-node2 上的 kubectl 在各自的节点上创建并运行 Pod。
补充两点:
应用的配置和当前状态信息保存在 etcd 中,执行kubectl get pod 时 API Server 会从 etcd 中读取这些数据。
flannel 会为每个 Pod 都分配 IP。因为没有创建 service,目前 kube-proxy 还没参与进来。
k8s架构的更多相关文章
- [k8s]k8s架构图解
k8s架构图解 启动参数及证书梳理 master端必须要装flannel 注: flannel网络能确保各节点间 Pod 网段实现互通 master 节点与 node 节点上的 Pods 通过 Pod ...
- [转帖]我花了10个小时,写出了这篇K8S架构解析
我花了10个小时,写出了这篇K8S架构解析 https://www.toutiao.com/i6759071724785893891/ 每个微服务通过 Docker 进行发布,随着业务的发展,系统 ...
- k8s架构与组件详解
没有那么多花里胡哨,直接进行一个K8s架构与组件的学习. 一.K8s架构 k8s系统在设计是遵循c-s架构的,也就是我们图中apiserver与其余组件的交互.在生产中通常会有多个Master以实现K ...
- k8s架构分析(二)--技术流ken
master节点 k8s的集群由master和node组成,节点上运行着若干k8s服务. master节点之上运行着的后台服务有kube-apiserver .kube-scheduler.kube- ...
- k8s 架构浅析
文章目录 目录 Kubernetes 的电梯间演讲 Kubernetes 的核心层级对象 Kubernetes 的组件架构 Kubernetes 的组件通信协议/接口 Kubernetes 的分层架构 ...
- k8s架构分析(二)
master节点 k8s的集群由master和node组成,节点上运行着若干k8s服务. master节点之上运行着的后台服务有kube-apiserver .kube-scheduler.kube- ...
- 通过例子理解 k8s 架构 - 每天5分钟玩转 Docker 容器技术(122)
为了帮助大家更好地理解 Kubernetes 架构,我们部署一个应用来演示各个组件之间是如何协作的. 执行命令 kubectl run httpd-app --image=httpd --replic ...
- Kubernetes 学习1 k8s架构概述
一.概述 1.意思:舵手,飞行员 2.特点 a.自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚. b.密钥和配置管理,存储编排,批量处理执行. 二.架构术语 1.集群 master( ...
- k8s 基础 k8s架构和组件
k8s 的总架构图
随机推荐
- java 可变长度参数列表
public class Main11 { public static void print(Integer... args){ if(args !=null) System.out.println( ...
- [PyQt5]动态显示matplotlib作图(一)
完整实例 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePoli ...
- Java中Collection、Map常用实现类研究分析
接口/实现类 描述 key是否可为null 为null是否报错 key是否重复 key重复是否报错 key是否和添加一致 是否线程安全 List 一组元素的集合 ArrayList 基于数组存储,读取 ...
- C++ 6小时刷完面向对象
**本篇博文参考视频见我上一篇博文的第一行**### 类和对象的声明- 类的声明```class People{ int a; void fun(){ cout<<"fun&qu ...
- RBAC | YAML |
YAML配置文件: 1.凡是可以在application.properties配置的文件,都可以在application.yaml文件中配置 2.properties的优先级大于yaml的优先级 后端 ...
- vs开发之工程属性
1.建立工程 最好使用自己创建工程 然后把代码移过去 2.不要使用别人建立的工程直接导入(差异比较大的话),后面32位 64位 配置属性 可能造成冲突 3.冲突了 还需要重新做 上面 1
- 【学习】024 springCloud
单点系统架构 传统项目架构 传统项目分为三层架构,将业务逻辑层.数据库访问层.控制层放入在一个项目中. 优点:适合于个人或者小团队开发,不适合大团队开发. 分布式项目架构 根据业务需求进行拆分成N个子 ...
- java高并发核心要点|系列2|锁的底层实现原理
上篇文章,我们主要讲了解决多线程之间共享数据的核心问题和解决方案,也讲了锁的简单分类. 那么,这把锁,我们应该怎么去实现呢?如果你是java语言设计者,你又会怎么去设计这个线程锁呢? 直觉告诉我们,我 ...
- 使用kettle实现循环
Kettle使用脚本实现循环(十) https://blog.csdn.net/BushQiang/article/details/90264616 kettle实现循环 https://blog.c ...
- mysql8.0.16二进制安装
mysql8.0.16二进制安装 环境简介操作系统:Centos 6.10 64位 目前版本:8.0.16 MySQL Community Server 二进制 安装目录:/data/mysql/my ...