跳到主要内容

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 可以设置为以下几个值:

  1. Always:如果容器退出,无论退出代码是什么,Kubelet 总是会尝试重新启动容器。这对于长时间运行的应用程序,如 web 服务器或数据库,是非常有用的,因为你通常希望这些应用程序始终运行,即使在失败后也是如此。

  2. OnFailure:只有当容器以非零退出代码退出(表示失败)时,Kubelet 才会重新启动容器。这对于批处理任务或一次性任务很有用,因为如果任务成功完成(以零退出代码退出),则通常不需要重新启动。

  3. 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。

代码详解:

  1. 在api/type.go 文件 ContainerManifest 结构体中添加 restartPolicy 字段

  1. 在同步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
}