实现一个k8s的节点本地服务

k8s的service实体的路由规则太简单,无法设置路由节点信息,于是我通过crd扩展一个LocalService的种类来控制节点的路由

它的结构如下,创建LocalService会创建对应的节点service,通过服务名-节点名就可以很方便的路由到该节点的上

demo-service(kind:LocalService)
  \- demo-service-node1(kind:service)
  \- demo-service-node2(kind:service)
  ...

当在k8s创建一个实体时会发生什么

前置条件

容器: docker

kubernetes: 1.14.2

当在k8s中创建一个deployments,注意kubeapi会通知到每一个controller,多个controll同时对一个deployment增加replicaSet只有一个会成功

sequenceDiagram
  kubectl->kubeapi: 创建一个deployment
  kubeapi->etcd: 持久化这次修改
  kubeapi->kubectl: 告知客户端创建成功
  deploymentController->kubeapi: 获取该deployment,创建对应的replicationSet并绑定该deployment
  replicationSetController->kubeapi: 获取该replicationSet,根据实例数创建pod
  kube_schedule->kubeapi: 获取新的pod,通过权重为它分配节点信息
  kubelet->kubeapi: 获取pod信息,通过cri发送给本地docker,创建container
  kubelet->container: 通知docker创建pod中的container
  kubelet->kubeapi: 收集container状态,更新pod状态

go的text/template源码解析

go的模板库一直缺少indent的功能,于是我决定自己造个轮子来解决这个问题

为了造出好用,贴近源生态的轮子,所以我决定把text/template的源码熟读一遍

本篇只是粗略的讲解模板的各个模块,不会深入函数细节

首先基本用法开始

基本用法

我们这里用的是text_template中example_test的ExampleTemplate()作为例子

通过一下命令创建一个text模板,其中Must函数表示处理错误并panic,New表示创建一个空模板,解析模板内容的逻辑在Parse函数中

然后通过t.Execute把模板渲染出来


归档 下一页