跳到主要内容

35.controllerSync

PR #618

Make replication controller synchronizations independent.

PR #535

Etcd watcher

// etcdWatcher converts a native etcd watch to a watch.Interface.
type etcdWatcher struct {
list bool // If we're doing a recursive watch, should be true.
filter FilterFunc

etcdIncoming chan *etcd.Response
etcdStop chan bool

outgoing chan watch.Event
userStop chan struct{}
}

这是一段用于在Kubernetes中对etcd数据的更改进行监视的代码,etcd是Kubernetes用于存储所有集群数据的键值存储系统。

以下是这段代码的关键部分:

FilterFunc是一个函数类型,用于确定某个对象是否应该被保留在集合中。

Everything函数接受所有的对象,总是返回true。

EtcdHelper结构体提供了两个方法:WatchList和Watch,它们都启动一个对etcd指定键进行监视的go协程,前者对键的列表进行监视,后者对单个键进行监视。创建监视的函数newEtcdWatcher将返回的etcdWatcher作为watch.Interface返回。

etcdWatcher是一个结构体,负责将etcd的原生监视转化为watch.Interface。etcdWatcher内部有两个协程etcdWatch和translate,前者对etcd进行监视并接收监视到的数据,后者处理接收到的数据并将其发送到outgoing通道。

translate方法中的select语句会监听userStop和etcdIncoming两个通道,如果收到用户停止的信号,会发送停止信号到etcdStop通道并返回;如果收到etcd的监视数据,会调用sendResult方法处理并发送。

sendResult方法会根据res.Action的值来决定是创建、更新还是删除对象,并根据w.list的值决定是否需要处理子节点。如果w.filter函数不为nil,则会对对象进行过滤,只有通过过滤的对象才会被发送。

ResultChan方法返回outgoing通道,这是watch.Interface接口的一部分,用户可以从这个通道接收到监视事件。

Stop方法关闭userStop通道,这会触发translate方法中的select语句,从而停止监视。

这是一段将etcd的监视接口适配为Kubernetes监视接口的代码,核心逻辑在于将etcd返回的监视事件转化为Kubernetes的监视事件,并通过过滤函数和是否处理子节点来进行细粒度的控制。

PR #630

Add go fuzzer in preparation for testing. [写了一个 fuzzer框架,随机填充对象的值,方便测试]

PR #642

Add master.Config type and cleanup master configuration

初始化一个新的 master 实例需要传递太多的参数,使用一个 config 结构体来方便初始化。

PR #619

Make individual controller actions asynchronous.

这个函数是 Kubernetes 中的一部分,负责同步 ReplicationController 的状态。ReplicationController 是 Kubernetes 中的一个重要组件,它确保集群中的某一指定数量的副本始终处于运行状态。

labels.Set(controllerSpec.DesiredState.ReplicaSelector).AsSelector() 这段代码将 ReplicationController 中定义的标签选择器从映射形式转化为选择器形式。

podList, err := rm.kubeClient.ListPods(s) 这段代码使用 kubernetes 客户端列出匹配此选择器的所有 Pod。

filteredList := rm.filterActivePods(podList.Items) 这段代码过滤掉所有不在活跃状态的 Pods。

diff := len(filteredList) - controllerSpec.DesiredState.Replicas 这段代码计算了当前活跃的 Pod 与 ReplicationController 指定的期望副本数量之间的差值。

如果 diff 小于0,说明 Pod 的数量小于我们期望的数量,我们需要创建更多的 Pods。于是创建等于差值数量的 goroutines,每个 goroutine 负责创建一个 Pod。使用 sync.WaitGroup 来确保所有的 Pod 都被创建完毕。

如果 diff 大于0,说明 Pod 的数量大于我们期望的数量,我们需要删除一些 Pods。创建等于差值数量的 goroutines,每个 goroutine 负责删除一个 Pod。同样的,也是使用 sync.WaitGroup 来确保所有的 Pod 都被删除完毕。

这个函数的核心逻辑是确保 Pod 的数量等于 ReplicationController 指定的期望数量,通过创建或者删除 Pods 来实现这一目标。这也是 Kubernetes 自动修复和自动缩放的一部分。

PR #571

Decode/Encode everywhere

  1. 添加 defaultCopy 函数,用来注册不同版本没有改变的资源类型的转换函数。该函数会被 AddDefaultCopy 函数调用,注册到 全局对象 conversionFuncs 中。
  2. AddKnownTypes 注册合法资源,额外记录类型对应的版本