跳至主要内容

我为什么不喜欢 CoreOs/Operator

1 Operator 是什么

如果你还没有看过 coreos 的 operator,可以到 这里 进行一个短暂的阅读

2 一

目前的 operator 是一个处于实验性、尚不成熟的运维经验流程化的方法论

3 二

operator 在文档中描述的能力: 打包、部署、管理 kubernetes 应用
在文档中列出了几个项目:

4 三

拿 etcd-operator 来说,他实际上做了什么呢
1.输入 版本与集群规模创建/删除一个 etcd 集群
2.调整一个集群的大小
3.在 pod 意外丢失时重现创建
4.oprator 在被删除后的恢复 (与 4 相同)
5.升级 etcd 的版本
6.备份和恢复 etcd 集群
看起来是符合 operator 中描述的能力,但实际呢
实际上他仅能满足字面上的最小能力
如果我需要的的是仅在特定几台机器(小于集群规模且无统一标签)上的 etcd 集群呢?
如果我要在更换 etcd 的证书呢
如果我要将备份的数据存储到非 aws 的存储呢
有太多他做不到的事情了

5 四

可能会有人认为,太多的自定义需求只要实现一个符合自己需求的 operator 不就可以了吗?
那么思考下面几个问题
1.谁来写这个 operator
2.写好了 operator 之后就能满足未来所有的需求吗
3.这个 operator 如何进行交接

6 五

假设有这样一个人,有着丰富的运维经验,又愿意遵循着这样的规范来完成一个 operator
在一个人可以将运维经验抽象成一个 operator 这么长的时间内,他连一个用来简化操作的的脚本都没有写过吗?
当他学习了 operator 的 sdk 然后,将自己平时使用的脚本中的逻辑以 operator 的方式放到了集群中
新来的同事问他,这个服务该怎么运维啊
他会说
A.你看一下这个服务 operator 的使用文档
B.你要先明白这个服务的配置文件该怎么写

7 六

operator 最大的矛盾是减少运维学习成本与保障服务稳定必须足够了解之间的矛盾
开发人员应该对写的代码负责,同样的是运维人员也要对维护的服务负责
operator 在以一种开发人员的视角做运维人员的工具
它是开发人员心中臆想的美好工具,妄图以程序来运维程序
这是在对与程序或系统足够的熟悉下,形成的盲目判断
运维人员的价值很多时候体现在预想之外的情况下作出最正确的决定
重要的决定需要人来作为最后一道关隘
也许它想构建心中的理想国,但它不能要求整个世界都能认同苏格拉底的观点

8 七

有时间搞这些有的没的,不如多加两个监控告警实在
Author: Byron.wang
Created: 2019-01-24 Thu 22:52

评论

此博客中的热门博文

在 LSF 中使用 docker 运行任务

LSF + Docker Table of Contents 1. 环境信息 2. 修改配置文件在 lsf 上启用 docker 3. 验证 4. 部署常见问题 5. 部署参考链接 1  环境信息 docker 18.09.5 Kernel Version: 3.10.0-862.11.6.el7.x86_64 lsf 10.1.0.6 OS CentOs 7.6.1810 2  修改配置文件在 lsf 上启用 docker 1.conf/lsf.conf 添加/修改 LSF_PROCESS_TRACKING=Y LSF_LINUX_CGROUP_ACCT=Y LSB_RESOURCE_ENFORCE="cpu memory" 2.conf/lsf.shared 添加 docker Boolean () () (Docker container) 3.conf/lsf.cluster 添加 $your-host-name ! ! 1 3.5 () () (docker) 4./conf/lsbatch/$clustername/configdir/lsb.applications 添加 Begin Application NAME = app1 CONTAINER = docker[image(ubuntu:latest) options(--rm --network=host --ipc=host -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group) starter(root)] DESCRIPTION = Test Docker Application Profile 1 End Application 5.badmin reconfig 验证是否可用 3  验证 在非 root 用户下, bsub -app app1 -I cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DES

k8s 源码阅读 -- eviction

Table of Contents 1. 前言 2. 资料 3. 代码详解 3.1. 代码参考 3.2. 详细 1  前言 在某些情况下 k8s 会出现 evicted 的 pod, 然而这并不在  pod 的生命周期 中.这就是 k8s 的驱逐机制。 当机器的一些资源(内存、磁盘)过小时,为了保证 node 不会受到影响,会将 pod 驱逐至其他的机器上 2  资料 可以在  这里看到相关资料 来看一下代码中,驱逐策略是怎样实现的 3  代码详解 3.1  代码参考 kubernetes release-1.10 3.2  详细 pkg/kubelet/apis/kubeletconfig/v1beta/default.go 定义了这几个默认值作为阈值 pkg/kubelet/kubelet.go kubelte 初始化了 eviction manager 在 runtime 相关模块被加载时,eviction manager 被加载进来 开始了 evict 相关的控制循环 接下来是 evict 真正工作的代码 代码目录是 pkg/kubelet/eviction/ 主要看该目录下的两个文件 eviction manager.go  helpers.go pkg/kubelet/eviction/eviction manager.go Start 是 evict manager 的入口 这里是一个死循环 循环中的主要函数是 synchronize 用来清理 pod、同步信息。这个就是今天的主角 先看一下 synchronize 的参数 diskInfoProvider podFunc diskInfoProvider 是一个接口,用来提供磁盘的信息,作为是否发生驱逐的依据。实际函数在  pkg/kubelet/stats/  下 synchronize 中仅用到了 HasDedicatedImageFs podFunc 用来获取一个待检查的 pod 列表,实际函数在 pkg/kubelet/kubelet pods.go 首先检查 imagesfs, 数据从 cadvisor 中获取 获得容器

kubernetes cloud controller manager

kubernetes cloud controller manager Table of Contents 1. 什么是 cloud controller manager(ccm) 2. 能用 ccm 干什么 2.1. 现有的 ccm 2.1.1. In Tree 2.1.2. Out of Tree 3. 如何实现一个 ccm 4. ccm 背后的秘密 4.1. Out of Tree ccm 如何工作 5. 参考链接 本文所有代码基于 1.16.0-alpha.2 commit: bdde11a664 所以引用文档版本为 1.15.0 1  什么是 cloud controller manager(ccm) 在说 ccm 之前要了解一个 ccm 的前身 – cloud provider cloud provider 是为了 k8s 更加容易在公有云环境下而提出的一个方案 比如在 aws azure 等环境下可以让 k8s 的资源与云厂商的资源进行匹配 具体的演进路线等可以阅读  这篇文章 2  能用 ccm 干什么 在思索 ccm 可以做什么时,要思考一个问题:kubernetes 的核心价值在于哪里? 云主机厂商的本质上是在售卖计算资源与服务,而 k8s 的价值是在于管理与调度容器 正如 k8s 描述的一样: Production-Grade Container Scheduling and Management k8s 更加关心容器的调度与管理,其他的资源也都是为了容器而服务的 那么有什么资源对于 k8s 来说是可以被替代的? 负载均衡、路由、主机 k8s 不关心主机是实际在东京还是西雅图,也不关心负载均衡具体是如何实现的 它只需要主机上的 kubelet 在正常运行,可以通过负载均衡访问到暴露的服务 而这些恰恰是云厂商最为关心的事情,主机的配置、主机的位置、负载均衡的实现、路由如何到达 这时候再来看 ccm 的接口 LoadBalancer() (LoadBalancer, bool) Instances() (Instances, bool) Zones() (Zones, bool) Clusters() (Clusters, bool) Routes(