今天偶然在简书上看到一篇函数式运维的文章,概念新颖小众,记录一下,期待函数式运维能发展壮大。
自动化运维现状
在企业生产中,自动化运维已经是必不可少的一环,经历过生产上各种版本割接问题,自动化运维包含两部分:自动化构建跟自动化部署。
常用的工具是大家耳熟能详地jenkins跟docker,但是不好用,不简单,不牛逼!
此篇讲解实例 函数式自动化部署elk方案,将在下期讲解函数式自动化构建spring boot方案。
自动化部署这里介绍的工具是nixops: https://nixos.org/nixops/manual/
这里的核心不是介绍工具,所以我们从底层讲解,后期会专门介绍nixops之大杀器。
自动化部署需要载体,所以产生了不同的隔离级别。
nixops支持三种隔离级别:
-
环境隔离(nix-env)
-
进程隔离(nix-container)
-
资源隔离(nixos virtualbox)
大家常见的docker就是进程隔离, 虚拟机就是资源隔离。
有了函数式运维,我们所需要的隔离90%以上只需要nix-env环境隔离就可以解决,甚至nix-container的进程隔离也是完全不需要虚拟化的,简单强大。
nix-container将在后续nixops使用篇介绍。
不得不说,docker老矣。大家要问,如日中天的docker有哪些不好?
第一: 部署友好度。
你觉得用root装软件是个很安全的操作吗?
但是nix-env不一样,只需建个目录便于所有用户共享即可。
第二: 资源利用率
我就简单的部署个jar包,就得启动虚拟化技术,损耗实在太大了点,性能也是极大的浪费。
但是nix-env不一样,通过环境隔离,与系统无缝集成。
第三: 资源透明度
如果在一台机器上安装相同的多个节点服务,这里就涉及复杂的端口映射,甚至locahost跟主机都是调试一大障碍。
但是nix-env不一样,直接原生应用开干,简单强大,不需要那么复杂。
第四: 版本管理
docker的强项不就是版本管理么?NO!如果1.0代码改动一小点,它还是1.0,还是1.0。。。
但是nix-env不一样,它对所有内容进行sha计算,轻松智能多版本,函数式就是不可变,1.0也能多版本。
第五:依赖管理
如果一个系统库不提供二进制版本,那么需要自己构建。
如果在docker中构建,需要额外的一整套构建环境
如果不在docker中构建,系统的库依赖哪些是docker需要的呢?
有了函数式运维nix,所有的软件都是包含了依赖关系,并且构建与部署分离。
第六: 学习门槛
学习docker需要学习专有的语法,虽然不是很难。调试也极其困难。
nix-env仅仅只是一个命令行工具,轻轻松松解决问题。
忍不住 来一句,世界本不应该如此复杂。。。
现实中的自动化部署常用的问题有哪些?
第一: 需要配置大量主从服务端,严重侵入系统。已知的有puppet, cloudera manager。
第二: 不支持离线功能。已知的有ansible/salt需要安装大量的python包才可以使用,离线之伤痛!
第三: 要学习特有的各种模块及技术。由于不是函数式,要处理复杂度,确实不能怪它们。
什么是函数式运维?
在函数式运维的体系里面,软件包即值,配置即状态。软件包是不可变的,稍弱改动软件包之后产生了一个新的软件包。
那么函数式运维有啥好处呢?
由于软件包无状态,配置即状态 ,所以很轻松建立了配置驱动编程的体系。对于配置,加上严格的版本控制,自然就有了代码即文档的效果。由于软件包即值,配置多版本管理,从一个环境传递到另一个环境是那么自然 。对于软件的多版本,即是不同的值那么简单。由于函数式的不可变,中间过程相同输入产生的输入只用处理一次,后续可复用。如果服务器直接提供二进制构建,即不需要源码构建进行软件包安装,否则重新编译一次后续复用,大大提高构建效率。
作者:larluo
链接:https://www.jianshu.com/p/caff6ef93a98
网友评论