从Linux基础到k8s进阶,马哥_K8s进阶实战(11)Kubernetes系统扩展
自定义资源类型 CRD
扩展Kubernetes API常用方式:
1、使用CRD自定义资源类型 (易用但限制颇多)
2、开发自定义API Server并聚合至主API Server (富于弹性但代码工作量大)
3、定制扩展K8s源码 (添加新的核心类型时采用)
CRD用于补充一种简单易用更为灵活和更高级别的自定义API资源的方式
CRD本身是一种资源类型,隶属于集群级别,实例化出特定对象后,会在API上注册生成GVR类型URL端点,并能作为一种资源类型被使用并实例化相应的对象
创建CRD对象
选定要使用的API群组名称、版本及新建的资源类型名称后,即可创建自定义资源类型,而后就可以创建自定义类型的资源对象
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: users.auth.ilinux.io
spec:
group: auth.ilinux.io
version: v1beta1
names:
kind: User
plural: users
singular: user
shortNames:
-u
scope: Namespaced
URL路径前缀为:/apis/auth.ilinux.io/v1beta1/namespace/NS_NAME/users/
# CRD资源对象users.auth.ilinux.io,隶属名称空间级别
# metadata.name必须是 .
kubectl get crd # 获取crd对象
# 使用自定义users.auth.ilinux.io创建资源
# users并未限制spec字段中可使用的字段及数据类型,于是可以随意设置
YAML
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: auth.ilinux.io/v1beta1
kind: User
metadata:
name: admin
namespace: default
spec:
userID: 1
email: k8s@ilinux.io
groups:
-supersuers
-adminstrators
password: ikubernetes
selfLink: /apis/auth.ilinux.io/v1beta1/namespaces/default/users/admin
自定义资源格式验证
定义CRD可用的有效字段,在将设计的自定义资源公开应用时非常有用
spec.validation.openAPIV3Schema
YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spec:
...
validation:
openAPIV3Schema:
properties:
spec:
properties:
userID:
type: integer
minimum: 1
maximum: 65535
groups:
type: array
email:
type: string
password:
type: string
format: password
required: ["userID","groups"]
spec.additionalPrinterColumns 定义 kubectl get/describe 等命令结果显示的字段:
YAML
1
2
3
4
5
6
7
8
9
10
11
spec:
...
additionalPrinterColumns:
- name: userID
type: integer
description: The user ID.
JSONPath: .spec.userID
- name: groups
type: string
description: The groups of the user.
JSONPath: .spec.groups
子资源
在CRD中为自定义资源启用 status 字段,status 为子资源
spec.subresources.status 字段,其内嵌字段等由系统自行维护,用户无需提供任何额外配置
YAML
1
2
3
4
spec:
...
subresources:
status:{}
对象admin的状态引用路径为:/apis/auth.ilinux.io/v1beta1/namespaces/default/users/admin/status
在没有相应资源控制器时,活动对象状态的非计划变动既不会实时反映到status中,也不会向spec定义的期望状态转换
在有相应资源控制器维护自定义资源类型时,可使用scale子资源和status子资源协同实现伸缩功能
YAML
1
2
3
4
5
6
7
8
spec:
...
subresources:
status:{}
scale:
specReplicasPath: string,定义表示期望副本数量的字段,JSONPath格式,如.spec.replicas
statusReplicasPath: string,引用保存在status中用于表示对象当前副本数量的字段,JSONPath格式,如.status.replicas
labelSelectorPath: string,可选字段,若要与HPA结合则为必选字段,引用status中用于表示使用的标签选择器字段,JSONPath格式,如.status.labelSelector
使用资源类别
spec.names.categories 类别,分组组织自定义资源的方法,定义crd对象时可指定一个或多个类别
kubectl get 可列出该类别中的所有自定义资源对象,all为内建类别
YAML
1
2
3
4
5
6
7
spec:
...
names:
categories:
-all
kind: User
plural: users
多版本支持
crd支持多个版本,但它们之间的转换必须手动完成
spec.version -> spec.versions 并将支持的各版本以对象列表形式给出定义,且必须仅有一个版本标记为存储 spec.versions[].storage: true
YAML
1
2
3
4
5
6
7
8
9
spec:
...
versions:
- name: v1beta1
served: true
storage: true
- name: v1beta2
served: true
storage: false
自定义控制器基础
crd仅提供json格式数据范式及存取能力,确保status中状态向spec中状态变动则由自定义控制器实现
提供业务逻辑代码的控制器由用户自行开发,并运行为API Server的客户端程序(类似于Ingress控制器)
控制器负责持续监视资源变动,根据资源的spec及status中信息执行某些操作逻辑,并将执行结果更新到资源的status中
创建控制器时,使用社区发布的workqueue example和sample-controller作为基础结构
或者,使用Kubebuilder、Operator SDK、Metacontroller
参考:https://github.com/nikhita/custom-database-controller
自定义API Server
kube-apiserver中,聚合自定义API Server的组合是kube-aggregator
先在主API Server上添加一个APIService资源对象,将自定义API Server注册到kube-aggregator上,以完成聚合操作
Kubernetes集群高可用
kubernetes cluster-autoscaler可为集群提供规模按需自动缩放能力
高可用控制平面至少需要三个Master节点,允许最多一个Master节点的丢失:
etcd集群
将无状态的apiserver运行为多副本,并在其前端添加负载均衡器,负载均衡器也应是高可用的
leader选举功能 --leader-election 控制器和调度器
etcd的高可用
静态集群:分配静态IP地址
基于etcd发现服务构建集群:依赖一个现存的可用的etcd服务,通过事先存在的集群创建新的集群
基于dns的服务资源记录构建集群:通过srv记录,而后基于此域名进行服务发现来动态组建新集群,依赖于dns服务及srv记录
etcd集群通常使用3、5、7个节点,过大的集群规模没有必要,对性能会产生负面影响
ControllerManager和Scheduler高可用
对于kube-controller-manager,某一时该,仅能有一个实例处于正常工作状态,余下均处于备用状态(等待状态)
多个kube-controller-manager实例要同时启用 --leader-elect=true 实现leader选举,仅leader实例处于活动状态
# 选举仅通过在kube-system名称空间中创建一个与程序同名的Endpoints资源对象实现
# kubectl get endpoints -n kube-system
# kubectl describe endpoints kube-controller-manager -n kube-system
## 资源锁,leader抢到锁后,更新注解 control-plane.alpha.kubernetes.io/leader 将 holderIdentity 设置为节点名称,表示持有锁,并周期性更新renewTime 以声明自己对锁资源的持有状态
kube-scheduler的实现方式与此类似
Kubernetes部署模式
核心基础架构:计算、网络、存储相关底层部件
叠加网络:Calico、Flannel、Romana、Weave Net
存储系统:GlusterFS、NFS、RBD
容器化工作负载:向个提供服务
供应和配置管理:Ansible、Chef、Puppet、Terraform
镜像仓库:可托管于集群之上
日志记录和监控:
负载均衡器:API Server的负载均衡和出站流量的负载均衡
工件仓库:配置设定、依赖项、软件包、脚本等
构建和发布管理:Jenkins
容器时代的DevOps
kube-applier是一种服务,在集群中作为Pod运行,监视Git仓库,通过将声明性配置文件从Git存储库应用到Kubernetes集群,实现持续部署资源对象
喜欢 (2)or分享 (0)
从Linux基础到k8s进阶,马哥_K8s进阶实战(11)Kubernetes系统扩展相关推荐
- linux运维练习实例,马哥linux运维实战练习案例(一)
1.创建一个10G的文件系统,类型为ext4,要求开机可自动挂载至单独数据/data目录: 第一步:首先使用df -h 命令,查看本机磁盘分区使用情况: [root@centos7 ~]# df -h ...
- 《Linux学习笔记——整理自马哥Linux运维》_待完成
ls-l:长格式-:普通文件(f)d:目录文件b:块设备文件(block)c:字符设备文件(character)l:符号链接文件(symbolic link file)p:命令管道(pipe)s:套接 ...
- java渡劫期(32)----java进阶(ssm整合项目实战----房屋出租系统(渡劫失败))
需求分析 增 1.发布出租房信息 2.用户的注册 删 自己发布的房屋信息可删除 查 用户可以根据自己的需求对房屋进行模糊查询(也可以发布自己房屋的信息) 查询后的显示效果 查询显示详细信息(即单击选择 ...
- 鸟哥马哥共叙Linux发展
导读 北京时间3月28日,由51CTO学院和人民邮电出版社信息技术分社联合举办的[开放·见远]"鸟哥"大陆行Linux技术沙龙在位于北京市西三环久凌大厦的51CTO学院举行. 台湾 ...
- 2017年Linux基础进阶系列课-老男孩-专题视频课程
2017年Linux基础进阶系列课-13877人已学习 课程介绍 本套课程讲解的重要知识点如下: Linux文件属性体系精讲 .Linux正则表达式及grep命令深度讲解.三剑客sed ...
- python测试培训 马哥
2019 年初,马哥教育迎来一次"大升级"-- 2019 全新Linux运维+Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专 ...
- 马哥python培训靠谱吗马哥教育python课程再次革命性升级
2019 年初,马哥教育迎来一次"大升级"-- 2019 全新Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专家亲自参与设计, ...
- python培训首选马哥,教育python课程再次革命性升级
2019年初,马哥教育迎来一次"大升级"--2019全新Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专家亲自参与设计,根据目 ...
- python培训机构 马哥
砥砺奋进11年,从15名学员到累计育才突破100万人次!初心不改,马哥教育在路上.... 2009年,马哥迎来了他的第一批学生--马哥在大学兼职讲授Linux的学生.也就是在这个时候马哥教育雏形慢慢形 ...
最新文章
- backup(full,diff,log)备份并清理过时备份
- 如何构建高可用ZooKeeper集群
- python界面不同按钮实现不同功能-三、PyQt5不同方法创建菜单栏、工具栏和状态栏...
- 使用泛型 ,做计算器
- 程序员Web面试之JSON
- Nginx 笔记与总结(11)Nginx + php-fpm + MySQL 安装 ecshop
- java 堆栈信息_每天学习一个命令:jstack 打印 Java 进程堆栈信息
- Java Web应用小案例:查询城市天气信息
- H5中CSS3动画的性能优化
- xp 无法运行 php.exe,【xpexe文件不能执行】xp exe文件打不开_xp系统exe文件打不开-系统城...
- spring framwork解析
- 【书籍推荐】深入解析Windows操作系统(第4版)
- 搜狗推送工具-搜狗批量提交软件
- 计划制定与管理-日事清
- win10系统访问共享文件速度过慢的解决方法
- 小米路由器登陆以及切换wan账户脚本
- 电子学会图形化scratch编程等级考试二级真题答案解析(选择题)2020-9A卷
- passive-interface的含义
- 计算机自动连续进行数据处理是因为什么,现代计算机之所以能自动连续进行数据处理是因为什么...
- 能ping通IP地址,ping不通主机名问题解决
热门文章
- 《深入剖析Tomcat》源码
- win10+anaconda环境下pyqt5+qt tools+eric6.18安装及汉化过程
- 详解Python的装饰器
- sql server 高可用故障转移(1)
- web 前端 html
- 2017.9.6.语文
- Linux格式化分区报错Could not start /dev/sda No such file or directory 解决办法
- [Node.js] Module.Require机制研究
- 常用 css html 样式
- 高性能的“流水线技术”网页