K8s - Kubernetes

1 - Kubernetes

1.1 简要说明

Kubernetes(简称K8s,用8代替8个字符“ubernete”)是Google开源的一个容器编排平台,用来构建和调度云原生应用。
K8s能够让用户有效搭建以容器为中心的架构与开发环境,可以自动部署和扩展大规模的容器化应用,并实现高效管理和跟踪。

  • 大规模可伸缩:随时扩展或收缩容器规模,模块化,插件化,可挂载,可组合
  • 应用容器化管理:容器间的负载均衡、升级版本、弹性替换等
  • 支持自动化:自动化容器的部署,自动重启,自动复制,自动扩容和缩容
  • 自我修复功能:健康检查、故障的自动恢复、自动扩展等机制
  • 可移动:构建的应用可以无缝的迁移到公有云,私有云,混合云等

1.2 官方信息


2 - Kubernetes组件

正常运行的 Kubernetes 集群所需组件的示例

核心组件:Kubernetes 集群由一个控制平面和一组用于运行容器化应用的工作机器组成,这些工作机器称作节点(Node)。

控制平面组件(Control Plane Components):管理集群的整体状态
- kube-apiserver  公开 Kubernetes HTTP API 的核心组件服务器
- etcd  具备一致性和高可用性的键值存储,用于所有 API 服务器的数据存储
- kube-scheduler  查找尚未绑定到节点的 Pod,并将每个 Pod 分配给合适的节点
- kube-controller-manager  运行控制器来实现 Kubernetes API 行为
- cloud-controller-manager (optional)  与底层云驱动集成

Node 组件:在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行时环境
- kubelet确保 Pod 及其容器正常运行
- kube-proxy(可选)维护节点上的网络规则以实现 Service 的功能
- 容器运行时(Container runtime)负责运行容器的软件
- 每个集群至少需要一个工作节点来运行 Pod

插件(Addons):扩展 Kubernetes 的功能。
- DNS  集群范围内的 DNS 解析
- Web 界面(Dashboard)  通过 Web 界面进行集群管理
- 容器资源监控  用于收集和存储容器指标
- 集群层面日志  用于将容器日志保存到中央日志存储

3 - Kubernetes架构

Kubernetes 集群由一个控制平面和一组用于运行容器化应用的工作机器组成,这些工作机器称作节点(Node)。
控制平面管理集群中的工作节点和 Pod。工作节点托管着组成应用负载的 Pod。
每个集群至少需要一个工作节点来运行 Pod。
在生产环境中,控制平面通常跨多台计算机运行,而一个集群通常运行多个节点,以提供容错和高可用。

Kubernetes 集群的参考架构示例

控制平面组件

  • 为集群做出全局决策,以及检测和响应集群事件
  • 可以在集群中的任何节点上运行
  • 通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器
kube-apiserver
- 负责公开 Kubernetes API 和处理接受请求的工作
- 是 Kubernetes 控制平面的前端
- 可通过部署多个实例来进行扩缩,并在这些实例之间平衡流量
- https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/

etcd
- 一致且高可用的分布式键值存储数据库,用作 Kubernetes 所有集群数据的后台数据库
- 保存集群所有的网络配置和对象的状态信息,需要及时进行数据备份
- https://etcd.io/docs/

kube-scheduler
- 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行
- 调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限

kube-controller-manager
- 负责运行控制器进程
- 从逻辑上讲, 每个控制器都是一个单独的进程, 但都被编译到同一个可执行文件,并在同一个进程中运行
- 控制器有许多不同类型:Node、Job、EndpointSlice、ServiceAccount等
- https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-controller-manager/

cloud-controller-manager
- 允许将集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同集群交互的组件分离开来
- 仅运行特定于云平台的控制器,本地Kubernetes环境所部署的集群不包含
- 将若干逻辑上独立的控制回路组合到同一个可执行文件中,以同一进程的方式运行
- 可以执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力

节点组件

  • 在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行时环境
kubelet
- 在集群中每个节点(node)上运行
- 保证容器(containers)都运行在 Pod 中
- 接收一组通过各类机制提供给它的 PodSpec,确保这些 PodSpec 中描述的容器处于运行状态且健康
- 不会管理不是由 Kubernetes 创建的容器
- https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kubelet/

kube-proxy(可选)
- 集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 的一部分
- 默认仅做流量转发,允许从集群内部或外部的网络会话与 Pod 进行网络通信
- 可以通过操作系统提供的可用数据包过滤层实现一些网络规则
- 如果有等效行为的网络插件为 Service 实现本身的数据包转发, 则不需要在集群中的节点上运行 kube-proxy
- https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-proxy/

容器运行时
- 使 Kubernetes 能够有效运行容器
- 负责管理 Kubernetes 环境中容器的执行和生命周期
- 支持许多容器运行环境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现

插件

DNS
- Kubernetes 集群应该有集群 DNS, 因为很多实例例都需要 DNS 服务
- 集群 DNS 和环境中的其他 DNS 服务器一起工作,为 Kubernetes 服务提供 DNS 记录
- Kubernetes 启动的容器自动将此 DNS 服务器包含在其 DNS 搜索列表中
- https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

Web 界面(仪表盘)
- Dashboard 是 Kubernetes 集群的通用的、基于 Web 的用户界面
- 用户可以管理集群中运行的应用程序以及集群本身,并进行故障排除
- https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/web-ui-dashboard/

容器资源监控
- 将关于容器的一些常见的时序度量值保存到一个集中的数据库中,并提供浏览这些数据的界面
- https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-usage-monitoring/

集群层面日志
- 负责将容器的日志数据保存到一个集中的日志存储中, 并提供搜索和浏览接口
- https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/

网络插件
- 实现容器网络接口(CNI)规范的软件组件
- 负责为 Pod 分配 IP 地址,并使这些 Pod 能在集群内部相互通信
- https://kubernetes.io/zh-cn/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

4 - 安装和管理工具

kubectl

Kubernetes 提供 kubectl 是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。

# 编写资源清单文件后,通过 kubectl create / kubectl apply / kubectl rollout 来进行创建、应用和回滚资源
kubectl create -f deployment.yaml    # 创建资源
kubectl apply -f deployment.yaml    # 应用资源
kubectl rollout history deployment/nginx    # 查看历史
kubectl rollout history deployment/nginx --revision=2    # 查看指定历史版本信息
kubectl rollout undo deployment/nginx    # 回滚到上个版本
kubectl rollout undo deployment/nginx --to-revision=2    # 回滚到指定版本

kubeadm

kind

minikube

  • 与 kind 类似,minikube 能够在本地运行 Kubernetes。
  • minikube 可在个人计算机上运行一个一体化(all-in-one) 或多节点的本地 Kubernetes 集群
  • 多用来初次尝试 Kubernetes 或者进行本地开发工作
  • https://minikube.sigs.k8s.io/docs/

5 - 一些说明

概念解析

### Pod
K8s 最基本的构建模块和部署调度单元,用于处理 Volume、Secret 以及容器的相关配置,一个 Pod 表示某个应用的一个实例。
Pod在Node节点上被创建/启动或者销毁,运行在 Worker Node 中,非持久的,会在宕掉时自动重启。
- 每个 Pod 可以由一个或多个业务容器和一个根容器(Pause 容器)组成。,通常每个 Pod 只包含一个业务容器
- 同一个Pod里的业务容器共享Pause 容器的网络栈和Volume挂载卷,可以使用localhost互相通信
- 如果容器之间的联系非常紧密并且需要直接共享资源,可以考虑将一组容器放在同一个Pod
- 通过使用持久化的卷类型来持久化容器数据
- 同一个Pod里的容器共享存储, 当Kubernetes挂载volume到Pod, 本质上是将volume挂载到Pod中的每一个容器
- 每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失

特别说明: 
- Kubernetes管理的对象是Pod,而不是直接管理容器,即便Pod中只有一个容器
- 也就是说,Kubernetes只可以看到Pod,而Pod也只可以看到容器

### Service
一个服务可以看作是一组提供相同服务的Pod的对外访问接口,通过标签选择器来定义作用于哪些Pod
拥有一个指定的名字,一个虚拟IP地址和端口号(销毁之前不会改变,只能内网访问)
如果服务要提供外网服务,就需要指定公共IP和Node端口,或外部负载均衡器
- 定义了外界访问一组特定Pod的方式以及访问这些Pod的策略
- 为Pod提供负载均衡,在一定数量的Pod之间均衡流量
- 通过Label找到Pod组

### Node(节点)
承担主要计算功能的工作节点,可以是单独物理机或虚拟机,用来承载Pod,作为Kubernetes worker,为容器提供一些必要的环境,比如存储、网络等。
每个节点都运行如下Kubernetes关键组件:
- Kubelet:处理Master节点下发的任务,管理Pod和其中的容器,是Node节点上的Pod管家
- Kube-proxy:监听每个节点上Kubernetes API中定义的服务变化情况,并创建路由规则来进行服务负载均衡,也就是说,Service使用Kube-proxy将链接路由到Pod
- Docker或Rocket:创建和管理容器

### Master(主控)
主要负责集群的状态维护,也给集群提供一个资源配额控制和对外访问的入口。
作为集群的大脑,整个系统的数据总线和数据中心,几乎所有的集群控制命令都是在Master上执行。
Master会根据实际情况将负载分配给各个Node,使整个K8s集群中的Node节点协同工作。
每一个集群至少拥有一个Kubernetes Master,
- API server(即 kube-apiserver):K8s 控制的前端,提供可以用来和集群交互的REST端点,也就是暴露 K8s API
- Scheduler(即 kube-scheduler):根据特定的调度算法为新 Pod 选择 Node
- Replication Controller:使用Pod模板创建同一个容器的多份拷贝,确保任意时间都有指定数量的Pod“副本”在运行

### Cluster(集群)
在K8s中,Cluster(集群)是计算、存储和网络资源的集合,是整个K8s容器集群的基础环境。

### Volume(卷)
K8s的生命周期与Pod绑定。
重启容器,卷的数据依然还在,只有Pod被删除时,卷才会清理,数据是否丢失取决于具体的卷类型。
持久化存储卷是独立于计算资源的一种物理存储资源,不属于任何一个Node节点。
因此,在Pod被删除时,不会丢失数据,除非人工将其删除。

### Namespace(命名空间)
Namespace(命名空间)通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组。
从而使得在共享使用整个集群资源的同时,还能分别管理。
不同Namespace里的资源是完全隔离的。
在K8s中,Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。
如果有多个用户或项目组使用同一个Kubernetes Cluster, 通过指定Namespace就可以将他们创建的Controller、 Pod等资源分开。
K8s集群启动后,会创建一个名为default的默认命名空间,如果不特别指定命名空间,那么用户创建的Pod、RC、服务都会被系统创建到默认的命名空间中。

资源对象
Kubernetes常用的资源对象有Deployment、Service、Ingress等
Ingress ---> Service ---> Deployment(Pod1/Pod2/Pod3/...)

Ingress
- Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
- Ingress 是允许入站连接到达后端定义的端点的规则集合
- 将来自集群外部的流量路由给内部Kubernetes集群中的Service
- 可以提供负载均衡、SSL 终结和基于名称的虚拟托管

Service
- 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法
- 为一组Pod提供服务名称、IP地址、Pod之间的发现和路由,使用标签和选择器将Pod匹配其他应用程序
- 类型分为:ClusterIP、NodePort、LoadBalancer
- ClusterIP:默认Service类型,用于在集群内部的IP地址上公开服务,只允许从集群内部访问
- NodePort:通过每个worker节点上的静态绑定端口访问服务
- LoadBalancer:通过云供应商的负载均衡提供服务访问

Deployment
- 通常用于描述Pod,使得 Pod 和 ReplicaSet 能够进行声明式更新
- 使用 Deployment 来运行应用,可以动态地创建和销毁 Pod
- 每个 Pod 会获得属于自己的 IP 地址

6 - 参考信息


posted @ 2019-08-21 23:19  Anliven  阅读(1662)  评论(0编辑  收藏  举报