flame

路漫漫其修远兮 吾将上下而求索

0%

kubernetes

Kubernetes : 容器编排引擎的事实标准

Reference

Concepts

Concept

  • Cluster
  • Master
  • Node
  • Pod
  • Controller
  • Service
  • Namespace

Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用。

Master是Cluster的大脑,它的主要职责是调度,即决定将应用放在哪里运行。为了实现高可用,可以运行多个Master

Node的职责是运行容器应用,由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期

Pod是k8s的最小工作单元。每个Pod包含一个或多个容器,Pod中的容器会作为一个整体被Master调度到一个Node上运行

Controller管理Pod,定义了Pod的部署特性,为了满足不同的业务场景,k8s提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等

Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。

Namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。


Pod

Kubernetes引入Pod主要基于下面两个目的:

  • 可管理性

    1
    2
    Pod提供了比容器更高层次的抽象,将它们封装到一个部署单元中。
    Kubernetes以Pod为最小单位进行调度、扩展、共享资源、管理生命周期
  • 通信和资源共享

    1
    2
    Pod中的所有容器使用同一个网络namespace,即相同的IP地址和Port空间,可以直接用localhost通信
    可以共享存储,当Kubernetes挂载volume到Pod,本质上是将volume挂载到Pod中的每一个容器。

Pods有两种使用方式

  • one-container-per-pod

    只是将单个容器简单封装成Pod

  • 运行多个容器

    这些容器联系必须非常紧密,而且需要直接共享资源


Controller

Controller管理Pod,定义了Pod的部署特性,为了满足不同的业务场景,Kubernetes提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。

  • Deployment是最常用的Controller,可以管理Pod的多个副本,并确保Pod按照期望的状态运行

  • ReplicaSet实现了Pod的多副本管理。使用Deployment时会自动创建ReplicaSet,Deployment是通过ReplicaSet来管理Pod的多个副本,通常不需要直接使用ReplicaSet

  • DaemonSet用于每个Node最多只运行一个Pod副本的场景,DaemonSet通常用于运行daemon

  • StatefuleSet能够保证Pod的每个副本在整个生命周期中名称是不变的,而其他Controller不提供这个功能。当某个Pod发生故障需要删除并重新启动时,Pod的名称会发生变化,同时StatefuleSet会保证副本按照固定的顺序启动、更新或者删除

  • Job用于运行结束就删除的应用,而其他Controller中的Pod通常是长期持续运行


Namespace

不同Namespace里的资源是完全隔离的,k8s默认创建了两个Namespace

  • default:创建资源时如果不指定,将被放到这个Namespace中。
  • kube-system:Kubernetes自己创建的系统资源将放到这个Namespace中。

Install

how to install

kubelet、kubeadm和kubectl命令

  • kubelet运行在Cluster所有节点上,负责启动Pod和容器。
  • kubeadm用于初始化Cluster。
  • kubectl是Kubernetes命令行工具。通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

架构

Kubernetes Cluster由Master和Node组成,节点上运行着若干Kubernetes服务。

Master节点

Master是Kubernetes Cluster的大脑,运行着的Daemon服务,包括:

  • API Server(kube-apiserver)
  • Scheduler(kube-scheduler)
  • Controller Manager(kube-controller-manager)
  • etcd
  • Pod网络(例如fannel)

API Server

API Server提供HTTP/HTTPS RESTful API,即Kubernetes API。API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。

Scheduler

Scheduler负责决定将Pod放在哪个Node上运行。Scheduler在调度时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求

Controller Manager

Controller Manager负责管理Cluster各种资源,保证资源处于预期的状态。Controller Manager由多种controller组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等。

不同的controller管理不同的资源。例如,replication controller管理Deployment、StatefulSet、DaemonSet的生命周期,namespace controller管理Namespace资源。

etcd

etcd负责保存Kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件。

Pod网络

Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络,fannel是其中一个可选方案

Node节点

Node是Pod运行的地方,Kubernetes支持Docker、rkt等容器Runtime。

Node上运行的Kubernetes组件有kubelet、kube-proxy和Pod网络(例如fannel)

kubelet

kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet根据这些信息创建和运行容器,并向Master报告运行状态。

kube-proxy

service在逻辑上代表了后端的多个Pod,外界通过service访问Pod。service接收到的请求是如何转发到Pod的呢?每个Node都会运行kube-proxy服务,它负责将访问service的TCP/UPD数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。

Pod网络

Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络,fannel是其中一个可选方案。

实验环境

k8s架构演示

几乎所有的Kubernetes组件本身也运行在Pod里,kubelet是唯一没有以容器形式运行的Kubernetes组件。Kubernetes的系统组件都被放到kube-system namespace中。

1
2
//查看系统组件
kubectl get pot --all-namepaces -o wide

question: 为什么k8s-master上也有kubelet和kube-proxy呢?

因为Master上也可以运行应用,即Master同时也是一个Node。