kubernetes实战详解

麦浪2年前技术文章634

一、k8s是什么?


1、Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统


2、生产级别的容器编排系统


3、PaaS平台


二、容器是什么?或者说docker是什么?


1、容器就是一个沙箱


Cgroup:提供资源限制(CPU、memory资源使用的上限等)


namespace:提供视图隔离(pid、mount、ipc、network),只能看到docker容器内部的


rootfs: 提供一个小型操作系统需要文件、目录以及配置等,但是不包括内核


2、容器与虚拟机的区别

对比图1:

1.png

对比图2:

2.jpeg

3、容器与虚拟机的优劣

特性

容器

虚拟机

启动

秒级

分钟级

内存额外损耗

200MB+

硬盘使用

一般为 MB

一般为 GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器

一般几十个

隔离性

较差

比较好

4、docker的架构

docker是一个典型的client-server结构

3.png

三、k8s与docker的关系

1、k8s与docker以前是竞争+合作的关系,现在docker已经竞争失败了,那我们就讲讲k8s是怎么用docker的

k8s中最小的调度单位是pod,而一个pod最少包含两个 docker容器,k8s通过kubelet来调用docker

4.png

其中Infra容器是使用汇编语言编写的镜像,镜像名为:k8s.gcr.io/pause,解压后大小也只有100-200k,这个容器永远处于“暂停”状态。


容器A、容器B以及容器Infra合起来是一个pod,他们的关系类似于Linux系统里面的进程组的关系,通过Infra共享网络、mount等namespace以及Cgroup


四、k8s的组件架构

官方图:

5.svg

更易理解的图:

6.png

服务端:


kube-apiserver: API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。只有apiserver 才能与存储etcd进行连接通信,其他组件都是通过apiserver与etcd间接通信。


etcd: etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。


kube-scheduler: 控制平面组件,负责监视新创建的、未指定运行节点(node)Pods,选择节点让 Pod 在上面运行。


kube-controller-manager: 运行控制器进程的控制平面组件。


cloud-controller-manager: 云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。由各个云服务商进行定制提供。


node端:


kubelet: 一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。


kube-proxy: kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。


容器运行时: 容器运行环境是负责运行容器的软件。DockercontainerdCRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)


五、k8s的资源对象

7.png

1、资源对象详解

首先从容器出发,可能容器间需要相互协助,所以就有了pod,然后应用需要多副本(一个副本是一个pod),就有了deployment,多副本之间需要有相同的配置文件,就有了configmap。有比较特殊的配置需要加密(例如数据库连接信息),就有了secret。多副本之间的流量需要负载均衡,就有了Service。流量需要有一个统一的入口,并且因为service是4层的且ClusterIP模式只能在集群内部访问,nodePort模式每个服务透出的端口又都是不一样的,所以就需要ingress对象去把相关的服务统一入口,并透出集群。


2、pod创建流程

8.png

第一步通过apiserver REST API创建一个Pod


然后apiserver接收到数据后将数据写入到etcd


由于kube-scheduler通过apiserver watch API一直在监听资源的变化,这个时候发现有一个新的Pod,但是这个时候该Pod还没和任何Node节点进行绑定,所以kube-scheduler就经过一系列复杂的调度策略,选择出一个合适的Node节点,将该Pod和该目标Node进行绑定,当然也会更新到etcd中去的


这个时候一样的目标Node节点上的kubelet通过apiserver watch API检测到有一个新的Pod被调度过来了,他就将该Pod的相关数据传递给后面的容器运行时(container runtime),比如Docker,让他们去运行该Pod


而且kubelet还会通过container runtime获取Pod的状态,然后更新到apiserver中,当然最后也是写入到etcd中去的。


六、k8s故障排查

流量拓扑图

9.png

故障排查图

10.png

七、书籍推荐


相关文章

CDP实操--集群配置Kerberos

CDP实操--集群配置Kerberos

1.1检查IPA设置以及配置Kerberos前提条件登录IPA Server在services页面里都是ipa自带的服务,集群配置完kereros后,这里会增加集群里各项hadoop服务。在host页...

MapReduce生产经验

MapReduce程序效率的瓶颈在于两点:1)计算机性能(1)CPU、内存、磁盘、网络2)I/O操作优化(1)数据倾斜(2)Map运行时间太长,导致Reduce等待过久(3)小文件过多下来就根据这两点...

PG的锁(一)

一、表级锁1.1 表级锁模式常见锁模式以及应用场景:ACCESS SHARE :select操作获取该模式锁资源,通常情况下所有只读取不修改表的查询都会获取该模式锁资源ROW SHARE : sele...

Ambari Hive 创建函数无权限

Ambari Hive 创建函数无权限

1、创建udf函数参考文档:https://blog.csdn.net/helloxiaozhe/article/details/102498567如果已经编写好,请使用自己的。如果没有请参考以上链接...

虚拟机三种网络模式详解

虚拟机三种网络模式详解

在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常...

ES运维(二)字段类型与内存管理

ES运维(二)字段类型与内存管理

一、ES常见字段类型1、 概述字段是数据存储的最小微粒,根据数据的性质不同将数据分成不同的字段类型,熟悉不同字段类型的特性,对索引的Mapping设计、查询调优都极其重要。2、 关键参数In...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。