Kubernetes 学习笔记

什么是Kubernetes

Kubernetes 是 Google 开源的基于容器技术的分布式架构领先方案,提供应用部署、维护、扩展机制等功能,利用 Kubernetes 能方便地管理跨机器运行容器化的应用。

单容器( contianer )所遇到的问题

  • 需要被管理
  • 网络环境复杂
  • 容器需要被调度、分发,以及配置负载均衡
  • 数据需要被保存在其他地方

  • 使用 Docker 对应用程序打包、实例化、运行
  • 以集群的方式运行、管理跨机器的容器
  • 解决 Docker 跨机器容器之间的通讯问题

核心概念

分为 master 和 node 节点,master 为集群控制节点
master 节点通常会占据一个独立的服务器(高可用部署建议使用三台服务器(如果 master 和 etcd 部在一起的话))

master上:etcd, controller, scheduler, api server

  • etcd: key-value 存储,集群状态管理,是运行在多节点上的分布式键值存储,高可用(奇数个,必须半数以上的选举,容错能力限制于节点数的一半,选举 raft)
  • controller:控制器(多个控制器组成)选举
  • scheduler:调度器,负责资源调度(pod 调度)的进程 选举。scheduler 的职责很明确,就是负责调度 pod 到合适的 Node 上。如果把 scheduler 看成一个黑匣子,那么它的输入是 pod 和由多个 Node 组成的列表,输出是 Pod 和一个 Node 的绑定,即将这个 pod 部署到这个 Node 上。Kubernetes 目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
  • api server:暴露接口,处理请求。提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。APIServer负责对外提供RESTful的 Kubernetes API 服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给 APIServer 处理后再提交给 etcd,kubectl( Kubernetes 提供的客户端工具,该工具内部就是对 Kubernetes API 的调用)是直接和 APIServer 交互的。

node上:kubelet, kubeproxy, runtime

  • kubelet:管理 pod,负责 pod 对应的容器的创建、启停等任务,同时与 master 节点密切协作,实现集群管理的基本功能
  • kubeproxy: 实现 kubernetes service 的通信与负载均衡机制的重要组件
  • runtime: runtime 指的是容器运行环境,目前 Kubernetes 支持 docker 和 rkt 两种容器。

除了核心组件,还有一些推荐的 Add-ons:

  • kube-dns:负责为整个集群提供 DNS 服务
  • Ingress Controller:为服务提供外网入口
  • Heapster:提供资源监控
  • Dashboard:提供GUI
  • Federation:提供跨可用区的集群
  • Fluentd-elasticsearch:提供集群日志采集、存储与查询

网络预置

  • 所有 pods 之间可以相互通信
  • 所有 pods 和 nodes 可以相互通信
  • 不做 NAT

设计原则

声明式编程(Declarative)

声明式与命令式的区别

Declarative 的定义是用户设定期望的状态,系统会知道它需要执行什么操作,来达到期望的状态。
而对于 Imperative,需要用户告诉系统需要做什么。比如说用户说创建一个新的 Container,系统才会创建一个新的 Container。

Level-triggered

Pod

基本概念

  • Kubernetes 中最小计算和被调度单元
  • 是多个容器的集合,pod 中的容器共享 namespacevolume
  • 一 pod 一 ip

pod 的五大状态(生命周期,pod phase)

  • Pending:系统已经接受 pod 实例的创建,但其中所包含容器的一个或者多个 image 还没有创建成功。Pending 包含调度计算与通过网络创建 image,所以此 phase 的时间可能会有点长。
  • Running:Pod 已经被调度到某个 node 上,pod 包含的所有容器已经创建完成,至少有一个容器正常运行或者处于启动与重启动过程。
  • Failed:Pod 中所有容器已终止运行,至少有一个容器非正常结束,比如退出码非零,被系统强制杀死等。
  • Succeeded:Pod 中的所有容器正常终止,并且不会再次启动。
  • Unknown:无法取得 pod 状态,一般是网络问题引起。

pod 的重启策略

  • Always:总是重启
  • Never:从不重启
  • OnFailure:失败时重启

API

API 资源结构

  • apiVersion:api 版本
  • kind:资源类型
  • metadata:元数据
  • spec:Spec 是让用户写入期望的状态,系统可以通过 Spec 读出用户的期望
  • status:Status 是系统写入观察到的状态,用户可以从中读出系统当前是什么状态

API 扩展方法

  • CRD:自定义 api
  • aggregator:让用户利用全部的 Kubernetes API 实现自己的 apiserver,封装服务层

RC, RS, Deployment

RC

推荐使用 RS + Deployment 来代替 RC
是比 pod 高一级的存在
RC 与 Pod 的关联是通过 Label 来实现的(通过 selector)
Label 是键值对,可用于筛选资源

RS

大部分与 RC 相同,除了 rolling update (RS 特有)

Deployment

比 RS 高一级的定义微服务应用的抽象层
Deployments 创建 RS

PV, PVC

PV 与 PVC 一一对应
管理员定义 PV, 用户使用 PVC

你可能感兴趣的:(Kubernetes 学习笔记)