Kubernetes 入门

说明

本文档基于 kubernetes 权威指南,我基于自己的看书理解整理的一份笔记。

为什么叫 k8s

Kubernetes 简称 k8s,它的名字起源于古希腊,是舵手的意思,其logo如下

它既像一张渔网又像一个罗盘。

kubernetes 是谷歌的开源产品,其实谷歌在很多年前就有个内部的容器管理工具,叫Brog。

外国的东西到了国内就喜欢被起一些奇奇怪怪的名字,比如苹果的系统 finder 到了国内就被叫撑了访达这么奇葩的名字,kubernetes 也是如此,国内都简称他为k8s。所以下面都叫k8s

什么是 kubernetes

kubernetes 是一个全新的基于容器技术的分布式架构的领先方案。Kunernetes 是一个开放的开发平台,没有限定任何的编程接口。Kubernetes 是一个完备的分布式系统支撑平台。Kubernetes 具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建只能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源调度机制,以及多粒度的资源配额管理能力。同时 Kubernetes 提供了完善的管理工具,这些工具涵盖了包括开发、部署测试、运维监控在内的各个环节。因此 Kubernetes 是一个全新的基于容器技术的分布式解决方案,并且是一个一站式的完备的分布式形同开发和支撑平台。

一个产品通常由多个组成,容器只是供一个应用服务的能力,需要把多个应用编排组合起来才能提供服务。Kubernetes 是自动化编排容器应用的开源平台,这些操作不仅包括部署、调度和节点集群件的扩展,还包括服务发现和配置服务等架构支持的基础能力,此外 Kubernetes 不仅支持 Docker ,还支持 Rocket 等不同的底层容器技术。

Kubernetes 是第一个将“一切皆服务,一切围绕服务运转”作为指导思想的创新型产品。

kubernetes 的基本知识

Service

k8s 中,Service (服务) 是分布式集群架构的核心,一个 Service 对象拥有如下特征:

  • 拥有一个指定的名称。
  • 拥有一个虚拟 IP (Cluster IP、Service IP或 VIP)以及端口号
  • 提供了某种远程服务能力
  • 能够被映射到提供这种服务能力的一组容器应用上。

Service 的服务进程都是基于socket的方式对外提供服务的。比如redis、http等服务

Pod

容器提供了强大的隔离功能,所以必须要把 Service 提供服务的这组进程放入容器中进行隔离,因此 Kubernetes 设计了 Pod,它是最小的部署单元。为了建立 Service 和Pod 的关系,k8s 首先给每个 Pod 贴上一个标签,比如给 mysql 贴个标签为name=mysql,php 贴个标签 name=php,然后给相应的 Service 定义标签选择器(Label Selector),比如mysql Service的label 的选择条件为name=mysql,则意味着该Service 要包含所有name=mysql的的pod上。

Pod运行在我们称之为节点(Node)的环境中,这个节点可以是物理机、虚拟机、公有云或私有云上的主机,同城一个节点运行上百个 Pod,其次每个 Pod 运行一个特殊的 pasue 的容器,其他容器则为业务容器,这些业务容器共享 pause 的容器的网络栈和 volume 挂在卷,因此数据通信更加高效,我们可以将一些密切相关的服务进放入一个 Pod中。

并不是每个 Pod 和他里面运行的容器都能被映射到一个 Service 中,只有那些提供服务的一组 Pod 才会被映射到一个服务。

集群

k8s 集群划分为一个master节点和一群工作节点(node),其中:

  • Master节点运行一组进程,包括kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了集群资源的管理、Pod的调度、弹性伸缩、安全控制、系统监控和纠错管理等功能,并且这些都是自动化的完成的。

  • Node 作为集群中的工作节点,运行着真正的应用程序,在 node 上 k8s 管理最小的单元 Pod,它运行着 kubelet、kube-proxy 服进程,这些服务进程负责 Pod 的创建、监控、启动、重启和销毁以及实现软件模式的负载均衡。

RC

在k8s 集群中,只需要扩容的Service 关联的 Pod 创建一个 Replication Controller (RC) 则该Service 的扩容以至于后来的Service 升级等问题都能完成。

在一个 RC 定义文件中包含 3 个关键信息

  • 目标 Pod 的定义
  • 目标 Pod 需要运行的副本数量
  • 要监控的目标 Pod的标签

在定义好 RC 后,k8s 会通过定 RC 定义中的 label 筛选出对应的 Pod 实例并进行实时的监控其状态和数量。如果实例少于定义的副本数则会根据 RC 定义的 Pod 模板创建新的 Pod,无须人工干预,有了 RC 扩容只需要修改 RC 中的副本数就可以了。