在 Kubernetes 中,Pod 是最小的可部署单元。它包含一个或多个容器,并且有自己的生命周期和重启策略。
Golang 可以通过 Kubernetes 提供的 API 来定义和操作 Pod 的生命周期和重启策略。以下是一些常见的 Pod 生命周期和重启策略:
- Pod 生命周期
Pod 的生命周期分为三个阶段:
- Pending:Pod 已经被创建,但是尚未调度到任何节点上。
- Running:Pod 已经被调度到某个节点上并且至少有一个容器正在运行。
- Terminated:Pod 所有容器都已停止运行。
- 重启策略
Pod 的重启策略指定了当某个容器失败时 Kubernetes 应该采取哪种行动:
- Always:无论什么原因导致容器停止运行,Kubernetes 都会自动重新启动该容器。这是默认的重启策略。
- OnFailure:只有当容器以非正常退出状态(如错误码不为 0)终止时,Kubernetes 才会自动重新启动该容器。
- Never:当某个容器停止运行时,Kubernetes 不会自动重新启动该容器。
以下是一个 Golang 示例代码片段,用于定义 Pod 的生命周期和重启策略:
package main
import (
"context"
"fmt"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
if err != nil {
panic(err.Error())
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "example-pod",
Namespace: "default",
Labels: map[string]string{
"app": "example-app",
},
},
Spec: corev1.PodSpec{
RestartPolicy: corev1.RestartPolicyOnFailure,
Volumes: []corev1.Volume{
corev1.Volume{
Name: "example-volume",
VolumeSource: corev1.VolumeSource{
ConfigMap: &corev1.ConfigMapVolumeSource{
LocalObjectReference: corev1.LocalObjectReference{Name:"configmap-name"},
},
},
},
},
InitContainers: []corev1.Container{ // 定义 init container
{
Name:"init-container-01",
Image:"busybox",
Command:["sleep", "10"],
},
},
Containers: []corev1.Container{ // 定义主容器
corev1.Container{
Name: "container-01",
Image: "nginx",
Command:["nginx"],
Args:["-g", "daemon off;"],
corev1.Container{
Name: "container-02",
Image: "busybox",
Command:["sh", "-c"],
Args:[`while true; do echo "$(date) Hello, World!"; sleep 10 ; done`],
VolumeMounts: []corev1.VolumeMount{
corev1.VolumeMount{
Name: "example-volume",
MountPath: "/data",
},
},
},
},
NodeSelector: map[string]string{
"node-role.kubernetes.io/worker": "",
},
Tolerations: []corev1.Toleration{ // 添加容忍
corev1.Toleration{Key:"key", Operator:"Equal", Value:"value"},
},
},
}
_, err = clientset.CoreV1().Pods("default").Create(context.Background(), pod, metav1.CreateOptions{})
if err != nil {
panic(err.Error())
}
fmt.Println("Pod created successfully")
}
在上面的示例中,我们使用了 RestartPolicy 字段来定义 Pod 的重启策略。我们还使用了 InitContainers 字段来定义 Pod 中的初始化容器。
通过这些示例代码片段,你可以更好地理解 Pod 生命周期和重启策略。




