Kubernetes

Kubernetes概述

Kubernetes也被称为K8s(以下简称K8s)

由Google建立,如今已经成为一个开源的,最受欢迎的容器编排技术(container orchestration technology)

Container-Docker

为什么需要容器

例如,一个项目,如果web服务器用nodejs,数据库用mongodb,缓存用redis,配置和部署工具用ansible。用这些不同的组件可能会带来一些痛点:

  1. 这些组件是否和底层操作系统兼容。我们必须确保这些服务与我们拟采用的操作系统版本兼容。
  2. 这些组件是否和libraries或dependencies兼容。可能出现其中一个组件需要A版本的dependency和library,另一个却需要B版本的dependency和library。这可能导致组件的更新,而每一次组件的更新,都要重新检查所有组件是否与底层基础设施兼容。
  3. 当有新员工入职,安装开发环境十分麻烦,新员工必须尝试各种版本,阅读各种文档才能完成环境配置。
  4. 在不同的开发、测试、生产环境中使用的OS可能不同,不同的开发者使用的OS也可能不同,不能保证相同的应用在不同的环境能够稳定运行。

针对以上痛点,Docker应运而生。Docker使不同组件分别在不同的容器中运行,这些容器拥有自己独立的libraries或dependencies。所有容器在相同的虚拟机和操作系统中运行。

什么是容器

容器是完全隔离的环境。容器有自己的进程或服务、网络接口,类似虚拟机。

虚拟机和容器的区别

  • Docker中的容器全部运行在相同的OS之上,而VM则运行在各自的OS上

  • 由于虚拟机需要运行多个OS和内核,所以它具有更高的资源利用率。虚拟机较重,消耗更多磁盘空间,通常大小以GB计,而Docker容器是轻量级的,通常大小以MB计。

  • 由于虚拟机需要启动数个OS,所以它的启动速度较慢,通常以分钟计,而Docker容器启动较快,通常以秒计。

  • 由于虚拟机不依赖底层的OS或内核,所以可以在同一个虚拟机监视器(VMM, Virtual Machine Monitor, AKA hypervisor)上运行不同类型的操作系统,例如基于linux或基于windows的操作系统。

容器编排(Container Orchestration)

什么是容器编排

协调容器之间的连接性,并根据负载自动扩/缩容。 容器自动部署和容器管理的整个过程被称为容器编排。

容器编排技术

K8s是容器编排技术中的一种,还有Docker Swarm, Apache Mesos。

  • Docker Swarm:易于安装和上手,但缺少自动扩/缩容的功能特性。
  • Apache Mesos:很难安装和上手,但支持许多高级功能特性。
  • K8s:最流行的一种,设置和上手有点困难,但它提供了许多定制部署的选项,并支持复杂架构的部署。 被云服务提供商支持,如GCP、Azure和AWS,且K8s项目是Github排名最高的项目之一。

容器编排的优点

  • 高可用。多应用实例在不同节点上运行,不会轻易宕机
  • 自动扩/缩容。用户流量在各种容器之间负载均衡,当硬件资源紧张时,可以在不停止应用的情况下进行自动扩/缩容。

K8s架构

基本概念:

  • 节点(Nodes, Minions):节点是一台安装有K8s的物理或虚拟机器。

  • 集群(Cluster):集群是由一组节点组成的。如果其中一个节点发生宕机,应用仍然可以在其他节点运行。此外,多个节点还有助于分担负载。

  • 主节点(Master):主节点监视集群中的其他节点,并负责工作节点上容器的实际编排。

K8s组件:

  • API服务器:API服务器是K8s的前端。用户、管理设备、命令行接口都通过与API服务器通信的方式来与K8s集群交互
  • ETCD密钥库:一个分布式的键值对存储,K8s用它来存储用于管理集群的所有数据。当集群中有多个从节点及多个主节点时,ETCD以分布式的方式将所有信息存储在集群中的所有节点上。 ETCD负责在集群内实现锁,以确保master之间没有冲突。
  • Kubelet服务:Kubelet是运行在集群中每个节点上的代理。 代理负责确保容器按照预期在节点上运行。
  • 容器运行时(Container runtime):容器运行时是用于运行容器的底层软件。例如Docker、Rocket或CRIO。
  • 控制器(Controllers):控制器是容器编排的大脑。 当节点、容器或端点出现故障时,它们负责发现并作出响应,决定启用新容器。
  • 调度器(Schedulers):调度器负责跨多个节点分发工作或容器。 它查找新创建的容器并将它们分配给这些节点。

主节点与其他工作节点(从节点)的区别

  • 主节点有kube-apiserver。用户可以通过与apiserver通信来与K8s交互

  • 从节点有kubelet代理,它负责与主节点交互,向主节点提供从节点的健康信息,并在从节点上执行主节点请求的操作。

  • 收集的所有信息都存储在主节点上的键值存储区etcd中。
  • 主节点还具有控制器和调度器。

kubectl指令

kubectl,也叫做kube命令行工具。

kubectl指令可以部署和管理K8s集群上的应用程序,获取集群信息,获取集群中多个节点的状态等。以下是一些常用命令:

kubectl run: 在集群中部署应用

kubectl cluster-info: 查看集群基本信息

kubectl get nodes: 列出集群节点信息

Demo-Setup Kubernetes

单机-Minikube

在WSL 2中安装Minikube

打开WSL命令行终端,安装kubectl,Docker,Minikube,详见minikube start | minikube (k8s.io)

多机-kubeadm

PODs

K8s不是直接将容器部署在工作节点上的,容器被PODs封装成一个K8s单位,一个POD对应应用的一个实例。POD是在K8s中你所能部署的最小单位

PODs通常和运行应用的容器是一对一关系。如果想要扩增容积,创建新PODs;想要缩小容积,删除PODs。不需要向现有的PODs中添加额外的容器来扩展应用程序。

注意,在少数情况下,一个POD也可以包含多个容器。在某些场景下,你可能会需要用到一些为应用程序起到辅助支持作用的辅助容器,PODs自动将应用容器与辅助容器一一对应,使辅助容器和应用容器在同一个POD中共存。同一个POD中的容器可以通过网络进行通信,也可以共享相同的存储空间。

用kubectl指令部署POD

kubectl run nginx --image nginx : 通过创建POD部署docker容器,通过–image参数来指定image名

kubectl get pods: 查看PODs列表

K8S基本概念-PODs | ReplicaSets | Deployment | Services

YAML配置PODs

创建pod.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: nginx
lables:
app: nginx
tier: frontend
spec:
containers:
- name: nginx
image: nginx

执行kubectl apply -f pod.yaml 创建POD

执行kubectl get pods 查看是否创建成功

0%