可以使用以下命令强制删除POD。
kubectl delete pod --grace-period=0 --force --namespace
相关问题可查看:https://www.orchome.com/10587
下面是一个如何创建部署并检查它是否有至少一个准备好的副本的例子。也许检查状态中的条件会更好,并查找类型为Available
和status为True
的条件。
package main
import (
"context"
"fmt"
v1 "k8s.io/api/apps/v1"
podv1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"time"
)
const (
namespace = "default"
deploymentName = "nginx"
)
func main() {
cfg, err := config.GetConfig()
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(cfg)
if err != nil {
panic(err)
}
client, err := client.New(cfg, client.Options{})
if err != nil {
panic(err)
}
d := &v1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: deploymentName,
Namespace: namespace,
},
Spec: v1.DeploymentSpec{
Replicas: toInt32Ptr(2),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "nginx",
},
},
Template: podv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "nginx",
},
},
Spec: podv1.PodSpec{
Containers: []podv1.Container{
{
Name: "nginx",
Image: "nginx",
},
},
},
},
},
}
fmt.Println("Deploying")
_, err = controllerutil.CreateOrUpdate(context.TODO(), client, d, func() error {
return nil
})
if err != nil {
panic(err)
}
stop := make(chan struct{})
watchList := cache.NewListWatchFromClient(clientset.AppsV1().RESTClient(), "deployments", namespace, fields.Everything())
_, ctrl := cache.NewInformer(watchList, &v1.Deployment{}, time.Second, cache.ResourceEventHandlerFuncs{
UpdateFunc: func(o, n interface{}) {
newDeployment := n.(*v1.Deployment)
if newDeployment.Name != deploymentName {
return
}
if newDeployment.Status.ReadyReplicas > 0 {
close(stop)
return
}
return
},
})
ctrl.Run(stop)
fmt.Println("Deployment has at least 1 ready replica")
}
func toInt32Ptr(i int32) *int32 {
return &i
}
是的,你可以把任何你想要的资源放在一个yaml文件中,你只需要用3个破折号把它们分开,例如
apiVersion: apps/v1
kind: Service
---
apiVersion: apps/v1
kind: Pod
Linux的命令是由一连串的单词组成的。如果你在shell提示符下键入一个命令,它就会负责帮你拆成单词,但在Kubernetes args: list
中,你需要自己拆出单词。
args:
- run
- '<url-to-collection>'
# 你想让它们作为两个独立的参数,所以需要是2个独立列表
- --env-var
- baseUrl=<kubernetes-hostname>
如果两个参数在同一个列表项中,就是一个 "单词"。
# /bin/ls "/app/some directory/some file"
command:
- /bin/ls
# 单个参数,包括空格
- /app/some directory/some file
同样的规则适用于Docker Compose entrypoint:
和command:
以及JSON-syntax Dockerfile ENTRYPOINT
和CMD
指令,只是Docker原生形式也都接受一个纯字符串,它们将在空格上进行分割(在Dockerfile情况下使用shell,但在Compose情况下不使用)。
在你提供的docker run
命令中,你的主机系统上的shell会先进行处理,所以--env-var
选项和baseUrl=...
参数在传递到容器中之前会被拆成单独的参数。