1 简介及规划部署

云原生生态系统:

http://dockone.io/article/3006

CNCF 最新景观图:

https://landscape.cncf.io/

CNCF 原生主要框架简介:

https://www.kubernetes.org.cn/5482.html

kubernetes 设计架构:

https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84

K8s 核心优势:

  • 基于 yaml 文件实现容器的自动创建、删除
  • 更快速实现业务的弹性横向扩容
  • 动态发现新扩容的容器并对自动用户提供访问
  • 更简单、更快速的实现业务代码升级和回滚

1.1 k8s 组件介绍

Kubernetes 组件介绍:

https://kubernetes.io/zh/docs/concepts/overview/components/
  • kubelet
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/

kubelet 是在每个 Node 节点上运行的主要 “节点代理”。它可以使用以下之一向 apiserver 注册: 主机名(hostname);覆盖主机名的参数;某云驱动的特定逻辑。

kubelet 是基于 PodSpec 来工作的。每个 PodSpec 是一个描述 Pod 的 YAML 或 JSON 对象。 kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于运行状态且运行状况良好。 kubelet 不管理不是由 Kubernetes 创建的容器。

除了来自 apiserver 的 PodSpec 之外,还可以通过以下三种方式将容器清单(manifest)提供给 kubelet。

文件(File):利用命令行参数传递路径。kubelet 周期性地监视此路径下的文件是否有更新。 监视周期默认为 20s,且可通过参数进行配置。

HTTP 端点(HTTP endpoint):利用命令行参数指定 HTTP 端点。 此端点的监视周期默认为 20 秒,也可以使用参数进行配置。

HTTP 服务器(HTTP server):kubelet 还可以侦听 HTTP 并响应简单的 API (目前没有完整规范)来提交新的清单。

kubelet 是主要的节点代理,它会监视已分配给节点的 pod ,具体功能 如下:

  1. 向 master 汇报 node 节点的状态信息
  2. 接受指令并在 Pod 中创建 docker 容器
  3. 准备 Pod 所需的数据卷
  4. 返回 pod 的运行状态
  5. 在 node 节点执行容器健康检查
  • kube-apiserver
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/

Kubernetes API 服务器验证并配置 API 对象的数据, 这些对象包括 pods、services、replicationcontrollers 等。 API 服务器为 REST 操作提供服务,并为集群的共享状态提供前端, 所有其他组件都通过该前端进行交互。

  • kube-controller-manager
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/

Kubernetes 控制器管理器是一个守护进程,内嵌随 Kubernetes 一起发布的核心控制回路。 在机器人和自动化的应用中,控制回路是一个永不休止的循环,用于调节系统状态。 在 Kubernetes 中,每个控制器是一个控制回路,通过 API 服务器监视集群的共享状态, 并尝试进行更改以将当前状态转为期望状态。 目前,Kubernetes 自带的控制器例子包括副本控制器、节点控制器、命名空间控制器和服务账号控制器等。

kube-controller manage:Controller Manager 作为集群内部的管理控制中心,负责集群内的Node 、 Pod 副本、服务端点( Endpoint )、命名空间 Namespace )、服务账号 ServiceAccount )、资源定额( ResourceQuota )的管理,当某个 Node 意外宕机时, Controller Manage r 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

  • kube-proxy
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/

Kubernetes 网络代理在每个节点上运行。网络代理反映了每个节点上 Kubernetes API 中定义的服务,并且可以执行简单的 TCP、UDP 和 SCTP 流转发,或者在一组后端进行 循环 TCP、UDP 和 SCTP 转发。 当前可通过 Docker-links-compatible 环境变量找到服务集群 IP 和端口, 这些环境变量指定了服务代理打开的端口。 有一个可选的插件,可以为这些集群 IP 提供集群 DNS。 用户必须使用 apiserver API 创建服务才能配置代理。

其实就是 kube-proxy 通过在主机上维护网络规则并执行连接转发来实现 Kubernetes 服务访问 。

  • kube-scheduler
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/

Kubernetes 调度器是一个控制面进程,负责将 Pods 指派到节点上。 调度器基于约束和可用资源为调度队列中每个 Pod 确定其可合法放置的节点。 调度器之后对所有合法的节点进行排序,将 Pod 绑定到一个合适的节点。 在同一个集群中可以使用多个不同的调度器;kube-scheduler 是其参考实现。 参阅调度 以获得关于调度和 kube-scheduler 组件的更多信息

kube-scheduler 是一个拥有丰富策略、能够感知拓扑变化、支持特定负载的功能组件,它对集群的可用性、性能表现以及容量都影响巨大。 scheduler 需要考虑独立的和集体的资源需求、服务质量需求、硬件 软件 策略限制、亲和与反亲和规范、数据位置、内部负载接口、截止时间等等。如有必要,特定的负载需求可以通过 API 暴露出来。

1.2 安装方式

1.2.1 部署工具

使用批量部署工具如 ansible/ saltstack、手动二进制、kubeadm、apt / yum 等方式安装,以守护进程的方式启动在宿主机上,类似于是 Nginx 一样使用 service 脚本启动。

1.2.2 kubeadm

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/

使用 k8s 官方提供的部署工具 kubeadm 自动安装, 需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的 方式运行

1.2.3 kubeadm 介绍

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/

v1.10 版本的 kubeadm 介绍

https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

1.2.4 安装注意事项

注意:禁用 swap,selinux,iptables,时间同步,修改内核参数,开启 ipv4.ip_forward

1.3 部署规划图