47.wrapErrors
PR #1192
Return standard API errors from etcd registry by operation
解决问题:
返回给用户侧的错误应该包装下,不应该返回 etcd 的错误。添加 pkg/api/errors/etcd,用于定义默认转换,用于从 etcd 到 API 的常见 CRUD 操作。
代码详解:
段代码是 Kubernetes 早期源码的一部分,它演示了如何从注册表中删除一个 Pod。这段代码的主要好处是它简洁地处理了删除过程中可能发生的错误,并将底层 etcd 的错误转换为 Kubernetes API 可以理解的错误。
PR #1147
Introduce the simplest RestartPolicy and handling
解决问题:
目前我们没有重启策略,需要添加策略:
在 Kubernetes 中,RestartPolicy 是用于控制 Pod 中的容器在退出时应该如何重新启动的。这是一种非常重要的策略,因为它决定了在容器失败或完成任务后如何处理它们。RestartPolicy 可以设置为以下几个值:
Always:如果容器退出,无论退出代码是什么,Kubelet 总是会尝试重新启动容器。这对于长时间运行的应用程序,如 web 服务器或数据库,是非常有用的,因为你通常希望这些应用程序始终运行,即使在失败后也是如此。
OnFailure:只有当容器以非零退出代码退出(表示失败)时,Kubelet 才会重新启动容器。这对于批处理任务或一次性任务很有用,因为如果任务成功完成(以零退出代码退出),则通常不需要重新启动。
Never:容器不会在退出后重新启动,不管退出代码是什么。这在你希望手动干预并控制容器何时启动的情况下很有用。
这是一个例子,展示了如何在 Pod 规范中设置 RestartPolicy:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
restartPolicy: OnFailure
containers:
- name: example-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
在上面的 YAML 文件中,Pod 的 RestartPolicy 被设置为 OnFailure。这意味着,如果容器以非零退出代码退出,它将被重新启动。如果容器成功完成其任务并以零退出代码退出,它将不会重新启动。
需要注意的是,RestartPolicy 适用于 Pod 中的所有容器。这意味着,你不能为同一个 Pod 中的不同容器设置不同的 RestartPolicy。
代码详解:
- 在api/type.go 文件 ContainerManifest 结构体中添加 restartPolicy 字段
- 在同步pod时候添加重启策略
getRecentDockerContainersWithNameAndUUID 函数的工作方式是,它会列出所有的 Docker 容器,然后过滤出符合以下条件的容器:
- 容器的 Pod 名称与给定的 Pod 名称相同;
- 容器的 UUID 与给定的 UUID 相同(如果给定的 UUID 不为空);
- 容器的名称与给定的容器名称相同;
- 容器当前没有运行或暂停。
然后根据 Pod 的 RestartPolicy,检查是否需要重新启动这些容器。这主要包括以下几个步骤:
如果 Pod 的 RestartPolicy 设置为 Always,kubelet 将始终尝试重新启动容器,不管容器是如何退出的。
如果 Pod 的 RestartPolicy 设置为 Never,并且容器已经运行过(即 recentContainers 非空),则 kubelet 不会重新启动容器。
如果 Pod 的 RestartPolicy 设置为 OnFailure,kubelet 会检查最近运行的容器的退出码。如果退出码为 0,表明容器已经成功运行,kubelet 不会重新启动容器。
PR #1237
Document Kubernetes Release Process
发布 Kubernetes 此文档解释了如何创建 Kubernetes 版本(即发布版本)以及版本信息如何嵌入到构建的二进制文件中。
PR #1248
Make replica controllers return current state.
解决问题:
目前 repliController 没有返回当前状态
代码详解
// Get obtains the ReplicationController specified by its id.
func (rs *REST) Get(id string) (runtime.Object, error) {
controller, err := rs.registry.GetController(id)
if err != nil {
return nil, err
}
rs.fillCurrentState(controller)
return controller, err
}
func (rs *REST) fillCurrentState(ctrl *api.ReplicationController) error {
if rs.podLister == nil {
return nil
}
list, err := rs.podLister.ListPods(labels.Set(ctrl.DesiredState.ReplicaSelector).AsSelector())
if err != nil {
return err
}
ctrl.CurrentState.Replicas = len(list.Items)
return nil
}