1、k8s基础概念

  • 官网: https://kubernetes.io
  • GitHub : https://aithub.com/kubernetes/kubernetes
  • 由来∶谷歌的Borg系统,后经Go语言重写并捐献给CNCF基金会开源含义:词根源于希腊语∶舵手/飞行员,K8S →K12345678S
  • 重要作用:开源的容器编排框架工具(生态极其丰富)
  • 学习的意义︰解决跑裸docker的若干痛点

使用Docker容器化封装应用程序的缺点(坏处)·

  • 单机使用,无法有效集群·随着容器数量的上升,管理成本攀升
  • 没有有效的容灾/自愈机制
  • 没有预设编排模板,无法实现快速、大规模容器调度·
  • 没有统一的配置管理中心工具
  • 没有容器生命周期的管理工具·
  • 没有图形化运维管理工具

Kubernetes优势·
自动装箱,水平扩展,自我修复

  • 服务发现和负载均衡
  • 自动发布(默认滚动发布模式)和回滚·
  • 集中化配置管理和密钥管理
  • 存储编排
  • 任务批处理运行

Kubernetes快速入门

2、四组基本概念.

  1. Pod/Pod控制器

pod

  1. - Pod- PodK8S里能够被运行的最小的逻辑单元(原子单元)
  2. - 1Pod里面可以运行多个容器,它们共享UTS+NET+IPC名称空间。
  3. - 可以把Pod理解成豌豆荚,而同一Pod内的每个容器是一颗颗豌豆.
  4. - 一个Pod里运行多个容器,又叫:边车(SideCar)模式

pod控制器
Pod控制器是Pod启动的一种模板,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数、生命周期、健康状态检查…)K8S内提供了众多的Pod控制器,常用的有以下几种

  - DeploymentDaemonSet. 
  - ReplicaSet. 
  - StatefulSet. 
  - Job
  - Cronjob
  1. Name/Namespace
    • Name
      • 由于K8S内部,使用“资源”来定义每一种逻辑概念(功能)故每种“资源”,都应该有自己的“名称”。
      • 资源”有api版本(apiVersion)类别(kind )、元数据( metadata)、定义清单( spec )、状态( status )等配置信息。
      • “名称”通常定义在“资源”的“元数据”信息里。
  • NameSpace
    • 随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内各种“资源”的方法,这就是名称空间名称空间可以理解为K8S内部的虚拟集群组。
    • 不尚名称空间内的“资源”,名称可以相同,相同名称空间内的同种“资源”,“名称”不能相同。
    • 合理的使用K8S的名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览
    • .K8S里默认存在的名称空间有:default、 kube-system、kube-public·查询K8S里特定“资源”要带上相应的名称空间
  1. Label/Label选择器

    • Label
      • 标签是k8s特色的管理方式,便于分类管理资源对象。
      • 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
      • 一个资源拥有多个标签,可以实现不同维度的管理。
      • 标签的组成: key=value与标签类似的,还有一种“注解”( annotations )
  • Label选择器
    • 给资源打上标签后,可以使用标签选择器过滤指定的标签标签
    • 选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)
    • 许多资源支持内嵌标签选择器字段
      • matchLabels
      • matchExpressions
  1. Service/Ingress

    • Service

      • 在K8S的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失。
      • Service(服务)就是用来解决这个问题的核心概念
      • 一个Service可以着作一组提供相同服务的Pod的对外访问接口.
      • Service作用于哪些Pod是通过标签选择器来定义的
    • Ingress

      • Ingress是K8S集群里工作在OSI网络参考模型下,第7层的应用,对外暴露的接口
      • Service只能进行L4流量调度,表现形式是ip+port
      • Ingress则可以调度不同业务域、不同URL访问路径的业务流量

        3、核心组件

    • 存储中心etcd

非关系型数据库,Etcd 是一个分布式的,依赖key-value存储的,最重要的分布式数据存储系统

  - 完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免硬件的单点故障或网络问题
  - 一致性:每次读取都会返回跨多主机的最新写入
  - 简单:包括一个定义良好、面向用户的API(gRPC)
  - 安全:实现了带有可选的客户端证书身份验证的自动化TLS
  - 快速:每秒10000次写入的基准速度
  - 可靠:使用Raft算法实现了强一致、高可用的服务存储目录
  • 主控节点master

    • kube-apiserver服务

      • 提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
      • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd);
      • 是资源配额控制的入口;
      • 拥有完备的集群安全机制.
    • kube-controller-manager服务

资源控制器主要是为了控制各种资源的变更信息,例如pod的创建新增,副本控制器和账户控制器等信息,资源控制器的主要职责就是通过list-watch机制,从APIServer处获取所有的操作,从而将资源的操作依次解耦,通过不同的事件来驱动整个k8s的步骤。最容易理解的一张图
image.png

  - kube-scheduler服务
     - 公平调度
     - 资源高效利用
     - QoS
     - affinity 和 anti-affinity
     - 数据本地化(data locality)
     - 内部负载干扰(inter-workload interference)
     - deadlines
  • 运算节点node

    • kube-proxy

      • userspace:最早的负载均衡方案,它在用户空间监听一个端口,所有服务通过 iptables 转发到这个端口,然后在其内部负载均衡到实际的 Pod。该方式最主要的问题是效率低,有明显的性能瓶颈。
      • iptables:目前推荐的方案,完全以 iptables 规则的方式来实现 service 负载均衡。该方式最主要的问题是在服务多的时候产生太多的 iptables 规则,非增量式更新会引入一定的时延,大规模情况下有明显的性能问题
      • ipvs:为解决 iptables 模式的性能问题,v1.11 新增了 ipvs 模式(v1.8 开始支持测试版,并在 v1.11 GA),采用增量式更新,并可以保证 service 更新期间连接保持不断开
      • winuserspace:同 userspace,但仅工作在 windows 节点上
    • kube-kubelet

每个Node节点上都运行一个 Kubelet 服务进程,默认监听 10250 端口,接收并执行 Master 发来的指令,管理 Pod 及 Pod 中的容器。每个 Kubelet 进程会在 API Server 上注册所在Node节点的信息,定期向 Master 节点汇报该节点的资源使用情况,并通过 cAdvisor 监控节点和容器的资源。

  • CLI客户端kubectl

kubectl 是 Kubernetes 的命令行工具(CLI),是 Kubernetes 用户和管理员必备的管理工具。
kubectl 提供了大量的子命令,方便管理 Kubernetes 集群中的各种功能。这里不再罗列各种子命令的格式,而是介绍下如何查询命令的帮助

     - kubectl -h 查看子命令列表
     - kubectl options 查看全局选项
     - kubectl <command> --help 查看子命令的帮助
     - kubectl [command] [PARAMS] -o=<format> 设置输出格式(如 json、yaml、jsonpath 等)
     - kubectl explain [RESOURCE] 查看资源的定义
  • 核心附件
    • CNI fannel/calico
    • 服务发现插件
    • 服务暴露插件
    • GUI插件