1 kubernetes简介

Kubernetes简称K8s,是Google于2014年6月基于其内部使用的Borg系统开源的容器编排平台,可用于大规模运行分布式应用和服务。2015年,Google、RedHat 等开源基础设施领域公司,共同牵头发起了一个名为 CNCF(Cloud Native Computing Foundation)的基金会,希望以Kubernetes项目为基础,建立一个由开源基础设施领域厂商主导的、按照独立基金会方式运营的平台级社区。Kubernetes可以说是Google 公司在容器化基础设施领域多年来实践经验的沉淀与升华,加上近几年不断壮大的开源社区对其贡献,现在已经基本成为容器编排调度框架的标准。

2 kubernetes架构

2.1 核心组件

apiserver

提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;

controller manager

负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

kubelet

负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;

etcd

保存了整个集群的状态;

scheduler

负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;

kube-proxy

负责为 Service 提供 cluster 内部的服务发现和负载均衡;

container runtime

负责镜像管理以及 Pod 和容器的真正运行(CRI);
image.png
kubernetes架构图

2.2 基本概念和术语

Master

Master是集群控制节点,每个集群需要一个Master来负责整个集群的管理和控制。基本上所有的控制命令都发给它。Master上运行的关键进程有:apiserver、scheduler、controller manager,通常还有etcd。

Node

Node是提供计算能力的工作负载节点,是所有 Pod 运行所在的工作主机。Node上运行的关键节点有kubelet、kube-proxy、docker。

Pod

Pod 是在 Kubernetes 集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod 的设计理念是支持多个容器在一个 Pod 中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod 对多容器的支持是 K8 最基础的设计理念。

Replication Controller (RC)

RC 是 Kubernetes 集群中最早的保证 Pod 高可用的 API 对象。通过监控运行中的 Pod 来保证集群中运行指定数目的 Pod 副本。指定的数目可以是多个也可以是 1 个;少于指定数目,RC 就会启动运行新的 Pod 副本;多于指定数目,RC 就会杀死多余的 Pod 副本。RC只适用于长期的业务类型,比如Web 服务。

Replica Set (RS)

RS 是新一代 RC,提供同样的高可用能力,区别主要在于 RS 后来居上,能支持更多种类的匹配模式。

Deployment

Deployment表示用户对 Kubernetes 集群的一次更新操作。Deployment是一个比 RS 应用模式更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减小到 0 的复合操作;这样一个复合操作用一个 RS 是不太好描述的,所以用一个更通用的 Deployment 来描述。

Service

Service解决如何访问服务的问题。服务执行在具体哪些Pod上是变化的,不能以确定的 IP 和端口号提供服务,要稳定地提供服务需要服务发现和负载均衡能力。每个 Service 会对应一个集群内部有效的虚拟 IP,通过这个IP就能找到对应的的后端服务实例。服务的负载均衡是由 Kube-proxy 实现的。

Job

Job 是用来控制批处理型任务的 API 对象。Job 管理的 Pod 根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的 spec.completions 策略而不同:单 Pod 型任务有一个 Pod 成功就标志完成;定数成功型任务保证有 N 个任务全部成功。

DaemonSet

前面所述的API对象并不能保证在每个node上都运行有某个服务,而有些后台支撑型服务(如存储,日志和监控等)需要运行在每一个node上,DaemonSet就是用来控制这类服务的API对象。DaemonSet保证每个通过 nodeSelector 选定的节点上都有一个此类 Pod 运行。

StatefulSet

RC 和 RS 主要是控制提供无状态服务的,其所控制的 Pod 的名字是随机设置的,一个 Pod 出故障了就被丢弃掉,在另一个地方重启一个新的 Pod,只用保证Pod总数不变。而 StatefulSet 是用来控制有状态服务,StatefulSet 中的每个 Pod 的名字都是事先确定的,不能更改。RC 和 RS 中的 Pod一般不挂载存储或者挂载共享存储,保存的是所有 Pod 共享的状态。而StatefulSet中的每个 Pod 挂载自己独立的存储,如果一个 Pod 出现故障,从其他节点启动一个同样名字的 Pod,要挂载上原来 Pod 的存储继续以它的状态提供服务。

Volume

Kubernetes 集群中的存储卷跟 Docker 的存储卷有些类似,只不过 Docker 的存储卷作用范围为一个容器,而 Kubernetes 的存储卷的生命周期和作用范围是一个 Pod。每个 Pod 中声明的存储卷由 Pod 中的所有容器共享。

Persistent Volume 和 Persistent Volume Claim

PV 描述的,是持久化存储数据卷,主要定义的是一个持久化存储在宿主机上的目录,比如一个 NFS 的挂载目录。PVC 描述的,则是 Pod 所希望使用的持久化存储的属性。比如,Volume 存储的大小、可读写权限等等。PV 和 PVC 使得 Kubernetes 集群具备了存储的逻辑抽象能力,使得在配置 Pod 的逻辑里可以忽略对实际后台存储技术的配置,而把这项配置的工作交给 PV 的配置者,即集群的管理者。

Secret

Secret 是用来保存和传递密码、密钥、认证凭证这些敏感信息的对象。使用 Secret 的好处是可以避免把敏感信息明文写在配置文件里。

User Account 和 Service Account

User Account为人提供账户标识,而Service Account为计算机进程和 Kubernetes 集群中运行的 Pod 提供账户标识。User Account对应的是人的身份,人的身份与服务的 namespace 无关,所以User Account是跨 namespace 的;而Service Account对应的是一个运行中程序的身份,与特定 namespace 是相关的。

Namespace

命名空间为 Kubernetes 集群提供虚拟的隔离作用。

3 kubernetes部署

K8s的部署原本比较麻烦,除了将各个组件编译成二进制文件外,用户还要负责为这些二进制文件编写对应的配置文件、配置自启动脚本,以及为 kube-apiserver 配置授权文件等等诸多运维工作。2017 年,Kubernetes社区才发起了一个独立的部署工具,名叫kubeadm,这个工具可以让用户通过两条命令完成一个k8s集群的部署:

  1. 创建一个Master节点:
    kubeadm init
  2. 将一个Node节点加入到当前集群中:
    kubeadm join

kubeadm是使用容器进行部署k8s组件的,但是,由于kubelet配置容器网络、管理容器数据卷时,都需要直接操作宿主机,如果kubelet运行在一个容器里,那么直接操作宿主机就会变得很麻烦,kubeadm的部署方案是:把 kubelet 直接运行在宿主机上,然后使用容器部署其他的 Kubernetes 组件。
于是,部署k8s集群的步骤:

  1. 安装doceker,可手动下载docker-ce的安装包进行安装
  2. 禁止防火墙、关闭swap、禁止selinux ```

    禁止防火墙

    $ sudo ufw disable

    关闭swap

    $ sudo swapoff -a

    永久关闭swap分区

    $ sudo sed -i ‘s/.swap./#&/‘ /etc/fstab

禁⽌selinux

安装操控selinux的命令

$ sudo apt install -y selinux-utils # 禁⽌止selinux $ setenforce 0

重启启操作系统 $ shutdown -r now

查看selinux是否已经关闭 $ sudo getenforce Disabled(表示已经关闭)

  1. 3. 安装kubeadmkubelet kubectl

apt-get install kubeadm kubelet kubectl


4.  初始化master节点

为了让pod网络不与任何主机网络重叠,应使用一个合适的CIDR块来代替,然后在执行 kubeadm init 时使用 --pod-network-cidr参数:

kubeadm init —pod-network-cidr=10.244.0.0/16 ```

  1. 加入node节点。

kubeadm会为集群生成一个bootstrap token。在后面,只要持有这个token,任何一个安装了kubelet和kubadm的节点,都可以通过kubeadm join加入到这个集群当中。