一、Kubernets简介
一、Kubernets简介
1.1 介绍
之前学过docker三剑客,这里简单做个对比介绍,docker三剑客如下
docker machine:安装docker的工具,可以在远程主机或者vm虚拟机上安装docker。
docker compose:docker官方容器编排工具
docker Swarm:docker官方集群工具
那么k8s是什么呢?
- k8s是谷歌推出的容器集群工具,前身是谷歌brog系统
- 于2014年开源
- 现归属于CNCF(云原生计算基金会)
1.2 功能
- 自动化上线和回滚
- 存储编排
- 自动装箱
- IPv4/IPv6双协议栈
- 服务发现和负载均衡
- Secret和配置管理
- 批量执行
- 水平扩缩
- 方便扩展
这些是我从官网抄的,详细去官网看看介绍吧。
二、组件介绍
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
2.1 Master节点组件
有如下四种
etcd
键值对数据库,负责存储集群中各种资源对象的信息;
apiserver
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller manager
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
scheduler
负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
2.2 Node节点组件
有如下三种
kubelet
负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器;
同时也负责Volume(CVI)和网络(CNI)的管理;
Container runtime
负责镜像管理以及Pod和容器的真正运行(CRI);
kube-proxy
负责为Service提供cluster内部的服务发现和负载均衡;
2.3 附加组件
除了核心组件,还有一些推荐的Add-ons:
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
参考资料: k8s架构原理
三、运行原理
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上,在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中至此
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,这样,外界用户就可以访问集群中的nginx服务了
四、核心概念
3.1 Pod
Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。
-
管理方便
有些容器需要配合其他容器才能工作,如web容器跟mysql容器,把他们部署在一个Pod中,方便管理以及共享资源
-
通信和资源共享
Pod 中的所有容器使用同一个网络 namespace,即相同的 IP 地址和 Port 空间。它们可以直接用 localhost 通信;同时他们也能共享存储。
也就是说同一个Pod中无论哪个容器,都能使用localhost:port访问到所有服务,如web容器通过访问localhost:3306就能访问到mysql容器的服务。
3.2 Controller
Kubernetes 通常是通过 Controller 来管理 Pod 的。
Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。
Deployment
Deployment 是最常用的 Controller,Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。
ReplicaSet
ReplicaSet 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。
DaemonSet
DaemonSet确保集群中全部node或者部分node运行同一份pod副本,有 Node加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod也会被回收。删除 DaemonSet将会删除它创建的所有 Pod。
主要用于日志收集守护进程,节点监控守护进程,集群存储守护进程等。
参考资料:DaemonSet详解,DaemonSet用法
StatefuleSet
StatefuleSet 能够保证 Pod 的每个副本在整个生命周期中名称是不变的。而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。
Job
Job 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。
3.3 Service
Service可以看作是一组同类Pod对外的访问接口;
因为Pod是不稳定的,随时可能停止重建,所以IP也是不固定的,Service就会为Pod分配一个稳定的IP地址,在集群内部使用,该IP为ClusterIP也叫VIP。
Service 通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将ClusterIP 负载均衡到这些endpoints 上。
如果需要外部访问就会暴露一个端口出来,详见参考资料。
参考资料:理解Service,Service三种类型
3.4 Namespace
命名空间,用来隔离pod的运行环境;
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。
3.5 Label
标签,用于对pod进行分类;
以 key/value 的方式附加到对象上,Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如ReplicaSet 和 Service 用 label 来选择一组 Pod)。
3.6 Annotations
Annotations 是 key/value 形式附加于对象的注解。不同于 Labels 用于标志和选择对象,Annotations 是用来记录一些附加信息,用来辅助应用部署、安全策略以及调度策略等。