k8s之operator
背景
数字经济的兴起推动了云计算、物联网、大数据行业的快速蓬勃发展,对数据中心提出了更高的要求,同时,用户对于数据库运维自动化的需求越来越高,数据库即服务的需求越来越强烈。
随着k8s的普及以及云原生架构的兴起,越来越多的人希望把数据库这类有状态署服务也通过k8s进行编排。也就是对数据库进行容器化部署。
通过statefulset编排有状态应用具有很高的要求以及复杂性,很多官方或者一些社区(https://operatorhub.io/)对主流的的有状态应用将哪些复杂的、特有的操作步聚进行代码化,完成应用编排专用的生命周期管理。
Operator 是增强型的控制器(Controller)它扩展了KubernetesAPI的功能,并基于该扩展管理复杂应用程序。
K8s Operator
K8s Operator是一种用于特定应用的控制器,可扩展k8s API的功能,来代表k8s用户创建、配置和管理复杂应用的实例,它基于基本的k8s资源和控制器概念构建,但又涵盖了特定领域或应用的知识,用于实现所管理的应用生命周期的自动化。
常见的有:etcd-operator、prometheus-operator、mysql-operator等
CRD: 用户自定义资源
CR: 实现CRD的具体实例,依据CRD创建具体的对象。
Webhook: k8s的一种http回调,默认注册到kube-apiserver上,与apiserver进行绑定。主要作用资源的修改和验证。
Controller: CRD实现业务的核心组件,它控制当前CRD运行管理动作。持续监听集群状态变化,把跟自己有关的对象事件比如:create、delete、update放到工作队列中,并且会持续把当前资源状态变成用户定义的spec期望状态
无状态和有状态应用对比
| 无状态服务 | 有状态服务 |
|---|---|
| 数据方面 | 不会在本地存储持久化数据多个实例共享相同的持久化数据 |
| 结果方面 | 多个服务实例对同一用户请求的响应结果完全一致 |
| 关系方面 | 实例之间无依赖关系 |
| 影响方面 | 动态启停pod不会对其它的pod产生影响 |
| 示例方面 | Nginx、tomcat、web应用 |
| 资源方面 | Deployment、replicaSet等 |
| 创建方式 | Deployment管理 |
| 缩容方式 | 随机 |
ELK operator
Elastic Cloud on Kubernetes (ECK),是一款基于 Kubernetes Operator 模式的新型编排产品。
ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:
- 管理和监测多个集群
- 轻松升级至新的堆栈版本
- 扩大或缩小集群容量
- 更改集群配置
- 动态调整本地存储的规模(包括 Elastic Local Volume(一款本地存储驱动器))
- 备份安排
但 ECK 的功能却绝不仅限于 Kubernetes Operator。ECK 不仅能自动完成所有运行和集群管理任务,还专注于简化在 Kubernetes 上使用 Elasticsearch的完整体验。ECK 的愿景是为 Kubernetes 上的 Elastic 产品和解决方案提供 SaaS 般的体验。
安装ECK
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html
- Install custom resource definitions(CRD)
自定义资源类型CRD
root@k8s-master01:~# kubectl create -f https://download.elastic.co/downloads/eck/2.12.1/crds.yamlcustomresourcedefinition.apiextensions.k8s.io/agents.agent.k8s.elastic.co createdcustomresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/beats.beat.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticmapsservers.maps.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearchautoscalers.autoscaling.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/enterprisesearches.enterprisesearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/logstashes.logstash.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/stackconfigpolicies.stackconfigpolicy.k8s.elastic.co created
root@k8s-master01:~# kubectl api-resources|grep elastic
agents agent agent.k8s.elastic.co/v1alpha1 true Agent
apmservers apm apm.k8s.elastic.co/v1 true ApmServer
elasticsearchautoscalers esa autoscaling.k8s.elastic.co/v1alpha1 true ElasticsearchAutoscaler
beats beat beat.k8s.elastic.co/v1beta1 true Beat
elasticsearches es elasticsearch.k8s.elastic.co/v1 true Elasticsearch
enterprisesearches ent enterprisesearch.k8s.elastic.co/v1 true EnterpriseSearch
kibanas kb kibana.k8s.elastic.co/v1 true Kibana
logstashes ls logstash.k8s.elastic.co/v1alpha1 true Logstash
elasticmapsservers ems maps.k8s.elastic.co/v1alpha1 true ElasticMapsServer
stackconfigpolicies scp stackconfigpolicy.k8s.elastic.co/v1alpha1 true StackConfigPolicy
- Install the operator with its RBAC rules
root@k8s-master01:~# kubectl apply -f https://download.elastic.co/downloads/eck/2.12.1/operator.yaml
namespace/elastic-system created
serviceaccount/elastic-operator created
secret/elastic-webhook-server-cert created
configmap/elastic-operator created
clusterrole.rbac.authorization.k8s.io/elastic-operator created
clusterrole.rbac.authorization.k8s.io/elastic-operator-view created
clusterrole.rbac.authorization.k8s.io/elastic-operator-edit created
clusterrolebinding.rbac.authorization.k8s.io/elastic-operator created
service/elastic-webhook-server created
statefulset.apps/elastic-operator created
validatingwebhookconfiguration.admissionregistration.k8s.io/elastic-webhook.k8s.elastic.co created
root@k8s-master01:~# kubectl get pod -n elastic-system
NAME READY STATUS RESTARTS AGE
elastic-operator-0 1/1 Running 0 67s
root@k8s-master01:~# kubectl explain elasticsearch
GROUP: elasticsearch.k8s.elastic.co
KIND: Elasticsearch
VERSION: v1
DESCRIPTION:
Elasticsearch represents an Elasticsearch resource in a Kubernetes cluster.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an object.
Servers should convert recognized schemas to the latest internal value, and
may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
metadata <ObjectMeta>
Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
spec <Object>
ElasticsearchSpec holds the specification of an Elasticsearch cluster.
status <Object>
ElasticsearchStatus represents the observed state of Elasticsearch.
root@k8s-master01:~# cat elasticsearch-myes-cluster.yaml
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: myes
namespace: elastic-system
spec:
version: 8.11.3
nodeSets:
- name: default
count: 3
config:
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
#storageClassName: nfs-csi
storageClassName: openebs-hostpath
root@k8s-master01:~# kubectl apply -f elasticsearch-myes-cluster.yaml
elasticsearch.elasticsearch.k8s.elastic.co/myes created
root@k8s-master01:~# kubectl get elasticsearch -n elastic-system
NAME HEALTH NODES VERSION PHASE AGE
myes unknown 8.11.3 ApplyingChanges 18s
root@k8s-master01:~# kubectl get pod -n elastic-system
NAME READY STATUS RESTARTS AGE
elastic-operator-0 1/1 Running 0 144m
myes-es-default-0 1/1 Running 0 111m
myes-es-default-1 1/1 Running 0 111m
myes-es-default-2 1/1 Running 0 111m
root@k8s-master01:~# kubectl get svc -n elastic-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elastic-webhook-server ClusterIP 10.107.151.34 <none> 443/TCP 144m
myes-es-default ClusterIP None <none> 9200/TCP 111m
myes-es-http ClusterIP 10.99.67.165 <none> 9200/TCP 111m
myes-es-internal-http ClusterIP 10.111.49.216 <none> 9200/TCP 111m
myes-es-transport ClusterIP None <none> 9300/TCP 111m
root@k8s-master01:~# kubectl get secret -n elastic-system
NAME TYPE DATA AGE
elastic-webhook-server-cert Opaque 2 145m
myes-es-default-es-config Opaque 1 111m
myes-es-default-es-transport-certs Opaque 7 111m
myes-es-elastic-user Opaque 1 111m
myes-es-file-settings Opaque 1 111m
myes-es-http-ca-internal Opaque 2 111m
myes-es-http-certs-internal Opaque 3 111m
myes-es-http-certs-public Opaque 2 111m
myes-es-internal-users Opaque 4 111m
myes-es-remote-ca Opaque 1 111m
myes-es-transport-ca-internal Opaque 2 111m
myes-es-transport-certs-public Opaque 1 111m
myes-es-xpack-file-realm Opaque 4 111m
先获取到访问ElasticSearch的密码,该密码由部署过程自动生成,并保存在了相关名称空间下的Secrets中,该Secrets对象以集群名称为前缀,以“-es-elastic-user”为后缀。下面的命令将获取到的密码保存在名为PASSWORD的变量中。
root@k8s-master01:~# PASSWORD=$(kubectl get secret myes-es-elastic-user -n elastic-system -o go-template='{{.data.elastic | base64decode}}')
root@k8s-master01:~# echo $PASSWORD
K4281d4X9wX7XNw7MfD0u0dR
在集群上通过类似如下命令访问部署好的ElasticSearch集群。
kubectl run client-$RANDOM --image ikubernetes/admin-box:v1.2 -it --rm --restart=Never --command -- /bin/bash
curl -u "elastic:$PASSWORD" -k https://myes-es-http.elastic-system:9200
{
"name" : "myes-es-default-1",
"cluster_name" : "myes",
"cluster_uuid" : "gCl81n1HS1q2W-dreAo31Q",
"version" : {
"number" : "8.11.3",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "64cf052f3b56b1fd4449f5454cb88aca7e739d9a",
"build_date" : "2023-12-08T11:33:53.634979452Z",
"build_snapshot" : false,
"lucene_version" : "9.8.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
k8s之operator的更多相关文章
- 在Kubernetes上运行有状态应用:从StatefulSet到Operator
一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用.本文将介绍有状态和无状态应用,一个通过K ...
- 有状态软件如何在 k8s 上快速扩容甚至自动扩容
概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, ...
- 为K8S集群准备Ceph存储
随着K8S存储接口逐渐成熟并顺势推出CSI接口规范后,原来"in-tree"(树内)模式的很多存储插件也逐步迁移到了"out-of-tree"(树外)模式的CS ...
- 写在19年初的后端社招面试经历(两年经验): 蚂蚁 头条 PingCAP
去年(18年)年底想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer.想着可以总结一下经验,分享一下自己这一段"骑驴找马"过 ...
- OpenFaaS实战之五:大话watchdog
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- vivo 云原生容器探索和落地实践
作者:vivo 互联网容器团队- Pan Liangbiao 本文根据潘良彪老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 VDC]获取互联网技术 ...
- 使用k8s operator安装和维护etcd集群
关于Kubernetes Operator这个新生事物,可以参考下文来了解这一技术的来龙去脉: https://yq.aliyun.com/articles/685522?utm_content=g_ ...
- 基于Helm和Operator的K8S应用管理的分享
一.为啥要用helm 对于一些微服务架构来说,会有不同的服务在上面运行,你可能要管理诸如deployment.service.有状态的Statefulset.权限的控制等等.你会发现,部署应用后还会有 ...
- k8s Helm安装Prometheus Operator
Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...
- 基于Helm和Operator的K8S应用管理
https://blog.csdn.net/RancherLabs/article/details/79483013 大家好,今天我们分享的内容是基于Helm和Operator的K8S应用管理. 我们 ...
随机推荐
- [Linux] 无显示器 无键盘 网线直连传输文件
有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...
- MySQL---面经
如果想要对 MySQL 的索引树有更深入的了解,掘金的小册子:<MySQL 是怎样运行的> MySQL 是怎样运行的 以下是常见面试题 MySQL日志 MySQL日志系统 redo_log ...
- 安装Typora+PicGo七牛云图床问题解决
遇到两个问题 第一个安装PicGo软件打不开只在后台运行,卸载.重启都试过没用,按照默认安装路径到c盘才能打开软件. 第二个问题"设定存储区域"输入z0不行,需要输入cn-east ...
- 深入解析:AntSK 0.1.7版本的技术革新与多模型管理策略
在信息技术快速迭代的当下,.Net生态中的AntSK项目凭借其前沿的AI知识库和智能体技术,已经吸引了广大开发者的关注和参与.今天,我要给大家介绍的主角,AntSK 0.1.7版本,无疑将是这个开源项 ...
- tapable - webpack 的 hooks - getAc - 异步流程控制
tapable - webpack 的 hooks,类似自己的 getAc 官方地址 https://www.npmjs.com/package/tapable 随便找了篇文章:聊聊 Webpack ...
- react 修改页面title - react-document-title
安装 cnpm install --save react-document-title 引用 import DocumentTitle from 'react-document-title' 代码 & ...
- Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程)
Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程) 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习 ...
- day16--Java常用类04
Java常用类 4.字符串相关类练习 4.1StringBuilder练习 package li.normalclass.stringbuilder; public class TestBuffer ...
- 使用Wireshark在RTP流中提取中264数据(针对udp)(转)
调试rtsp收发流时,经常会需要抓包以确认是网络问题还是程序问题还是其它问题.通过tcpdump或者wireshark抓到的包通常是rtp流,保存为.pcap格式文件后中,可通过wireshark进行 ...
- 提升UE5写实效果的项目设置
随着虚幻引擎5(Unreal Engine 5,简称UE5)的发布,游戏开发者和数字艺术家们迎来了一个全新的机会,可以在其强大的渲染引擎下创建更加逼真和令人惊叹的游戏和虚拟场景.然而,要实现出色的写实 ...