Kubernetes概述与简介

1. Kubernetes概述

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

2. Kubernetes优势

  • 自动装箱,水平扩展,自我修复
  • 服务发现和负载均衡
  • 自动发布(默认滚动发布模式)和回滚
  • 集中化配置管理和密钥管理
  • 存储编排
  • 任务批处理运行

3. Pod, Pod控制器

Pod

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

 

Pod 控制器 :

  • Pod 控制器是 Pod 启动的一种模板,用来保证在 K8S 里启动的 Pod
  • 应始终按照人们的预期运行(副本数、生命周期、健康状态检查... )
  • K8S内提供了众多的 Pod 控制器,常用的有以下几种:
  • Deployment
  • DaemonSet (每个节点起一份)
  • ReplicaSet (Deployment 管 ReplicaSet,ReplicaSet 管 pod)
  • StatefulSet (管理有状态应用的)
  • Job
  • Cronjob

 

4. Name, Namespace

Name :

  • 由于 K8S 内部,使用“资源”来定义每一种逻辑概念(功能)故每种"资源”, 都应该有自己的"名称”
  • "资源”有 api 版本( apiVersion )类别( kind )、元数据( metadata)、定义清单( spec)、状态( status )等配置信息
  • "名称”通常定义在"资源”的"元数据”信息里

 

Namespace :

  • 随着项目增多、人员增加、集群规模的扩大,需要一种能够隔离K8S内各种"资源”的方法,这就是名称空间
  • 名称空间可以理解为K8S内部的虚拟集群组
  • 不同名称空间内的"资源”名称可以相同,相同名称空间内的同种“资源”,”名称” 不能相同
  • 合理的使用K8S的名称空间,使得集群管理员能够更好的对交付到K8S里的服务进行分类管理和浏览
  • K8S里默认存在的名称空间有: default、 kube-system、 kube-public
  • 查询K8S里特定“资源”要带上相应的名称空间

 

5. Label, Label选择器

Label :

  • 标签是k8s特色的管理方式,便于分类管理资源对象。
  • 一个标签可以对应多个资源,一个资源也可以有多个标签,它们是多对多的关系。
  • 一个资源拥有多个标签,可以实现不同维度的管理。
  • 标签的组成: key=value(值不能多余64个字节字母数字开头 中间只能是 - _ .)
  • 与标签类似的,还有一种“注解” ( annotations )

 

Label选择器 :

  • 给资源打上标签后,可以使用标签选择器过滤指定的标签
  • 标签选择器目前有两个:基于等值关系(等于、不等于)和基于集合关系(属于、不属于、存在)
  • 许多资源支持内嵌标签选择器字段
  • matchl _abels
  • matchExpressions

 

6. Service, Ingress

Service :

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

 

Ingress :

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

 

7. 核心组件

配置存储中心---etcd服务

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。

主控( master )节点

kube-apiserver

  • 提供了集群管理的 RESTAPI 接口(包括鉴权、数据校验及集群状态变更)
  • 负责其他模块之间的数据交互,承担通信枢纽功能
  • 是资源配额控制的入口
  • 提供完备的集群安全机制

 

kube-controller-manager 服务

由一系列控制器组成,通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态

  • Node Controller
  • Deployment Controller
  • Service Controller
  • Volume Controller
  • Endpoint Controller
  • Garbage Controller
  • Namespace Controller
  • Job Controller
  • Resource quta Controller

 

kube-scheduler 服务

  • 主要功能是接收调度pod到适合的运算节点上
  • 预选策略( predict )
  • 优选策略( priorities )

 


运算(node)节点

kube-kubelet 服务

  • 简单地说, kubelet的主要功能就是定时从某个地方获取节点上pod的期望状态(运行什么容器、运行的副本数量、网络或者存储如何配置等等), 并调用对应的容器平台接口达到这个状态
  • 定时汇报当前节点的状态给apiserver,以供调度的时候使用
  • 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源

 

Kube-proxy 服务

  • 是K8S在每个节点上运行网络代理, service资源的载体
  • 建立了pod网络和集群网络的关系( clusterip > podip )
  • 常用三种流量调度模式   Userspace (废弃)   Iptables (濒临废弃)(绝大部分公司在用)   Ipvs(推荐)
  • 负责建立和删除包括更新调度规则、通知apiserver自己的更新,或者从apiserver哪里获取其他kube-proxy的调度规则变化来更新自己的

 

CLI客户端

kubectl

Kubernetes 命令行工具,kubectl,使得你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。

核心附件

CNI网络插件 → flannel/calico

  • k8s设计了网络模型,但却将他的实现交给了网络插件,CNI网络插件最主要的功能就是实现POD资源能够跨主机进行通信 种类众多,以flannel为例
  • 三种常用工作模式
  • 优化SNAT规则

 

 

服务发现用插件 → coredns

  • 服务(应用)之间相互定位的过程
  • 集群网络 → Cluster IP
  • Service资源 → Service Name .
  • Coredns软件 → 实现了Service Name和Cluster IP的自动关联

 

服务暴露用插件 → traefik

  • Ingress资源 → 专用于暴露7层应用到K8S集群外的一种核心资源(http/https)
  • Ingress控制器一个简化版的nginx (调度流量) + go脚本(动态识别yaml)
  • Traefik软件 → 实现了ingress控制器的一个软件

 

GUI管理插件 → Dashboard