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
posted @ 2019-11-01 18:39  薄荷少年郎微微凉  阅读(272)  评论(0编辑  收藏  举报