• Kubernetes-知识汇总


    Kubernetes知识汇总

    一.Kubernetes集群组件

    1.Kubernetes 主控组件(Master)

    kube-apiserver、kube-controller-manager 和 kube-scheduler

    • 1.1 kube-apiserver:
      对外暴露了Kubernetes API。它是的 Kubernetes 前端控制层。它被设计为水平扩展,即通过部署更多实例来缩放要使用Kubernetes对象(无论是创建,修改还是删除它们),都需要使用Kubernetes API
    • 1.2 kube-controller-manager(控制器管理器)
      是各种controller的管理者,是集群内部的管理控制中心,通过 apiserver 监控整个集群的状态, 并确保集群处于预期的工作状态,这些控制器包括:
      • 节点控制器: 当节点移除时,负责注意和响应。
      • 副本控制器: 负责维护系统中每个副本控制器对象正确数量的 Pod。
      • 端点控制器: 填充 端点(Endpoints) 对象(即连接 Services & Pods)。
      • 服务帐户和令牌控制器: 为新的命名空间创建默认帐户和 API 访问令牌.
             1 Replication Controller
             2 Node Controller
             3 CronJob Controller
             4 Daemon Controller
             5 Deployment Controller
             6 Endpoint Controller
             7 Garbage Collector
             8 Namespace Controller
             9 Job Controller
            10 Pod AutoScaler
            11 RelicaSet
            12 Service Controller
            13 ServiceAccount Controller
            14 StatefulSet Controller
            15 Volume Controller
            16 Resource quota Controller
            https://www.jianshu.com/p/a36682a848e1
    
    • 1.3 kube-scheduler(调度器)监视没有分配节点的新创建的 Pod,选择一个node节点供他们运行

    2.集群中的每个非master节点都运行两个(组件)进程:

    • 2.1 kubelet,和master节点进行通信,监测已分配给其节点的Pod(通过apiserver或通过本地配置文件)提供如下功能:
      • 挂载 Pod 所需要的数据卷(Volume)。
      • 下载 Pod 的 secrets。
      • 通过 Docker 运行(或通过 rkt)运行 Pod 的容器。
      • 周期性的对容器生命周期进行探测。
      • 如果需要,通过创建 镜像 Pod(Mirror Pod) 将 Pod 的状态报告回系统的其余部分。
      • 将节点的状态报告回系统的其余部分

    2 kube-proxy

    是一种网络代理,将Kubernetes的网络服务代理到每个节点上,通过维护主机上的网络规则并执行连接转发,实现了Kubernetes服务抽象
    作为k8s和Linux kernel Netfilter交互的一个枢纽。监听kubernetes集群Services和Endpoints对象的变化,并根据kube-proxy不同的模式(iptables or ipvs), 对内核设置不同的规则,来实现路由转发

    3.etcd

    用于 Kubernetes 的后端存储。所有集群数据都存储在此处,始终为您的Kubernetes集群的etcd 数据提供备份计划

    4.Cluster DNS

    是一个 DNS 服务器,和您部署环境中的其他 DNS 服务器一起工作,为 Kubernetes 服务提供DNS记录

    二.pod

    1.创建pod过程

    • 1.1 Pod 与 API Server 交互的主要流程如下:
      用户通过Kubectl提交一个创建RC的请求,该请求通过APIServer被写入etcd中,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过APIServer写入etcd,至此API Server 创建过程完成,剩下的由 scheduler 和 kubelet 来完成,此时 pod 处于 pending 状态
    • 1.2 与scheduler交互:
      此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server讲这一结果写入到etcd中,目标Node上运行的Kubelet进程通过APIServer监测到这个“新生的”Pod,并按照它的定义,启动该Pod并任劳任怨地负责它的下半生,直到Pod的生命结束
    • 1.3 kubelet作用:
      Kubelet组件启动pod,kubelet 组件的作用不单单是创建 pod,另外还包括节点管理、cAdvisor 资源监控管理、容器健康检查等功能

    2.pod生命周期

    • 生命周期:
      状态: Pending,Running,Failed,Succeded,Unknown
      创建过程: 请求apiserver,scheduler调度pod到node,kubelet请求apiserver监控etcd中pod状态资源变化,在去启动pod在请求apiserver存储pod资源变化在etcd中
      重要行为:
      初始化容器
      容器探测:
      liveness
      readiness
    • 标签作用:
      pod有自己的ip和主机名,每一次删除重建都会生成新的IP和主机名,同一组pod资源通过标签来关联

    3.pod控制器

    pod控制器通过pod的标签来关联

    • 3.1 自主式pod,缺陷如果node出现问题,那么pod将消失,新pod的ip或主机名都会发生改变
    • 3.2 pod控制器,实现pod生命周期
      控制器通过标签选择器来管理同一个pod资源的多个pod副本

    4.service服务发现

    pod是有生命周期的,新pod的ip或主机名都会发生改变,客户端是无法固定访问pod,因此在同一种pod资源中添加service服务发现,service是通过标签选择器来关联pod

    5.DNS服务(附件)

    实现service服务发现需要通过DNS解析

    • 小结: pod是有生命周期的因此需要pod控制器来实现删除,创建,重建等操作,service来提供集群外或者集群内访问。pod控制器和service都是通过标签选择器与pod资源相关联

    三.集群中的网络

    四.控制器种类

    ReplicationController
    RelicaSet
    Deployment
    DaemonSet #守护进程,一个节点只启动一个
    Job #一次性执行任务,任务结束后删除pod
    CronJob #周期性执行任务,执行完一次删除一次,在重新执行
    StatefulSet

    五.发布策略

    金丝雀发布  
    蓝绿发布 资源逐个替换 
    灰度
    

    (利用deployment滚动更新的节奏实现以上功能)

    六.service

    service --> endpoint --> pod

    1.创建service过程

    service依赖于DNS
    kube-proxy通过watch监控api service内的变化

    • 1.1 通过Kubectl提交一个新的映射到该Pod的Service的创建请求
    • 1.2 ControllerManager会通过Label标签查询到相关联的Pod实例,然后生成Service的Endpoints信息,并通过APIServer写入到etcd中
    • 1.3 接下来,所有Node上运行的Proxy进程通过APIServer查询并监听Service对象与其对应的Endpoints信息,建立一个软件方式的负载均衡器来实现Service访问到后端Pod的流量转发功能

    2.定义 Service

            apiVersion: v1
            kind: Service
            matadata:
              name: string
              namespace: string
              labels:
              - name: string
            spec:
              selector: []
              type: string
              clusterIP: string
              sessionAffinity: string
              ports:
              - name: string
                protocol: string
                port: int  #service端口
                targetPort: int  #pod端口
                nodePort: int  #node暴露端口
              status:
                loadBalancer:
                  ingress:
                    ip: string
                    hostname: string
    

    3.vip

    在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式

    4.service三种代理模式(4层):

    • ipvs:
      client_pod 请求到ipvs(service规则),再有ipvs调度到server_pod上面 (ipvs-1.11之后)
    • iptables:
      client_pod 请求到iptables(service规则),再有iptables调度到server_pod上面 (iptables 1.10之前)
    • userspace:
      client_pod 请求到iptables(service规则),在转发给kube-proxy处理,之后再有iptables调度到server_pod上面 (userspace-浪费资源)

    5.服务发现

    Kubernetes 支持2种基本的服务发现模式 —— 环境变量和 DNS

    6.service类型

            1 NodePort
            2 LoadBalancer 在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 <NodeIP>:NodePort。此模式只能在云服务器(AWS等)上使用
            3 ExternalName 将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)
            4 clusterIP
    

    默认是 ClusterIP 类型。Type 的取值以及行为如下: * ClusterIP:通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType。 * NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务

    7.资源记录

    创建服务之后自动添加一个资源记录: svc_name.default.svc.cluster.local.

    8.字段

    sessionAffinity: ClientIP #将来自同一客户端的请求发往同一端pod上
    

    9.无头service

    ClusterIP: None
    

    七.Deployment

    strategy #更新策略  
        rollingUpdate #滚动更新
            maxSurge: 1      #滚动升级时会先启动1个pod
            maxUnavailable: 1 #滚动升级时允许的最大Unavailable的pod个数
        #利用以上两个参数控制滚动更新节奏
    revisionHistoryLimit #保存历史版本
    paused #暂停
    

    kubelet rollout pause deployment myapp #暂停
    kubelet patch deployment myapp -p '{"spec":{"replicas":5}}' #打补丁
    kubelet set image *** && ubelet rollout pause deployment myapp #更新一个pod并暂停
    kubelet rollout status deployment myapp #查看更新状态
    kubelet rollout resume deployment myapp #继续更新
    kubelet get rs -o wide #查看工作信息
    kubelet rollout history deployment myapp #查看版本历史
    kubelet rollout undo deployment muapp --to-revision=1 #回滚第一个版本

    八.DaemonSet

    updateStrategy:
        rollingUpdate:
            maxUnavailable:
        OnDelete:
    revisionHistoryLimit #保存历史版本
    hostNetwork
    
  • 相关阅读:
    IE浏览器下常见的CSS兼容问题
    Android studio 使用问题汇总
    IOS中的属性列表----Property List
    自定义组件-BreadcrumbTreeView 的使用
    IOS开发之数据sqlite使用
    深入分析动态管理Fragment
    IOS开发中多线程的使用
    Java中导入、导出Excel
    IOS数据持久化之归档NSKeyedArchiver
    Bugfree3.0.4 Linux环境安装指南
  • 原文地址:https://www.cnblogs.com/orange-lsc/p/11778680.html
Copyright © 2020-2023  润新知