自定义资源类型 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系统扩展相关推荐

  1. linux运维练习实例,马哥linux运维实战练习案例(一)

    1.创建一个10G的文件系统,类型为ext4,要求开机可自动挂载至单独数据/data目录: 第一步:首先使用df -h 命令,查看本机磁盘分区使用情况: [root@centos7 ~]# df -h ...

  2. 《Linux学习笔记——整理自马哥Linux运维》_待完成

    ls-l:长格式-:普通文件(f)d:目录文件b:块设备文件(block)c:字符设备文件(character)l:符号链接文件(symbolic link file)p:命令管道(pipe)s:套接 ...

  3. java渡劫期(32)----java进阶(ssm整合项目实战----房屋出租系统(渡劫失败))

    需求分析 增 1.发布出租房信息 2.用户的注册 删 自己发布的房屋信息可删除 查 用户可以根据自己的需求对房屋进行模糊查询(也可以发布自己房屋的信息) 查询后的显示效果 查询显示详细信息(即单击选择 ...

  4. 鸟哥马哥共叙Linux发展

    导读 北京时间3月28日,由51CTO学院和人民邮电出版社信息技术分社联合举办的[开放·见远]"鸟哥"大陆行Linux技术沙龙在位于北京市西三环久凌大厦的51CTO学院举行. 台湾 ...

  5. 2017年Linux基础进阶系列课-老男孩-专题视频课程

    2017年Linux基础进阶系列课-13877人已学习 课程介绍         本套课程讲解的重要知识点如下: Linux文件属性体系精讲 .Linux正则表达式及grep命令深度讲解.三剑客sed ...

  6. python测试培训 马哥

    2019 年初,马哥教育迎来一次"大升级"-- 2019 全新Linux运维+Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专 ...

  7. 马哥python培训靠谱吗马哥教育python课程再次革命性升级

    2019 年初,马哥教育迎来一次"大升级"-- 2019 全新Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专家亲自参与设计, ...

  8. python培训首选马哥,教育python课程再次革命性升级

    2019年初,马哥教育迎来一次"大升级"--2019全新Python全能新版课程大纲正式上线.历时半年,走访100+互联网企业,挖掘企业真实需求,腾讯,阿里专家亲自参与设计,根据目 ...

  9. python培训机构 马哥

    砥砺奋进11年,从15名学员到累计育才突破100万人次!初心不改,马哥教育在路上.... 2009年,马哥迎来了他的第一批学生--马哥在大学兼职讲授Linux的学生.也就是在这个时候马哥教育雏形慢慢形 ...

最新文章

  1. Spark运行模式Local+Standalone+Yarn+mesos
  2. 一周一论文(翻译)——[SIGMOD 2015] Congestion Control for Large-Scale RDMA
  3. 获取服务器配置信息的方法
  4. Linux 关于动态链接库以及静态链接库的一些概念
  5. PE学习(三)第三章:PE文件头
  6. layui根据条件显示列_templet渲染layui表格数据的三种方式
  7. ^_^ 一看就忘不了的IE页面 ^_^
  8. 如何优雅的绘制一棵省市区三级可选择的树?
  9. ubuntu共享文件夹文件看不到_实验08:轻松搭建文件夹共享
  10. 3D Computer Grapihcs Using OpenGL - 18 相机移动
  11. logback 配置详解(一)configuration and logger
  12. Spring ActiveMQ示例(第2部分)
  13. SLA打印机之打印机介绍
  14. 柳传志回应“联想5G投票事件”:不要罔顾事实挑拨离间
  15. 新建文本文档出现错误怎么办
  16. VS2010 提示存储空间不足 无法操作
  17. 串口termios结构体的详细设置
  18. .net关于T4代码生成摸版的使用(.tt文件)
  19. springboot毕设项目大学生助学贷款管理系统w659v(java+VUE+Mybatis+Maven+Mysql)
  20. steam网站显示invalid SSL certerficate

热门文章

  1. win10+anaconda环境下pyqt5+qt tools+eric6.18安装及汉化过程
  2. Ajax_HTTP请求以及响应
  3. 【JavaScript】详解JSON
  4. 神牛驾到!James B. Orlin 的 O(nm)最大流算法论文翻译!!
  5. 查看MySQL数据库大小
  6. 快速集成二维码扫描,使用最新版本的zxing(2017.11.10抽取zxing代码)
  7. [Spark][Python]对HDFS 上的文件,采用绝对路径,来读取获得 RDD
  8. 使用ionic2开发一个登录功能
  9. Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
  10. Learn Linux The Hard Way — LinuxTOY