1.Kubernetes介绍
Kubernetes = K8(个单词)s,希腊语,表示舵手。Kubernetes是一个自动化的容器编排平台,负责应用的部署、应用的弹性以及应用的管理,均基于容器。
1.1 Kubernetes核心功能
- 服务的发现与负载的均衡;
- 容器的自动装箱,就是“调度”,把一个容器放到一个集群的某一个机器上,Kubernetes 会帮助我们去做存储的编排,让存储的声明周期与容器的生命周期能有一个连接;
- Kubernetes 会帮助我们去做自动化的容器的恢复。在一个集群中,经常会出现宿主机的问题或者说是 OS 的问题,导致容器本身的不可用,Kubernetes 会自动地对这些不可用的容器进行恢复;
- Kubernetes 会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;
- 对于 job 类型任务,Kubernetes 可以去做批量的执行;
- 为了让这个集群、这个应用更富有弹性,Kubernetes 也支持水平的伸缩。
1.1.1 调度
Kubernetes调度器可以将用户提交的容器分配到Kubernetes管理的集群的某一个节点上。比如调度器会根据容器所需的CPU和内存来寻找较为空闲的机器,进行放置(placement)操作。比如下图中的正在调度的容器(红色)很有可能放置到第二个空闲的机器上。
1.1.2 自动修复
Kubernetes具备节点健康检查的功能,监测集群中所有的宿主机,宿主机出现故障时,或者软件出现故障时,健康节点会自动对它进行发现。如果发现则,将容器部署到另外的节点运行,如下所示:
1.1.3 水平伸缩
Kubernetes会检查业务的负载,CPU负载过高,或者响应时间过长,则会对该业务进行扩容。比如下图,黄色过度忙碌,K8s吧黄色负载从1份分成3份,通过负载均衡把原来一个黄色负载上的负载分配到三个黄色的负载,进而提高响应速度和降低CPU负载。
1.2 K8s的架构
1.2.1 总体架构
K8s架构是一个典型的二层架构和server-client架构。Master作为中央的管控节点,会连接所有Node。UI、clients(CLI)这类组件只会和Master进行连接,把希望的状态或者想执行的命令下发给Master,Master会将命令和状态下发给相应的节点执行。
1.2.2 Master组件
K8s的Master包括四个主要的组件:API Server、Controller、Scheduler 以及 etcd。
-
API Server
用于处理API操作,组件之间一般不进行独立连接,依赖于API Server的消息传达。本身在部署结构上可以水平拓展的组件。
-
Controller
管理集群状态,如自动容器修复、自动水平扩张。可进行热备的部署组件,只有一个激活。
-
Scheduler
把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置
-
etcd
高可用的分布式存储系统,API Server中所需要的原信息都被放置在etcd。
1.2.3 Node
Node在Kubernetes集群中运行业务负载,每个业务负载都会一Pod的形式运行。一个Pod中运行一个或者多个容器,而Kubelet是真正运行Pod的组件。Kubelet通过API Server接收到所需要Pod运行的状态,然后提交到Container Runtime组件中。
Storage Plugin完成存储操作,Network Plugin完成网络操作。
1.2.4 部署过程
- 1.UI或者CLI提交一个Pod给Kubernetes的API Server
- 2.API Server将信息写入到存储系统etcd
- 3.调度器(Scheduler)通过API Server的watch或者notification机制得到该消息,即一个Pod需要被调度
- 4.Scheduler根据内存状态进行调度决策,并给API Server返回状态
- 5.API Server将此次操作写入到etcd,并通知相应节点进行Pod的真正启动
- 6.kubelet得到通知,调Container runtime来真正启动配置容器和容器的运行环境
- 7.kubelet调度Storage Plugin存储存储,Network Plugin配置网络
1.3 K8s的核心概念
1.3.1 Pod
Pod是K8s的最小调度以及资源单元。用户可通过K8s的Pod API胜场Pod,让Kubernetes对Pod进行调度,即放到某一个节点上运行。一个Pod中会包含一个或者多个容器。一个Pod还包括Volume存储资源。
Pod给Pod内容器提供共享的运行环境,共享同一个网络环境(localhost)。Pod和Pod之间,互相隔离。
1.3.2 Volume
Volume是卷,管理Kubernetes存储,可以访问文件目录。一个卷可以被挂载在Pod中一个或者多个容器的制定路劲下面。K8s的Volume支持很多存储插件,可以支持本地存储,如ceph、GlusterFS,云存储如阿里云云盘、AWS的云盘和Google的云盘。
1.3.3 Deployment
Deployment可以定义一组Pod的副本数目以及Pod版本,实现应用的真正管理,而Pod是组成Deployment的最小单元。
Controller来维护Deployment中Pod的数目,帮助Deployment自动回复失败的Pod。
1.3.4 Service
Service提供一个或者多个Pod实例的稳定访问地址。
实现Service由多种方式,K8s支持Cluster IP,比如kuber-proxy组网、nodePort、LoadBalancer。
1.3.5 Namespace
Namespace用于实现集群内部的逻辑隔离,包括鉴权、资源管理。Kubernetes的每个资源,如Pod、Deployment、Service都属于一个Namespace,同一个Namespace内的资源需要唯一命名。Alibaba内部会有多个business units,每个之间都有视图上的隔离,并且在鉴权上不一样。
1.3.6 K8s的API
K8s的API由HTTP+JSON组成,通过HTTP访问,content的内容是JSON格式。
以下是访问路劲和content内容。
kind表述要操作的资源。
Metadate中包括Pod的名字,如nginx。
Spec的status,表达该资源当前的状态,如正在被调度、running、terminates或者执行完毕。
2、K8S集群搭建
-
准备工作
# 1、关闭防火墙、selinux # selinux(Security-Enhanced Linux):加强安全性的一个组件,但非常容易出错且难以定位 # k8s是需要用防火墙做ip转发和修改的,当然也看使用的网络模式,如果采用的网络模式不需要防火墙也是可以直接关闭的 $ systemctl disable --now firewalld # 2、setenforce 0 (临时生效可以直接用setenforce 0 ) 1 启用 0 告警,不启用 $ setenforce 0 setenforce: SELinux is disabled # 3、将/etc/selinux/config文件中的SELINUX参数数值改为disabled # 4、关闭swap分区,提高性能 swapoff -a ## 未知作用,待考证 ## /etc/fstab文件包含众多文件系统的描述信息 sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
参考
欢迎关注我的微信公众号
互联网矿工