背景

数字经济的兴起推动了云计算、物联网、大数据行业的快速蓬勃发展,对数据中心提出了更高的要求,同时,用户对于数据库运维自动化的需求越来越高,数据库即服务的需求越来越强烈。

随着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的更多相关文章

  1. 在Kubernetes上运行有状态应用:从StatefulSet到Operator

    一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用.本文将介绍有状态和无状态应用,一个通过K ...

  2. 有状态软件如何在 k8s 上快速扩容甚至自动扩容

    概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机 安装依赖 下载安装包 按规范配置主机名, hosts 配置网络: 包括域名, DNS, ...

  3. 为K8S集群准备Ceph存储

    随着K8S存储接口逐渐成熟并顺势推出CSI接口规范后,原来"in-tree"(树内)模式的很多存储插件也逐步迁移到了"out-of-tree"(树外)模式的CS ...

  4. 写在19年初的后端社招面试经历(两年经验): 蚂蚁 头条 PingCAP

    去年(18年)年底想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer.想着可以总结一下经验,分享一下自己这一段"骑驴找马"过 ...

  5. OpenFaaS实战之五:大话watchdog

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. vivo 云原生容器探索和落地实践

    作者:vivo 互联网容器团队- Pan Liangbiao 本文根据潘良彪老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 VDC]获取互联网技术 ...

  7. 使用k8s operator安装和维护etcd集群

    关于Kubernetes Operator这个新生事物,可以参考下文来了解这一技术的来龙去脉: https://yq.aliyun.com/articles/685522?utm_content=g_ ...

  8. 基于Helm和Operator的K8S应用管理的分享

    一.为啥要用helm 对于一些微服务架构来说,会有不同的服务在上面运行,你可能要管理诸如deployment.service.有状态的Statefulset.权限的控制等等.你会发现,部署应用后还会有 ...

  9. k8s Helm安装Prometheus Operator

    Ubuntu 18 Kubernetes集群的安装和部署 以及Helm的安装完成了k8s的集群和helm的安装,今天我们来看看Prometheus的监控怎么搞.Prometheus Operator ...

  10. 基于Helm和Operator的K8S应用管理

    https://blog.csdn.net/RancherLabs/article/details/79483013 大家好,今天我们分享的内容是基于Helm和Operator的K8S应用管理. 我们 ...

随机推荐

  1. 今天接到一个根据excel来更新数据库的需求,用php写个小脚本

    需求大概内容是,excel中有些条目需要删除.有些需要新增,就需要基于这份excel生成删.增的SQL. 要求是这样的:蓝色要删除的,黄色是要新增的,白色和灰色的不用管. 我第一时间就在想:还得识别单 ...

  2. Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)

    目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Little Girl and Maximum Sum 题意 给q个[l,r]将所有这些区间里面的数相加和最大. 可以进行的操作是任意排列数 ...

  3. XWAF安装遇到的坑

    存在的问题:需要的编译环境没有安装配置好的话出现下面的问题: 1.error: Microsoft Visual C++ 14.0 or greater is required. Get it wit ...

  4. [.Net]使用Soa库+Abp搭建微服务项目框架(二):面向服务体系的介绍

    ​ 上一章我们建立了一个典型的面向领域设计的Abp小项目,如果按照常规的开发方式,会遇到什么问题呢? 先来完善一下这个小项目,在定义好各实体类后,运行Miguration并向数据库里写入一些初始数据. ...

  5. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...

  6. 摆脱鼠标系列 - 打开微信(Alt+V) - 打开双核浏览器(Alt+S) - HotkeyP

    摆脱鼠标系列 - 打开微信(Alt+V) - 打开双核浏览器(Alt+S) - HotkeyP 新定义了两个快捷键 这两个比较常用

  7. max30100心率血氧健康传感器调试总结备忘

    前记  在健康监测领域,心率血氧传感器是一个非常重要的前端采集设备.了解,研究并使用它,是一个方案商的基本素质.鉴于此,笔者花了一些时间在不同的硬件平台来使用它.中间遇到了一些问题值得总结和反思一下. ...

  8. Oracle注入—报错注入

    Oracle注入-报错注入 1.Oracle报错注入知识扫盲 一.Oracle报错注入知识扫盲 报错注入 报错注入就是,输入的一些能让数据库出错的语句,数据库会把这个错误回显给我们 OK,,什么语句能 ...

  9. x86 常见调用约定(cdecl,fastcall,stdcall) & x86和ARM调用约定的栈帧分析 & ARM ATPCS(ARM-THUMB procedure call standard)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. Mac安装Tomcat的Home路径

    首先,强推mac上的一个软件Homebrew,安装好以后,再安装其他软甲就只是 "brew install 软件名"这么简单了. 正文: 我安装tomcat使用的是命令行操作的,也 ...