K8s基础知识介绍

1. K8s介绍

K8s是源自于谷歌内部的Borg系统(容器编排工具),后经过Go语言重写并捐献给了CNCF基金会开源。
它的主要作用就是作为容器的开源编排框架工具。
官网:https://kubernetes.io(一年发布四个大版本)
GitHub:https://github.com/kubernetes/kubernetes

2. K8s的优势

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

3. K8s基本概念

- Pod/Pod控制器
- Name/Namespace
- Label/Label选择器
- Service/Ingress

3.1 Pod与Pod控制器

3.1.1 Pod

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

3.1.2 Pod控制器

- Pod控制器是Pod启动的一种模板,用来保证K8S里启动的Pod应始终按照人们的预期运行(副本数、生命周期、健康状态检查等)。
- K8S内提供了众多的Pod控制器,常用的有以下几种:
· Deployment
· DaemonSet
· ReplicaSet
· StatefulSet
· Job
· Cronjob

3.2 Name和Namespace

3.2.1 Name

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

3.2.2 Namespace

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

3.3 Label和Label选择器

3.3.1 Label

- 标签是K8S特色的管理方式,便于分类管理资源对象。
- 一个标签可以对应多个资源,一个资源可以有多个标签,它们是多对多的关系。
- 一个资源拥有多个标签,可以实现不同维度的管理。
- 标签的组成:key=value。
- 与标签类似的,还有一种“注解”(annotations)。

3.3.2 Label选择器

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

3.4 Service和Ingress

3.4.1 Service

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

3.4.2 Ingress

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

4. K8S组件介绍

4.1 k8s核心组件

配置存储中心 → etcd服务
主控节点(master)
    - kube-apiserver服务
    - kube-controller-manager服务
    - kube-scheduler服务
运算节点(node)
    - kube-kubelet服务
    - kube-proxy服务

4.1.1 核心组件详解

(1)配置存储中心 → etcd服务
- 类似于zk这种集群管理中心,用来存放集群的元数据信息,如k8s集群状态、请求、资源配额等。存储方式为键值对。

(2)kube-apiserver服务
- 提供了集群管理的REST API接口(包括鉴权、数据校验及集群状态变更)。
- 负责其他模块之间的数据交互,承担通信枢纽功能(集群大脑,所有组件都要通过它来进行通信)。
- 是资源配额控制的入口。
- 提供完备的集群安全机制。

(3)kube-controller-manager服务(控制器管理器)
- 由一系列控制器组成,通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
- Node Controller          # 节点控制器
- Deployment Controller    # pod控制器
- Service Controller       # 服务控制器
- Volume Controller        # 存储卷控制器
- Endpoint Controller      # 接入点控制器
- Garbage Controller       # 垃圾回收控制器
- Namespace Controller     # 名称空间控制器
- Job Controller           # 任务控制器
- Resource quta Controller # 资源配额控制器
- ……………………

(3)kube-scheduler服务
- 主要功能是接收调度pod到适合的运算节点上,主要用下面两种策略来选择合适的节点调度。
- 预算策略(predict)
- 优选策略(priorities)

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

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

4.2 核心附件

CNI网络插件 → flannel/calico
服务发现用插件 → coredns
服务暴露用插件 → traefik
GUI管理插件 → Dashboard

4.3 CLI客户端

kubectl

5. K8S常见安装方式介绍

(1)Minikube,单节点微型K8S(仅供学习、预览k8s特性使用)
(2)二进制安装部署(生产首选,新手推荐,但是安装步骤繁杂)
(3)kubeadmin,k8s的部署工具,跑在k8s里(相对简单,熟手推荐)
原文地址:https://www.cnblogs.com/xiets/p/13900011.html