我和谷歌共成长-K8s的那些事

weixin_51941385 2022-08-18 14:26:22

如标题所言,谷歌和k8s,我本次内容将讲述我在k8s学习的过程。自从谷歌开源k8后,各个企业纷纷开始应用到自己的业务种,我们这些开发得益于谷歌也开始获得更高的受益,接下来时自己联系部署k8s时的一写笔记===k8s如美女一样让我着迷,但是又得不到他的亲睐

一: k8s基本介绍

1 k8s概述

 

1 k8s的由来

k8s是由谷歌的Borg系统经GO语言重写并捐献给CNCF基金会开源的

2 k8s的重要作用

k8s 是一个优秀的开源的容器编排框架工具,他可以自动化应用容器的部署,扩展和操作,并且有极其丰富的

周边生态

3 k8s的优势

1 自动装箱,水平扩展,自我修复

2 服务发现和负载均衡

3 自动发布(默认滚动发布模式)和回滚

4 集中化配置管理和密钥管理

5 存储编排

6 任务批处理运行

....................

2 k8s中的基本概念POD/POD控制器

1 pod

1 pod是k8s里能够被运行的最小的逻辑单元(原子单元)

2 1个pod中可以运行多个容器,容器之间共享UTS+NET+IPC名称空间

3 一个pod里运行多个容器又叫做边车(SideCar)模式

2 POD 控制器

1 pod控制器是pod启动的一组模版,用来保证在k8s中启动的pod始终按照预期运行(副本数,生命周期,

健康状态检查...)

2 k8s内提供了众多的pod控制器,常用的有以下几种

Deployment *****

工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回

滚功能,还提供声明式配

DaemonSet *****

DaemonSet类型的控制器可以保证集群中的每一台(或指定)节点上都运行一个副本,一

般适用于日志收集、节点监控等场 景。也就是说,如果一个pod提供的功能是节点级别

的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet 类型的控制器

创建。

DameonSet控制器的特点:

每当向集群中添加一个节点时,指定的pod副本也将添加到该节点

当节点从集群中移除时,pod也就被垃圾回收了

ReplicaSet ****

代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动

扩容和缩容功能

Job:只要完成就立即退出,不需要重启或重建。

Cronjob:周期性任务控制,不需要持续后台运行

StatefulSet:管理有状态应用的

2 k8s中的基本概念POD/POD控制器

1 Name

1 由于k8s内部,使用"资源"来定义每一种逻辑概念,故每种"资源"都有应该有自己的"name"

2 "资源"有api版本(apiVersion),类别(bind),元数据(metadata),定义清单(spec),状态

(status)等

3 "name"通常定义在"元数据"资源信息里

2 NameSpace

1 随着项目的增多,人员增加,集群规模的扩大,需要一种能够隔离k8s内部各种"资源"的方法,这就是

NameSpace

2 名称空间可以理解为k8s内部的虚拟集群组,不同空间内部"资源"名称可以相同,同一名称空间内部同

总"资源" "名称"不能相同

3 k8s默认存在的名称空间有:default,kube-system,kube-public

4 查询k8s里的特定"资源"要带上相应的名称空间

5 合理的使用名称空间使得集群管理员能够更好的对交付到k8s中的服务进行分类和浏览

4 k8s中的基本概念Label/Lable选择器

1 Label

1 标签是k8s的特色管理方式,便于分类管理资源对象

2 一个标签可以对应多个资源,一个资源也可以有多个标签,他们是多对多的关系

3 一个资源可以通过标签的形式实现不同维度的管理

4 标签的组成方式:key=value(value值长度不能超过63个字节,以字母,数字开头)

5 与标签类似的还有"注解"(annotations),他的长度没有限制

2 Label选择器

1 给资源打标签后可以通过标签选择器过滤指定的标签

2 许多资源(如 matchLabels,matchExpressions)支持内嵌标签选择器字段

3 标签选择器的类型有两个:

1 基于等值关系(等于,不等于)

2 基于集合关系(属于,不属于,存在)

5 k8s中的基本概念Service/Ingress

1 Service

1 在k8s中,虽然每个Pod都会被分配一个单独的IP地址,但这个IP会随着Pod的销毁而消失,Service就

是解决这个问题的核心概念

2 一个Service可以看作是一组提供相同服务的Pod的对外访问接口

3 Service作用于哪些Pod是通过标签选择器来定义的

2 Ingress

1 Ingerss是k8s集群里工作在OSI网络模型第七层的应用对外暴露的接口

2 Service 是能进行L4流量调度(IP+port),Ingress可以调度不同业务域,不同URL路径的业务流量

二 : K8S核心组件介绍

1 Etcd 配置存储中心

1 Etcd 是通过键值对的方式存储k8s集群的网络配置信息和k8s集群内各种元数据信息

2 Etcd是一个独立的服务组件,并不隶属于K8S集群。生产环境当中etcd应该以集群方式运行,以确保服务

的可用性。

3 Etcd不仅仅用于提供键值数据存储,而且还为其提供了监听(

watch)机制,用于监听和推送变更。在K8S

集群系统中,当Etcd中数据发生变化 时,etcd会快速地通知kube-apiServer,并由其通过watch

API向客户端输出。

2 K8S 主控节点(master)上的核心组件

1 kube-apiserver服务

1 提供基于HTTP/HTTPS 的集群管理的REST API(包括鉴权,数据校验及集群状态变更)。

2 负责其他模块之间的数据交互,所有的请求都需要经过这个接口进行通信,主要负责接收、校验并响应

所有的REST请求,结果状态被持久存储 在etcd当中,所有资源增删改查的唯一入口。

3 提供了完备的集群安全机制

2 Controller Manager

1 由一系列控制器组成,主要包括包括replication controller、endpoints controller、

namespace controller、 serviceaccounts controller等,

2 通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态(Namespace创建和生命周期、

Node垃圾回收 Pod扩展等)

3 调度器(Schedule)

1 通过调度算法为待调度Pod列表的每个Pod从Node列表中选择一个最适合的Node,并将信息写入etcd

中

2 Schedule预选策略(predict)

即遍历所有目标Node,筛选出符合要求的候选节点,kubernetes内置了多种预选策略(xxx

Predicates)供用户选择

3 chedule优选策略(priorities)

LeastRequestedPriority 优先从备选节点列表中选择资源消耗最小的节点(CPU+内

存)

CalculateNodeLabelPriority 优先选择含有指定Label的节点

BalancedResourceAllocation 优先从备选节点列表中选择各项资源使用率最均衡的节点。

3 K8S 运算节点(node)上的核心组件

1 kubelet

1 kubelet主要功能就是定时获取到节点上pod的期望状态(运行什么容器,运行副本数,网络活着存储怎

么配置等等)并调用对应的容器平台接 达到这个状态

2 定时汇报当前节点的状态给apiserver,以供调度的时候使用

3 镜像和容器的清理工作,保证节点上的镜像和容器不会占满磁盘空间,退出的容器不会占用太多资源

2 Kube-proxy

1 k8s在每个节点上运行网络代理,service资源的载体

2 建立pod网络和集群网络的关系(ClusterIP-->PodIP)

3 负责建立和删除及更新调度规则,通知apiserver自己的更新或从apiserver处获取其他kube-

proxy的调度规则变化来更新自己的

4 常用的三种流量调度方式

userspace (已废弃)

Iptables (频临废弃)

Ipvs (强烈推荐)

4 核心附件

1 服务发现插件 coredns

2 CNI网络插件 flannel/calico

3 服务暴露插件 traefik

4 GUI管理插件 Dashboard

三: k8s环境架构规划

1 k8s网络网络规划(生产推荐)

 

1 节点网络IP: node1: 10.4.7.21,node2: 10.4.7.22

2 serviceIP段: 192.168.0.16

3 PodIP段: node1: 172.7.21.0/24,node2:172.7.22.0/24

注意:

生产中PodIP段一定要看起来一眼都能知道他在哪个node节点上运行,方便维护

2 k8s 部署架构规划

 

注意

etcd采用投票的方式实现高可用机制,所以生产中一定要保证奇数个etcd节点

工作流程(以常规的 Deployment 创建过程):

1 Kubectl 以 Deployment 的 YAML 文件或命令行操作创建一个 Deployment。

2 Kubectl 会把请求发给 API Server。API Server 接收到请求之后,经过一定的验证(验证信息

是从 Kubectl 的 kubeconfig 里面提交上来的)会把这些信息会存入 etcd。

3 etcd 存储完 Deployment 的信息之后,Controller Manager 里的 Deployment

Controller 会 get 到这个信息,并创建对应的 ReplicaSet。

4 Controller Manager 中的 ReplicaSet Controller watch 到这个信息之后,会创建对应的

Pod 资源。

5 Scheduler 会对每个集群的节点进行打分操作以选择最合适的节点,并把这个节点的信息绑定到

Pod 资源上。

6 这时候 node 节点上运行的 Kubelet 通过请求 API Server 会得到创建对应 Pod 的任务,

Kubelet 会把 Pod 启动需要的 volume 等依赖提前挂载起来。

7 之后 Docker 或 Containerd 等 runtime 会去拉起对应的容器,这个流程相当于把一个

Deployment 真正创建起来了。

8 Kube-Proxy 这个组件主要负责当前节点上的网络路由等配置,有两种部署模式:

iptables 模式:使用 iptables 分发的路由规则

IPVS 模式:使用内核的 IPVS 路由功能

3 k8s常见的安装方式

1 Minikube k8s官网提供的单节点微型k8s,仅供学习,预览

2 二进制安装部署(安装麻烦,方便后期维护,生产手选)

3 使用kubeadmin进行部署(k8s的部署工具,跑在k8s中),相对简单,推荐老手使用

JAVA患者1号摸鱼怪请求出战

 

...全文
249 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_51941385 2022-08-19
  • 打赏
  • 举报
回复

文章很有学识

weixin_51941385 2022-08-19
  • 打赏
  • 举报
回复

写的很好,我爱看

gzcs321 2022-08-18
  • 打赏
  • 举报
回复
k8s
顾汐汐 2022-08-18
  • 打赏
  • 举报
回复

很好,我爱看

Ahloicc 2022-08-18
  • 打赏
  • 举报
回复

写的很好,下次接着写

Hello World呀 2022-08-18
  • 打赏
  • 举报
回复

# 666

难过的风景 2022-08-18
  • 打赏
  • 举报
回复

很好,我爱看

1,472

社区成员

发帖
与我相关
我的任务
社区描述
加入“谷歌开发者”社区,一起“共码未来。
android 企业社区
社区管理员
  • 谷歌开发者
  • 开发者大赛发布
  • 活动通知
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧