k8s

简介

Docker只是解决服务下层的问题,服务上层建筑如容器编排,服务发现等问题已经超越了Docker的管辖。

Kubernetes提供的编排和管理功能,轻松完成大规模容器部署,借助k8s的编排功能,用户可以构建跨多个容器的应用服务,实现跨集群调度,扩展容器,以及长期持续管理这些容器的健康状况等,并整合网络,存储,安全性,监控及其他服务,提供全面的容器基础架构。

Kubernetes 满足了一系列产品内运行程序的普通需求,兼具平台即服务(PaaS)的简化和基础架构即服务(IaaS)的灵活,并促进了在平台服务提供商之间的迁移。

image-20220306225820940

微服务
微服务解决的是我们软件开发中一直追求的低耦合+高内聚,微服务可以解决这个问题,微服务的本质是把一块大饼分成若干块低耦合的小饼,比如一块小饼专门负责接收外部的数据,一块小饼专门负责响应前台的操作,小饼可以进一步拆分,比如负责接收外部数据的小饼可以继续分成多块负责接收不同类型数据的小饼,这样每个小饼出问题了,其它小饼还能正常对外提供服务。

DevOps
DevOps的意思就是开发和运维不再是分开的两个团队,而是你中有我,我中有你的一个团队。我们现在开发和运维已经是一个团队了,但是运维方面的知识和经验还需要持续提高。

持续交付
持续交付的意思就是在不影响用户使用服务的前提下频繁把新功能发布给用户使用,要做到这点非常非常难。我们现在两周一个版本,每次上线之后都会给不同的用户造成不同程度的影响。

容器化
容器化的好处在于运维的时候不需要再关心每个服务所使用的技术栈了,每个服务都被无差别地封装在容器里,可以被无差别地管理和维护,现在比较流行的工具是docker和k8s。

简单地把云原生理解为:云原生 = 微服务 + DevOps + 持续交付 + 容器化

k8s官网:https://kubernetes.io/

架构

整体主从方式

image-20220306230018184

  • 组件

    • master

      • kube-apiserver
        • 外界进行资源操作的入口
        • 认证、授权、访问控制、api注册、发现
      • etcd
        • nosql数据库
        • 集群数据
      • kube-schedule
        • 从etcd中获取任务进行调度,选择节点运行
        • 所有对k8s集群的操作,都必须经过主节点
      • kube-controller-manager
        • node controller(节点控制器)
          • 在节点出现故障时进行通知和响应
        • replication controller(副本控制器)
          • 部署
        • endpoints controller(端点控制器)
          • 暴露端口之类的
        • service account & token controllers
          • 控制安全
    • node

      • container runtime
        • 容器运行环境,如docker
      • kubelet
        • 每个节点的代理,保证容器都运行在Pod中
          • pod:一组容器,最小部署单元
        • 维护容器的生命周期,数据卷、网络
      • kube-proxy
        • 每个节点的网络代理,帮助请求路由和访问具体容器
      • fluentd
        • 节点日志收集

master

image-20220306230319472

node

image-20220306230348661

image-20220306230401741

  • Container:容器,可以是 docker 启动的一个容器

  • Pod:

    • k8s 使用 Pod 来组织一组容器
    • 一个 Pod 中的所有容器共享同一网络。
    • Pod 是 k8s 中的最小部署单元
  • Volume

    • 声明在 Pod 容器中可访问的文件目录
    • 可以被挂载在 Pod 中一个或多个容器指定路径下
    • 支持多种后端存储抽象(本地存储,分布式存储,云存储…)
  • Controllers:更高层次对象,部署和管理 Pod;

    • ReplicaSet:确保预期的 Pod 副本数量
    • Deplotment:无状态应用部署
    • StatefulSet:有状态应用部署
    • DaemonSet:确保所有 Node 都运行一个指定 Pod
    • Job:一次性任务
    • Cronjob:定时任务
  • Deployment:

    • 定义一组 Pod 的副本数目、版本等
    • 通过控制器(Controller)维持 Pod 数目(自动回复失败的 Pod)
    • 通过控制器以指定的策略控制版本(滚动升级,回滚等)
  • Service

    • 定义一组 Pod 的访问策略
    • Pod 的负载均衡,提供一个或者多个 Pod 的稳定访问地址
    • 支持多种方式(ClusterIP、NodePort、LoadBalance)
  • Label:标签,用于对象资源的查询,筛选

  • Namespace:命名空间,逻辑隔离

    • 一个集群内部的逻辑隔离机制(鉴权,资源)
    • 每个资源都属于一个 namespace
    • 同一个 namespace 所有资源名不能重复

image-20220306230837907

1
2
3
4
5
6
7
+ 流程
+ kubectl——apiserver——etcd
+ controller manager——监听——apiserver
+ 发现pod未创建
+ 根据pod模板生成pod对象,apiserver——etcd
+ scheduler——监听——选定node,apiserver——etcd
+ kubelet——监听——启动pod

容器管理

调度

image-20220306225909169

自动恢复

image-20220306225921697

水平伸缩

image-20220306225940799

部署

image-20220306231026852

image-20220306231116495

1、设置 linux 环境

2、所有节点安装 Docker、kubeadm、kubelet、kubectl

3、安装 Pod 网络插件(CNI)

4、加入 Kubernetes Node

image-20220306231924323

概念

pod、controller

image-20220306232549267

deployment、service

image-20220306232559381

labels、selectors

image-20220306232631265

ingress

image-20220306232639695

ingress——>service——>pod——>container

网络模型

Kubernetes的网络模型从内至外由四个部分组成:

1、Pod内部容器所在的网络

2、Pod所在的网络

3、Pod和Service之间通信的网络

4、外界与Service之间通信的网络

image-20220306232717133