范姐

0 声望

这家伙太懒,什么都没留下

个人动态

半兽人 创建k8s资源,并等待完成后在执行下一步 发表评论:

下面是一个如何创建部署并检查它是否有至少一个准备好的副本的例子。也许检查状态中的条件会更好,并查找类型为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
}
昨天
半兽人 Kubernetes是否可以在一个Yaml文件中合并Pod.yaml和Service.yaml(不是Deployment类型) 发表评论:

是的,你可以把任何你想要的资源放在一个yaml文件中,你只需要用3个破折号把它们分开,例如

apiVersion: apps/v1
kind: Service

---
apiVersion: apps/v1
kind: Pod
27天前
范姐 回复 半兽人 Kubernetes容器args报错 中 :

感谢您的解释,按照这个解决了。不过我还必须删除URL周围的引号,因为使用shell运行命令的话就是必需的。

1月前
半兽人 Kubernetes容器args报错 发表评论:

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 ENTRYPOINTCMD指令,只是Docker原生形式也都接受一个纯字符串,它们将在空格上进行分割(在Dockerfile情况下使用shell,但在Compose情况下不使用)。

在你提供的docker run命令中,你的主机系统上的shell会先进行处理,所以--env-var选项和baseUrl=...参数在传递到容器中之前会被拆成单独的参数。

1月前
1月前
半兽人 Kubernetes v1.20.0 报"unexpected error getting claim reference: selfLink was empty, can't make reference" 发表评论:

当前的解决方法是编辑/etc/kubernetes/manifests/kube-apiserver.yaml
在这里:

spec:
  containers:
  - command:
    - kube-apiserver

添加这一行:

- --feature-gates=RemoveSelfLink=false

然后应用它,即可

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
1月前
订阅了 kafka 主题! · 1月前
订阅了 kubernetes 主题! · 1月前
赞了 kafka中文教程 · 1年前