kubectl应用-奇怪的空运行

Gal*_*one 6 kubernetes kubectl minikube kubernetes-apiserver

我正在使用kubectl和--dry-run遇到奇怪的行为。

为简化起见,假设我具有以下yaml文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: nginx
    spec:
      containers:
      - image: nginxsdf
        imagePullPolicy: Always
        name: nginx
Run Code Online (Sandbox Code Playgroud)

修改例如图像或副本数:

  • kubectl apply -f Deployment.yaml -o yaml --dry-run向我输出具有OLD规范的资源

  • kubectl apply -f Deployment.yaml -o yaml向我输出具有规范的资源

根据文档:

--dry-run = false:如果为true,则仅打印将要发送的对象,而不发送它。

但是,打印的对象是旧对象,而不是将被发送到ApiServer的对象。

在minikube,gke v1.10.0上测试

同时,我为此打开了一个新的gitHub问题:

Gal*_*one 7

我在 kubernetes 问题页面中得到了以下答案:

更新现有对象时,kubectl apply 不会发送整个对象,只是一个补丁。在试运行模式下打印现有对象或新对象并不完全正确……合并的结果是应该打印的结果。

为了让 kubectl 能够准确地反映应用的结果,它需要有服务器端应用逻辑客户端,这是一个非目标。

当前的努力旨在将应用逻辑移至服务器。作为其中的一部分,增加了试运行服务器端的能力。kubectl apply --server-dry-run会做你想做的事,打印应用合并的结果,而不实际坚持它。

@apelisse 我们可能应该更新应用的标志帮助,并可能在通过应用更新对象时使用 --dry-run 时打印警告以记录 --dry-run 的限制并指导人们使用 --server-dry-跑


小智 6

最新版本的客户端使用:

kubectl apply -f Deployment.yaml --dry-run=server
Run Code Online (Sandbox Code Playgroud)