operator模式
Operator 是 Kubernetes 的扩展软件,它利用 定制资源 管理应用及其组件。 Operator 遵循 Kubernetes 的理念,特别是在控制器 方面。
简单来说,operator是一种通过实现crd和相应的controller来达到拓展k8s的方法。
实现及应用operator的大致流程:
- 定义crd:可以理解为oop中定义一个类
- 实现controller:watch crd,对crd不同的生命周期做个性化处理,也就是实现operator核心的业务逻辑
- 部署controller:可以部署在集群内部,也可以在外部
- 定义crd实例:可以理解为oop中实例化一个类
frp
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
frp在k8s中的应用
在正常情况下,外部访问k8s有几种方式:
- service的lb和nodeport类型可以暴露服务
- 使用ingress暴露服务
对于个人项目或者其他某种场景,这个集群并不能直接被外部访问,也就是说没有公网ip的情况如何对外服务。首先frp是满足需求的,只需要有一台公网的云服务器。如果没有frpc-operator的情况,那可能需要如下步骤去穿透服务:
- 部署frpc deployment
- 将frpc config置于configmap内
每一次暴露或调整新的节点时,就需要调整configmap,删除pod,才能更新完成。
这一步可以进行优化,我们引入一个config-as-code边车容器:
他会监控指定的configmap,当调整配置以后,边车容器自动调用frpc的reload接口,实现不用删除pod即可更新。
需要注意的是,此边车容器需要configmap的一些权限。
为了学习operator,可以将这个操作集封装成为frpc-operator
frpc-operator
frpc-operator中定义了两种资源:
client
每一个client就是一个frpc deployment(事实上这里有点问题,如果多个副本会引起proxy重复,应该使用statefulset,将proxy平均分配至每个副本)。示例:
apiVersion: frpc.yoogo.top/v1
kind: Client
metadata:
name: client-sample
spec:
// 大致与frpc.ini中的配置差不多,只是支持的字段比较贫瘠
common:
server_addr: 127.0.0.1
server_port: 7000
token:
value: passwd
Proxy
apiVersion: frpc.yoogo.top/v1
kind: Proxy
metadata:
name: proxy-sample
spec:
client: client-sample // 必须指定client 名字
local_addr: 127.0.0.1 // 本地地址
local_port: "80" // 本地端口
tcp:
remote_port: "20080" //服务端口