controller是什么
简单来说,controller就是监听kubernetes的配置/状态变化,自动对资源进行调节。比如kubernetes内置的controller有Deployment、StatefulSet、DaemonSet。
实现controller
这里我们实现一个简单的loadbalancer controller,使用kubernetes的client-go。
先创建一个新的Serivce,并且指定Type为LoadBalancer。
1 | apiVersion: v1 |
这时Service的状态还是pending,因为还没有controller为其分配IP地址。
创建新的client
1 | config, err := rest.InClusterConfig() |
创建一个新的对Service状态变化的监听
1 | wch, err := cli.CoreV1().Services(corev1.NamespaceAll).Watch(context.TODO(), metav1.ListOptions{Watch: true}) |
如果是新建的Serivce,并且Type为LoadBalancer,则自动为其分配一个IP地址。
1 | // 端口分配范围 |
运行这个简单程序,再观察Serivce, 就会发现Serivice已经不再处于pending状态,并也为其分配了一个IP地址,虽然不能真正使用此地址进行访问,因为我们并没有创建真正的转发规则。
1 | apiVersion: v1 |
k3s的klipper-lb是一个很简单loadbalancer实现,代码只是几行脚本。
1 | start_proxy() { |