Kubernetes入门

Kubernetes分享

简介

容器编排引擎
基于容器的应用一般会采用微服务架构。在这种架构下,应用被划分为不同的组件,并以服务的形式运行在各自的容器中,通过 API 对外提供服务。为了保证应用的高可用,每个组件都可能会运行多个相同的容器。这些容器会组成集群,集群中的容器会根据业务需要被动态地创建、迁移和销毁。这样一个基于微服务架构的应用系统实际上是一个动态的可伸缩的系统。这对部署环境提出了新的要求,我们需要有一种高效的方法来管理容器集群。而这,就是容器编排引擎要干的工作。
所谓编排,通常包括容器管理、调度、集群定义和服务发现等。通过容器编排引擎,容器被有机的组合成微服务应用,实现业务需求。

Kubernetes提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。

K8s架构图

K8S架构

[^_^]:
这是可爱的注释

  • Master节点

    • kube-apiserver
      API Server作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTful接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd。

    • kube-scheduler
      Scheduler 负责决定将 Pod 放在哪个 Node 上运行。Scheduler 在调度时会充分考虑 Cluster 的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。

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

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

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

  • Node节点

    • kubelet
      负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。

    • kube-proxy
      负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。如果有多个副本,kube-proxy 会实现负载均衡。

搭建k8s集群

k8s核心概念

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

  • Master
    Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。Master 运行 Linux 操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个 Master。

  • Node
    Node 的职责是运行容器应用。Node 由 Master 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。Node 运行在 Linux 操作系统,可以是物理机或者是虚拟机。

  • Pod
    Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。
    Kubernetes 引入 Pod 主要基于下面两个目的:
    1、可管理性。
    有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期。
    2、通信和资源共享。
    Pod 中的所有容器使用同一个网络 namespace,即相同的 IP 地址和 Port 空间。它们可以直接用 localhost 通信。同样的,这些容器可以共享存储,当 Kubernetes 挂载 volume 到 Pod,本质上是将 volume 挂载到 Pod 中的每一个容器。

  • Controller
    Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

  • Service
    Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,Service 为 Pod 提供了负载均衡。可以通过nodeport实现对外提供服务。

  • Namespace
    Namespace 可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。不同 Namespace 里的资源是完全隔离的。使用namespace来组织kubernetes的各种对象,可以实现对用户的分组,即“多租户”管理。对不同的租户还可以进行单独的资源配额设备和管理,使得整个集群配置非常灵活、方便。

  • Label
    label是kubernetes系统中的一个核心概念。Label以key/value键值对的形式附加到各种对象上,如pod、service、RC、Node等。Label定义了这些对象的可识别属性,用来对它们进行管理和选择。Label可以在创建对象时附加到对象上,也可以在对象创建后通过API进行管理。

  • Volume
    volume是pod中能够被多个容器访问的共享目录。Kubernetes的volume概念与docker的volume比较类似,但并不完全相同。Kubernetes中的volume与pod生命周期相同,但与容器的生命周期不相关。当容器终止或重启时,volume中的数据也不会丢失。另外,kubernetes支持多种类型的volume,并且一个pod可以同时使用任意多个volume。

  • Annotation
    Annotation则是用户任意定义的“附加”信息,以便于外部工具进行查找。

  • 健康检查
    pod通过两类探针来检查容器的健康状态。一个是LivenessProbe探针,用于判断容器是否健康,告诉kubelet一个容器什么时候处于不健康的状态。如果LivenessProbe探针探测到容器不健康,则kubelet将删除容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是“success”.另一类是ReadinessProbe探针,用于判断容器是否启动完成,且准备接收请求。如果ReadinessProbe探针检测到失败,则pod的状态将被修改。Endpoint controller将从service的endpoint中删除包含该容器所在pod的IP地址的endpoint条目。

Controller组件

  • Replication Controller
    Replication Controller的核心作用是确保在任何时间集群中一个RC所关联的pod都保持一定数量的pod副本处于正常运行状态。

  • Node Controller
    Node Controller负责发现、管理和监控集群中的各个node节点。

  • ResourceQuota Controller
    作为容器集群的管理平台, kubernetes也提供了资源配额管理这一高级功能,资源配额管理确保指定的对象在任何时候都不会超量占用系统资源,避免了由于某些业务进程的设计或实现的缺陷导致整个系统运行紊乱甚至意外宕机,对整个集群的平稳运行和稳定性有非常重要的作用。

目前kubernetes支持三个层次的资源配额管理:
(1)容器级别,可以对CPU和内存的资源配额管理。
(2)pod级别,可以对pod内所有容器的可用资源进行限制。
(3)namespace级别,为namespace(可以用于多租户)级别的资源限制,包括:pod数量、replication Controller数量、service数量、ResourceQuota数量、secret数量、可持有的PV(persistent volume)数量。
kubernetes的配额管理是通过准入机制(admission control)来实现的,与配额相关的两种准入控制器是LimitRanger和ResoureQuota,其中LimitRanger作用于pod和container上,ResourceQuota则作用于namespace上。

  • Namespace Controller
    负责管理集群namespace资源。

  • Token Controller
    token controller对象监听Service Account的创建、修改和删除事件,并根据事件的不同做不同的处理。

  • Service Controller
    Kubernetes service是一个定义pod集合的抽象,或者被访问都看作一个访问策略,有时也被称为微服务。

k8s核心功能

  • 应用部署
1
2
3
kubectl run kubernetes-bootcamp \
--image=docker.io/jocatalin/kubernetes-bootcamp:v1 \
--port=8080
  • 应用访问
1
2
3
kubectl expose deployment/kubernetes-bootcamp \
--type="NodePort" \
--port 8080
  • 应用扩缩容
1
kubectl scale deployments/kubernetes-bootcamp --replicas=3
  • 滚动更新
1
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
  • 应用回滚
1
kubectl rollout undo deployments/kubernetes-bootcamp
  • 弹性伸缩
1
kubectl autoscale deployment sqm-deploy --cpu-percent=20 --min=1 --max=5

Kubernetes API

Kuberbetes API是集群系统中重要组成部分,k8s中各种资源的数据通过该API接口被提交到后端的持久化存储中,Kubernetes集群中的各部件之间通过该API接口实现解耦合,同时K8s集群中一个重要且便捷的管理工具kubctl也是通过访问该API接口实现强大的管理功能的。

Api文档地址

官方支持的Kubernetes客户端库:
Go语言
Python语言

安全机制

  • Authentication认证
    • CA
    • Token
    • HTTP Base
  • Authorization授权(作用于Api Server主要端口的所有HTTP访问)
    • AlwaysDeny
    • AlwaysAllow
    • ABAC
    • RBAC
  • Admission Control准入控制(用于拦截所有经过认证和鉴权后访问Api Server请求的插件)
    • AlwaysAdmin
    • AlwaysDeny
    • ServiceAccount
    • ResourceQuota
    • LimitRanger
    • SecurityContexDeny

资源配额管理

需要保证kube-apiserver中的–admission_control参数中包含“LimitRanger,ResourceQuota”;

  • 指定容器配额

通过Pod或ReplicationController的定义文件中设定resources属性即可为某个容器指定配额(仅支持CPU和内存)。

  • 全局默认配额

通过创建LimitRange对象来定义一个全局默认配额模板。这个默认配额模版会加载到集群中的每个Pod及容器上。LimitRange可以同时在Pod和Container两个级别上进行资源配置。可关联到指定的Namespace上。

  • 多租户配额管理

不同的租户对应Namespace加载对应的ResourceQuota配置即可。

读懂YAML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
template:
metadata:
labels:
app: web_server
spec:
containers:
- name: nginx
image: nginx:1.7.9
port:
- containerPort: 8080
volumeMounts:
- name: "persistent-storage"
mountPath: "/data"
volumes:
- name: "persistent-storage"
hostPath:
path: "/data"
  1. apiVersion指定当前配置格式的版本;
  2. kind指定要创建的资源类型;
  3. metadata指该资源的元数据信息,name是必须的元数据项;
  4. spec指定该Deployment规格说明;
  5. replicas指明副本数量,默认为1;
  6. template定义Pod模板;
  7. metadata定义Pod元数据,至少要定义一个label;
  8. spec描述Pod的规格,此部分定义Pod中每一个容器的属性,期中name和image是必需的;
  9. volumes指定了应用使用的存储卷,其中containers下定义容器挂载的卷;
Thank you for your support!