目录
虽然 Docker 已经很强大了,但是在实际使用上还是有诸多不便,比如集群管理、资源调度、文件管理等等。那么在这样一个百花齐放的容器时代涌现出了很多解决方案,比如 Mesos、Swarm、Kubernetes 等等,其中谷歌开源的 Kubernetes 是作为老大哥的存在。
kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。
kubernetes 介绍
Kubernetes 解决的核心问题
-
服务发现和负载均衡
-
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
-
存储编排
-
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
-
-
自动部署和回滚
-
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
-
-
自动二进制打包
-
Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
-
-
自我修复
-
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
-
-
密钥与配置管理
-
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
-
Kubernetes 的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变得更加模糊,而且让 DevOps 这一角色变得更加清晰,每一个软件工程师都可以通过 Kubernetes 来定义服务之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。
知识图谱
主要介绍学习一些什么知识
软件架构
传统的客户端服务端架构
-
架构说明
Kubernetes 遵循非常传统的客户端/服务端的架构模式,客户端可以通过 RESTful 接口或者直接使用 kubectl 与 Kubernetes 集群进行通信,这两者在实际上并没有太多的区别,后者也只是对 Kubernetes 提供的 RESTful API 进行封装并提供出来。每一个 Kubernetes 集群都是由一组 Master 节点和一系列的 Worker 节点组成,其中 Master 节点主要负责存储集群的状态并为 Kubernetes 对象分配和调度资源。
-
主节点服务 - Master 架构
作为管理集群状态的 Master 节点,它主要负责接收客户端的请求,安排容器的执行并且运行控制循环,将集群的状态向目标状态进行迁移。Master 节点内部由下面三个组件构成:
API Server: 负责处理来自用户的请求,其主要作用就是对外提供 RESTful 的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个与 etcd 集群通信的组件。
etcd: 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
Scheduler: 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
controller-manager: 在主节点上运行控制器的组件,从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。这些控制器包括:节点控制器(负责在节点出现故障时进行通知和响应)、副本控制器(负责为系统中的每个副本控制器对象维护正确数量的 Pod)、端点控制器(填充端点 Endpoints 对象,即加入 Service 与 Pod))、服务帐户和令牌控制器(为新的命名空间创建默认帐户和 API 访问令牌)。
-
工作节点 - Node 架构
其他的 Worker 节点实现就相对比较简单了,它主要由 kubelet 和 kube-proxy 两部分组成。
kubelet: 是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等。
kube-proxy: 是一个简单的网络访问代理,同时也是一个 Load Balancer。它负责将访问到某个服务的请求具体分配给工作节点上同一类标签的 Pod。kube-proxy 实质就是通过操作防火墙规则(iptables或者ipvs)来实现 Pod 的映射。
Container Runtime: 容器运行环境是负责运行容器的软件,Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI(容器运行环境接口)。
组件说明
主要介绍关于 K8s 的一些基本概念
主要由以下几个核心组件组成:
-
apiserver
-
所有服务访问的唯一入口,提供认证、授权、访问控制、API 注册和发现等机制
-
-
controller manager
-
负责维护集群的状态,比如副本期望数量、故障检测、自动扩展、滚动更新等
-
-
scheduler
-
负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上
-
-
etcd
-
键值对数据库,保存了整个集群的状态
-
-
kubelet
-
负责维护容器的生命周期,同时也负责 Volume 和网络的管理
-
-
kube-proxy
-
负责为 Service 提供 cluster 内部的服务发现和负载均衡
-
-
Container runtime
-
负责镜像管理以及 Pod 和容器的真正运行
-
除了核心组件,还有一些推荐的插件:
-
CoreDNS
-
可以为集群中的 SVC 创建一个域名 IP 的对应关系解析的 DNS 服务
-
-
Dashboard
-
给 K8s 集群提供了一个 B/S 架构的访问入口
-
-
Ingress Controller
-
官方只能够实现四层的网络代理,而 Ingress 可以实现七层的代理
-
-
Prometheus
-
给 K8s 集群提供资源监控的能力
-
-
Federation
-
提供一个可以跨集群中心多 K8s 的统一管理功能,提供跨可用区的集群
-
以上内容参考链接: www.escapelife.site/posts/2c421…
安装
安装v1.16.0版本,竟然成功了。记录在此,避免后来者踩坑。
本篇文章,安装大步骤如下:
-
安装docker-ce 18.09.9(所有机器)
-
设置k8s环境前置条件(所有机器)
-
安装k8s v1.16.0 master管理节点
-
安装k8s v1.16.0 node工作节点
-
安装flannel(master)
详细安装步骤参考:CentOS 搭建 K8S,一次性成功,收藏了! 集群安装教程请参考:全网最新、最详细基于V1.20版本,无坑部署最小化 K8S 集群教程
Pod 实现原理
Pod 就是最小并且最简单的 Kubernetes 对象
Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用、工作负载、网络和磁盘资源,共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。
-
Pod -> 集群中的基本单元
-
Service -> 解决如何访问 Pod 里面服务的问题
-
Volume -> 集群中的存储卷
-
Namespace -> 命名空间为集群提供虚拟的隔离作用
详细介绍请参考:Kubernetes 之 Pod 实现原理
Harbor 仓库
Kuternetes 企业级 Docker 私有仓库 Harbor 工具。 Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 Docker Compose 来对它进行部署。用于部署 Harbor 的 Docker Compose 模板位于 /Deployer/docker-compose.yml 中,其由 5 个容器组成,这几个容器通过 Docker link 的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露 Proxy(即Nginx) 的服务端口即可。
-
Proxy
-
由Nginx服务器构成的反向代理
-
-
Registry
-
由Docker官方的开源官方的开源Registry镜像构成的容器实例
-
-
UI
-
即架构中的core services服务,构成此容器的代码是Harbor项目的主体
-
-
MySQL
-
由官方MySQL镜像构成的数据库容器
-
-
Log
-
运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志
-
详细介绍与搭建步骤请参考:企业级环境中基于 Harbor 搭建
YAML 语法
YAML 是一种非常简洁/强大/专门用来写配置文件的语言!
YAML 全称是 ”YAML Ain’t a Markup Language” 的递归缩写,该语言的设计参考了 JSON / XML 和 SDL 等语言,强调以数据为中心,简洁易读,编写简单。
YAML 语法特性
学过编程的人理解起来应该非常容易
语法特点
-
大小写敏感
-
通过缩进表示层级关系
-
禁止使用tab缩进,只能使用空格键
-
缩进的空格数目不重要,只要相同层级左对齐
-
使用#表示注释
推荐给大家一篇文章:Kubernetes 之 YAML 语法,这篇文章介绍的非常详细,有很多例子说明。
资源清单
K8S 中所有的内容都抽象为了资源,资源实例化之后就叫做对象。
在 Kubernetes 系统中,Ku