学习k8s

学习k8s

我为什么要用k8s 和其他部署方式的区别是什么?

  1. 传统部署方式

    java --> package --> 放到服务器上 --> Tomcat

    如果是同时进行写操作,会存在并发问题.

    用户 --网络带宽--> 服务器 -->服务

    同一个服务器上,多个服务:

    网络资源的占用

    内存的占用

    cpu的占用

    ...

    资源争抢

    复杂度可以通过脚本来解决.

  2. 虚拟化部署/隔离机制/占用资源过多

    java --> package --xx.jar--> linux服务器(虚机Tomcat \< xx.jar文件 \>)

    带来了,资源占用过度问题

    虚机的启动是分钟级别

  3. 容器化部署

    容器的启动是 秒级别的.

k8s的特点?为什么选择k8s?

  1. 为了解决以上问题,需要什么?

    自我修复

    弹性伸缩

    自动部署和回滚

    服务发现和负载均衡

    机密和配置管理

    存储编排

    批处理

  2. 企业级服务调度平台有哪些?

    • Apache Mesos

    概念: 资源管理器,把所有的资源管理,调度,主从模式,zookeeper给主节点提供服务注册,服务发现功能,通过Framework Marathon 提供容器调度能力.

    优势: 发布时间早,5w+节点控制,大规模节点的管理.

    缺点: 面向节点,而不是容器

    • Docker Swarm

    概念: 标准版的Docker API

    优势: 和Docker是集成的.

    缺点: 已经弃用了.没人用.

    • Google Kubernetes(一家独大)

    概念: 使用Label和Pod的概念来将容器分为逻辑单元.Pods是同步地写作(co-located)容器的集合. 这是kubernetes 和其他两个框架哎的主要区别.简化了管理.

    优势: 通过pods这一抽象的概念,解决了Container之间的依赖于通信问题,Pods,Services, Deployment 是独立部署的部分,可以通过 Selector 提供更多的灵活性,内置服务注册表和负载均衡.

    缺点: 相比于 Apache Mesos 管理节点规模小

学习K8s

集群架构和组件

相关组件
控制面板组件(Master)
  1. kube-apiserver

    接口服务,REST风格,k8s接口服务

  2. kube-controller-manager

    控制器管理器: 管理各个类型的控制器,管理k8s的各个资源

  3. cloud-controller-manager

    云控制器管理器: 第三方云平台提供的控制器API对接管理平台

  4. kube-scheduler

    调度器: 负责将pod给予一定算法,将其调用到合适的节点(Node)上

  5. etcd

  6. k8s的数据库,键值对,分布式数据库,基于Raft算法,

    老版本: 基于内存

    新版本: 持久化存储

节点组件(Node)一般是多个Nodes
  1. kubelet

    负责容器的生命周期

    负责Volume(CVI)挂载,存储

    网络(CNI)管理

  2. kube-proxy

    网络代理,负责Service的服务发现,负载均衡(4层负载)

  3. container-runtime

    负责镜像管理已经Pod和容器的真正运行(CRI容器运行环境接口)

    docker,containerd,CRI-O,

附加组件
  1. kube-dns

    kube-dns 负责为整个集群提供 DNS 服务

  2. ingress Controller

    Ingress Controller 为服务提供外网入口

  3. Prometheus

    Prometheus 提供资源监控

  4. Dashboard

    Dashboard 提供 GUI

  5. Federtion

    Federation 提供跨可用区的集群

  6. Fluentd-elasticsearch

    Fluentd-elasticsearch 提供集群日志采集、存储与查询

分层架构
  1. 生态系统

    • Kubernetes 外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS 应用、ChatOps 等
    • Kubernetes 内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等
  2. 接口层

    kubectl 命令行工具、客户端 SDK 以及集群

  3. 管理层

    系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)

  4. 应用层

    部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)

  5. 核心层

    Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境

核心概念与专业术语
服务的分类
  1. 无状态

    举例: Nginx /Apache

    优点: 对客户端透明,无依赖关系,可以高效实施扩容,迁移

    缺点: 不能储存数据,需要额外的数据服务支撑

  2. 有状态

    举例: Mysql/Redis

    优点: 可以独立存储数据,实现数据管理

    缺点: 集权环境下需要实现主从,数据同步,备份,水平扩容复杂

资源和对象
元数据型
  1. Horizontal Pod Autoscaler(HPA)

    Pod 自动扩容:可以根据 CPU 使用率或自定义指标(metrics)自动对 Pod 进行扩/缩容。

    • 控制管理器每隔30s(可以通过--horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
    • 支持三种metrics类型
      • 预定义metrics(比如Pod的CPU)以利用率的方式计算
      • 自定义的Pod metrics,以原始值(raw value)的方式计算
      • 自定义的object metrics
    • 支持两种metrics查询方式:Heapster和自定义的REST API
    • 支持多metrics
  2. PodTemplate

    Pod Template 是关于 Pod 的定义,但是被包含在其他的 Kubernetes 对象中(例如 Deployment、StatefulSet、DaemonSet 等控制器)。控制器通过 Pod Template 信息来创建 Pod。

  3. LimitRange

    可以对集群内 Request 和 Limits 的配置做一个全局的统一的限制,相当于批量设置了某一个范围内(某个命名空间)的 Pod 的资源使用限制。

集群级别
  1. Namespace

    Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群,这些虚拟集群被称为命名空间。

    作用是用于实现多团队/环境的资源隔离。

    命名空间 namespace 是 k8s 集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的命名空间。

    默认 namespace:

    • kube-system 主要用于运行系统级资源,存放 k8s 自身的组件
    • kube-public 此命名空间是自动创建的,并且可供所有用户(包括未经过身份验证的用户)读取。此命名空间主要用于集群使用,关联的一些资源在集群中是可见的并且可以公开读取。此命名空间的公共方面知识一个约定,但不是非要这么要求。
    • default 未指定名称空间的资源就是 default,即你在创建pod 时如果没有指定 namespace,则会默认使用 default
  2. Node

    不像其他的资源(如 Pod 和 Namespace),Node 本质上不是Kubernetes 来创建的,Kubernetes 只是管理 Node 上的资源。虽然可以通过 Manifest 创建一个Node对象(如下 json 所示),但 Kubernetes 也只是去检查是否真的是有这么一个 Node,如果检查失败,也不会往上调度 Pod。

  3. ClusterRole

    ClusterRole 是一组权限的集合,但与 Role 不同的是,ClusterRole 可以在包括所有 Namespace 和集群级别的资源或非资源类型进行鉴权。

  4. ClusterRoleBinding

    ClusterRoleBinding:将 Subject 绑定到 ClusterRole,ClusterRoleBinding 将使规则在所有命名空间中生效。

命名空间级别

####### 工作负载型

对象规约和状态
微服务项目k8s环境演示
相关推荐
运维开发故事15 小时前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson2 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生3 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭3 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美4 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
武子康8 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
通信小呆呆10 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick10 天前
自动对焦学习-3
人工智能·学习·计算机视觉