网站首页 > 基础教程 正文
一. 简介:
kubernetes是一个开源的容器管理工具,是基于GO语言开实现的,轻量级和便携式的应用,可以把kubernetes cluster在linux主机上部署、管理和扩容docker容器的应用在多个主机上。
二. 架构:
1. kubernetes由以下组件组成:
- kubernetes master
- kubernetes nodes
- etcd
- kubernetes network
2. 组件是通过网络连接的,如下图所示:
3. 上面的图可以汇总如下信息:
- kubernetes master: 通过HTTP或者HTTPS连接etcd去存储数据。
- kubernetes nodes: 通过HTTP或者HTTPS连接kubernetes master去获取命令和报告状态。
- kubernetes network: 通过L2,L3或overlay和容器之间建立连接。
(1) kubernetes master:
主要是:
Api Server:对外暴露K8S的api接口,是外界进行资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;就是监视新创建的 Pod,如果没有分配节点,就选择一个节点供他们运行,这就是pod的调度
controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等,它们是处理集群中常规任务的后台线程
etcd:kubernetes的后端数据库,k/v方式存储,所有的k8s集群数据都存放在此处。保存了整个集群的状态
其中有kube-scheduler和kube-controller-manager两个组件是有leader选举的,这个选举机制是k8s对于这两个组件的高可用保障。
apiserver是可以水平扩展的。
kubernetes主要有以下几个功能:
- 认证和授权
- RESTful API entry point
- 对kubernetes nodes容器部署的调度
- 扩容和复制容器
- 读取配置去创建群集
API server (kube-apiserver)
API server提供基于HTTP或者HTTPS的RESTful API,它是kubernetes 组件中心,比如kubectl, the scheduler, the replication controller, 和etcd 数据存储,及运行在kubernetes nodes上的kubelet 和kube-proxy.
Scheduler (kube-scheduler)
调度器帮助选择哪个容器运行在哪个节点上,针对派送和绑定容器到节点,它只是使用一个简单的算法定义优先级。
比如:
- CPU
- 内存
- 多少容器运行
Controller manager( kube-controller-manager)
该控制管理执行群集的操作。比如:
- 管理kubernetes nodes
- 创建和更新kubernetes内部信息
- 尝试改变当前的状态到满意的状态。
Command-line interface (kubectl)
安装完kubernetes master后,你可以使用kubernetes 命令行接口,kuberctl,去管理kubernetes群集,比如使用kubectl get cs返回每个组件的状态,kubectl get nodes返回kubernetes节点的列表。
//see the Component Statuses
# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok nil
scheduler Healthy ok nil
etcd-0 Healthy {"health": "true"} nil
//see the nodes
# kubectl get nodes
NAME LABELS STATUS AGE
kub-node1 kubernetes.io/hostname=kub-node1 Ready 26d
kub-node2 kubernetes.io/hostname=kub-node2 Ready 26d
(2) kubernetes节点
kubernetes node在kubernetes群集中是slave node, 它是由kubernetes master控制的,使用docker支行应用。节点有两个守护进程,kubelet和kube-proxy。
kubelet在kubernetes节点中是主要的进程,它负责和kubernetes master通信,完成以下操作。
- 周期性的访问 API controller去检查和报告
- 执行容器的操作
- 支行HTTP服务器提供简单的APIs.
proxy(kube-proxy)
proxy处理网络代理和每个容器的负载均衡,它通过改变linux iptables rules来控制在容器上的TCP和UDP包。
在配置完kube-proxy守护进程后,它配置Iptables规则,可以使用iptables –t nat –L 或者iptables –t nat –S 去检查nat 表的规则,如下所示:
//the result will be vary and dynamically changed by kube-proxy
# sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-N FLANNEL
-N KUBE-NODEPORT-CONTAINER
-N KUBE-NODEPORT-HOST
-N KUBE-PORTALS-CONTAINER
-N KUBE-PORTALS-HOST
-A PREROUTING -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-CONTAINER
-A PREROUTING -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-CONTAINER
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-HOST
-A OUTPUT -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-HOST
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 192.168.90.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/16 -j FLANNEL
-A FLANNEL -d 192.168.0.0/16 -j ACCEPT
-A FLANNEL ! -d 224.0.0.0/4 -j MASQUERADE
(3) etcd
etcd是分布式的键值数据存储,可以通过RESTful API去执行CRUD的操作,kubernetes使用etcd作为主要数据存储。
可以通过curl命令去获取:
//example: etcd server is localhost and default port is 4001
# curl -L http://127.0.0.1:4001/v2/keys/registry
{"action":"get","node":{"key":"/registry","dir":true,"nodes":[{"key":"/registry/namespaces","dir":true,"modifiedIndex":6,"createdIndex":6},{"key":"/registry/pods","dir":true,"modifiedIndex":187,"createdIndex":187},{"key":"/registry/clusterroles","dir":true,"modifiedIndex":196,"createdIndex":196},{"key":"/registry/replicasets","dir":true,"modifiedIndex":178,"createdIndex":178},{"key":"/registry/limitranges","dir":true,"modifiedIndex":202,"createdIndex":202},{"key":"/registry/storageclasses","dir":true,"modifiedIndex":215,"createdIndex":215},{"key":"/registry/apiregistration.k8s.io","dir":true,"modifiedIndex":7,"createdIndex":7},{"key":"/registry/serviceaccounts","dir":true,"modifiedIndex":70,"createdIndex":70},{"key":"/registry/secrets","dir":true,"modifiedIndex":71,"createdIndex":71},{"key":"/registry/deployments","dir":true,"modifiedIndex":177,"createdIndex":177},{"key":"/registry/services","dir":true,"modifiedIndex":13,"createdIndex":13},{"key":"/registry/configmaps","dir":true,"modifiedIndex":52,"createdIndex":52},{"key":"/registry/ranges","dir":true,"modifiedIndex":4,"createdIndex":4},{"key":"/registry/minions","dir":true,"modifiedIndex":58,"createdIndex":58},{"key":"/registry/clusterrolebindings","dir":true,"modifiedIndex":171,"createdIndex":171}],"modifiedIndex":4,"createdIndex":4}}
(4) kubernetes network:
容器如果在单一的节点之间进行通信 ,可以使用Docker network或者Docker compose去发现彼此。假如在多个节点之间进行通信,Kubernetes使用overlay network或者 container network interface(CNI) 去完成多个容器间的通信 。
Talent without working hard is nothing.
创建 Pod 流程时序图:
- 1. 用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;
- API Server 处理用户请求,存储Pod数据到Etcd;
- Schedule通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;
- 过滤主机:调度器用一组规则过滤掉不符合要求的主机,比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机;
- 主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;
- 选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;
- kubelet根据调度结果执行Pod创建操作: 绑定成功后,会启动container, docker run, scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。
猜你喜欢
- 2024-12-16 Linux服务器怎么关闭防火墙 linux服务器怎么关闭防火墙模式
- 2024-12-16 Docker容器网络实操教程 docker容器上网
- 2024-12-16 Linux操作系统安全加固设置 linux 系统加固
- 2024-12-16 Centos7配置iptables来实现白名单访问固定端口
- 2024-12-16 在软路由中玩转 Docker——软路由直装 openwrt 启用 docker 服务
- 2024-12-16 deepin管理iptables脚本 deepin ll命令
- 2024-12-16 Linux运维经验分享与思路 linux运维是必死之路
- 2024-12-16 VirtualBox中CentOS 6.5网络设置为NAT时,怎么使用SecureCRT连接
- 2024-12-16 IPTables: 你想知道的或许都在这里
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)