0%

问题描述

我刚刚将kubeadm和kubelet升级到v1.8.0。并按照官方文档安装Dashboard。

1
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

之后,我通过运行如下命令启动Dashboard:

1
$ kubectl proxy --address="192.168.0.101" -p 8001 --accept-hosts='^*$'

幸运的是,我能够访问到Dashboard:

http://192.168.0.101:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

我被重定向选择认证方式的页面:Kubeconfig或Token。

我尝试将/etc/kubernetes/admin.conf作为kubeconfig上传,但失败了。然后我尝试使用我从kubeadm令牌列表中获取的令牌进行登录但又失败了。

问题是我如何登录Dashboard。看起来他们添加了许多安全机制。谢谢。

高票回答

从1.7版本开始,Dashboard 使用更安全的设置。这意味着,默认情况下,它具有最小的权限集,并且只能通过HTTPS访问。在执行任何进一步的步骤之前,建议阅读访问控制指南

从版本1.7开始,Dashboard支持基于以下内容的用户身份验证:

Dashboard on Github

Token

这里Token可以是静态令牌,服务帐户令牌,来自Kubernetes Authenticating的OpenID Connect Token,但不是kubeadm Bootstrap Token。

使用kubectl,我们可以获得默认情况下在kubernetes中创建的服务帐户(例如deployment)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ kubectl -n kube-system get secret
# All secrets with type 'kubernetes.io/service-account-token' will allow to log in.
# Note that they have different privileges.
NAME TYPE DATA AGE
deployment-controller-token-frsqj kubernetes.io/service-account-token 3 22h

$ kubectl -n kube-system describe secret deployment-controller-token-frsqj
Name: deployment-controller-token-frsqj
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=deployment-controller
kubernetes.io/service-account.uid=64735958-ae9f-11e7-90d5-02420ac00002

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZXBsb3ltZW50LWNvbnRyb2xsZXItdG9rZW4tZnJzcWoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVwbG95bWVudC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjQ3MzU5NTgtYWU5Zi0xMWU3LTkwZDUtMDI0MjBhYzAwMDAyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRlcGxveW1lbnQtY29udHJvbGxlciJ9.OqFc4CE1Kh6T3BTCR4XxDZR8gaF1MvH4M3ZHZeCGfO-sw-D0gp826vGPHr_0M66SkGaOmlsVHmP7zmTi-SJ3NCdVO5viHaVUwPJ62hx88_JPmSfD0KJJh6G5QokKfiO0WlGN7L1GgiZj18zgXVYaJShlBSz5qGRuGf0s1jy9KOBt9slAN5xQ9_b88amym2GIXoFyBsqymt5H-iMQaGP35tbRpewKKtly9LzIdrO23bDiZ1voc5QZeAZIWrizzjPY5HPM1qOqacaY9DcGc7akh98eBJG_4vZqH2gKy76fMf0yInFTeNKr45_6fWt8gRM77DQmPwb3hbrjWXe1VvXX_g

Kubeconfig

kubeconfig文件中的用户需要用户名和密码或令牌,而admin.conf只有客户端证书。

1
$ kubectl config set-credentials cluster-admin --token=bearer_token

替代方案

以下是绕过身份验证的两种方法,但请谨慎使用。

使用HTTP部署

1
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/alternative/kubernetes-dashboard.yaml

可以使用kubectl代理在http://localhost:8001/ui加载Dashboard。

授予Dashboard管理员权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
EOF

之后,您可以使用登录页面上的“跳过”选项来访问Dashboard。

如果您使用的是Dashboard v1.10.1版本或更高版本,则还必须将–enable-skip-login添加到部署的命令行参数中。您可以通过将其添加到kubectl edit deployment/kubernetes-dashboard –namespace=kube-system中的args来实现。

1
2
3
4
5
containers:
- args:
- --auto-generate-certificates
- --enable-skip-login # <-- add this line
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1

原文链接

How to sign in kubernetes dashboard?

问题描述

我已经用命令启动了pods:

1
# kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1

出了点问题,现在我无法删除这个pod,我尝试使用下面的方法,但它不断重建自己:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# kubectl delete pods  busybox-na3tm
pod "busybox-na3tm" deleted
# kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-vlzh3 0/1 ContainerCreating 0 14s

# kubectl delete pod busybox-vlzh3 --grace-period=0

# kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted


# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default busybox-c9rnx 0/1 RunContainerError 0 23s

高票回答

您需要删除deployment,而deployment会自动删除pod和replica sets

列出所有deployment:

1
kubectl get deployments --all-namespaces

然后删除deployment:

1
kubectl delete -n NAMESPACE deployment DEPLOYMENT

NAMESPACE是其所在的命名空间,而DEPLOYMENT是deployment资源的名称。

在某些情况下,由于job或daemonset也可能正在运行。检查以下内容并运行相应的删除命令。

1
2
3
4
5
kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

原文链接

Kubernetes pod gets recreated when deleted

问题描述

我在kubernetes 8集群上安装了helm 2.6.2。helm init运行正常。但是当我运行helm list时它会给出这个错误。

1
2
helm list
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system"

如何解决此RABC错误消息?

高票回答

运行如下这些命令可以解决:

1
2
3
4
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
helm init --service-account tiller --upgrade

其他答案

更安全的做法

高票答案提供对Helm的完全管理员访问权限,这不是最明智的安全解决方案。通过更多工作,我们可以限制Helm对特定命名空间的访问。更多细节请参考Helm文档

1
2
3
4
$ kubectl create namespace tiller-world
namespace "tiller-world" created
$ kubectl create serviceaccount tiller --namespace tiller-world
serviceaccount "tiller" created

定义一个角色,允许Tiller管理tiller-world中的所有资源,如role-tiller.yaml:

1
2
3
4
5
6
7
8
9
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-manager
namespace: tiller-world
rules:
- apiGroups: ["", "batch", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]

然后运行:

1
2
$ kubectl create -f role-tiller.yaml
role "tiller-manager" created

在rolebinding-tiller.yaml中,

1
2
3
4
5
6
7
8
9
10
11
12
13
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: tiller-binding
namespace: tiller-world
subjects:
- kind: ServiceAccount
name: tiller
namespace: tiller-world
roleRef:
kind: Role
name: tiller-manager
apiGroup: rbac.authorization.k8s.io

然后运行:

1
2
$ kubectl create -f rolebinding-tiller.yaml
rolebinding "tiller-binding" created

之后,可以运行helm init以在tiller-world命名空间中安装Tiller。

1
$ helm init --service-account tiller --tiller-namespace tiller-world

现在使用–tiller-namespace tiller-world为所有命令添加前缀,或者在环境变量中设置TILLER_NAMESPACE = tiller-world。

更远见的做法

停止使用Tiller。Helm 3彻底消除了对Tiller的需求。如果您使用的是Helm 2,则可以使用helm模板从Helm chart生成yaml,然后运行kubectl apply将对象应用于Kubernetes集群。

1
2
helm template --name foo --namespace bar --output-dir ./output ./chart-template
kubectl apply --namespace bar --recursive --filename ./output -o yaml

原文链接

helm list : cannot list configmaps in the namespace “kube-system”

问题描述

我现在正在尝试在Kubernetes集群上运行一个带shell(/bin/bash)的简单容器。

我认为有一种方法可以通过使用伪tty和detach选项(docker run命令上的-td选项)来保持容器在Docker容器上运行。

例如,

1
$ sudo docker run -td ubuntu:latest

在Kubernetes有这样的选择吗?

我尝试使用kubectl run-container命令运行容器,如:

1
kubectl run-container test_container ubuntu:latest --replicas=1

但是容器几秒后会退出(就像使用docker run命令启动而没有上面提到的选项)。并且ReplicationController会重复启动它。

有没有办法让容器在Kubernetes上运行,就像docker run命令中的-td选项一样?

高票回答

当主进程退出时,容器退出。做类似的事情:

1
docker run -itd debian

坦率地说,容器打开是一个只能用于快速测试和示例的黑客攻击。如果你只想要一个容器进行几分钟的测试,我会这样做:

1
docker run -d debian sleep 300

其优点是,如果忘记了容器,容器将自动退出。或者,可以在while循环中放置类似的内容以使其永久运行,或者只运行top等应用程序。所有这些在Kubernetes中应该很容易做到。

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just spin & wait forever
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]

真正的问题是你为什么要这样做?您的容器应该提供服务,其过程将使容器在后台运行。

原文链接

How can I keep a container running on Kubernetes?

问题描述

在Kubernetes / Docker生态系统中,存在使用/ healthz作为应用程序的健康检查的约定。

‘healthz’这个名字来自哪里,是否有与该名称相关的特定语义?

高票回答

它历来源于谷歌的内部实践。他们被称为“z-pages”。

它以z结尾的原因是减少与具有相同名称(如/status)的实际应用程序冲突。有关更多信息,请参阅此演讲:https://vimeo.com/173610242

类似的(至少在Google内部)有/varz,/statusz,/rpcz。Google开发的服务会自动获取这些状态以导出其运行状况和指标,并且有一些工具可以从所有已部署的服务中收集公开的指标/状态。

像Prometheus这样的开源工具通过到知名接口来收集应用程序中的指标,实现了这种模式(因为Prometheus的原始作者也是前Google员工)。类似地,OpenCensus允许您从应用程序(最好是在不同的端口上)公开z页面来诊断问题。

原文链接

Where does the convention of using /healthz for application health checks come from?

本指南仅涵盖升级和迁移的版本> = v1.8.0

将现有Harbor实例升级到较新版本时,可能需要迁移数据库中的数据和harbor.cfg中的设置。由于迁移可能会更改数据库架构和harbor.cfg的设置,因此务必在迁移之前备份数据

注意:

  • 必须在任何数据迁移之前备份数据。
  • 本指南仅涵盖从v1.6.0迁移到当前版本,如果要从早期版本升级,请参阅发行版分支中的迁移指南以升级到v1.6.0,并按照本指南进行迁移到更高版本。
  • 从v1.6.0开始,Harbor会在启动时自动尝试迁移数据库,因此如果从v1.6.0或更高版本升级,则无需调用迁移器工具来迁移数据库。
  • 有关数据库架构的更改,请参阅更改日志
  • 从v1.8.0开始,Harbor的配置已更改为.yml文件,迁移器将配置文件从harbor.cfg转换为harbor.yml。执行此迁移的命令稍有不同,请确保按照以下步骤操作。

升级Harbor和迁移数据

  1. 登录Harbor运行的主机,如果仍在运行,则停止并删除现有的Harbor实例:

    1
    2
    cd harbor
    docker-compose down
  2. 备份Harbor的当前文件,以便可以在必要时回滚到当前版本:

    1
    mv harbor /my_backup_dir/harbor

    备份数据库(默认情况下在/data/database中):

    1
    cp -r /data/database /my_backup_dir/
  3. 从Github获取最新的Harbor发布包:https://github.com/goharbor/harbor/releases

  4. 在升级Harbour之前,请先执行迁移。迁移工具作为docker镜像提供,因此应该先从docker hub中拉取镜像。在以下命令中将[tag]替换为Harbor的发行版本(例如v1.5.0):

    1
    docker pull goharbor/harbor-migrator:[tag]
  5. 从harbor.cfg升级到harbor.yml:

    1
    docker run -it --rm -v ${harbor_cfg}:/harbor-migration/harbor-cfg/harbor.cfg -v ${harbor_yml}:/harbor-migration/harbor-cfg-out/harbor.yml goharbor/harbor-migrator:[tag] --cfg up

    注意1:可以在步骤3中获取的解压缩安装程序中找到$ {harbor_yml},迁移后,该路径中的文件harbor.yml将使用$ {harbor_cfg}中的值更新

    注意2:数据库升级和数据迁移由Harbor启动时自动执行,如果迁移失败,请检查核心日志以进行调试。

  6. ./harbor目录下,运行./install.sh脚本以安装新的Harbor实例。如果选择使用Notary,Clair和chartmuseum等组件安装Harbour,请参阅“安装和配置指南”以获取更多信息。

升级后的回滚

无论出于何种原因,如果想回滚到之前版本的Harbour,请按照以下步骤操作:

注意:回滚不支持跨v1.5.0升级,例如从v1.2.0升级到v1.7.0。这是因为Harbor从v1.7.0将DB更改为PostgreSQL,迁移器无法将数据回滚到MariaDB。

  1. 如果仍在运行,请停止并删除当前的Harbor服务:

    1
    2
    cd harbor
    docker-compose down
  2. 删除当前的Harbor实例:

    1
    rm -rf harbor
  3. 恢复Harbor的旧版本包:

    1
    mv /my_backup_dir/harbor harbor
  4. 恢复数据库,将数据文件从备份目录复制到数据卷,默认为/data/database

  5. 使用以前的配置重新启动Harbor服务。

    如果安装了以前版本的Harbor:

    1
    2
    cd harbor
    ./install.sh

问题描述

在查看文档时看到,有一个api调用可以删除pod,有没有办法杀死所有命名空间中的所有pod?

高票回答

没有命令可以完全按照你的要求去做。

可以使用以下命令删除单个命名空间中的所有pod:

1
kubectl delete --all pods --namespace=foo

可以使用以下命令删除所有命名空间以及每个命名空间中的每个对象(但不包括非命名空间的对象,如节点和某些事件):

1
kubectl delete --all namespaces

但是,后一个命令可能不是你想要做的事情,因为它会删除kube-system命名空间中的东西,这会使你的集群无法使用。

此命令将删除除kube-system之外的所有名称空间,这可能很有用:

1
2
3
4
for each in $(kubectl get ns -o jsonpath="{.items[*].metadata.name}" | grep -v kube-system);
do
kubectl delete ns $each
done

原文链接

Command to delete all pods in all kubernetes namespaces

在搭建个人博客时遇到了一个大家都遇到过的坑,那就是在github上托管的博客在百度上是搜索不到的,所以就有了把个人博客同时托管到github和coding之说。

搭建教程网上一搜一大把,不再详述(可参考这里),这里只记录下搭建过程中需要注意的几个地方。

  1. coding账号注册时请选择个人版(如果注册了团队版,你会发现跟网上给的教程不太一样,而且,部署出来的网页地址无法修改成xxx.coding.me)。

1564908572712

1564908744041

  1. 访问地址如果是如下图所示,不要慌,到个人账户—>个人设置—>用户名,修改一下就可以了。

1564909224309

  1. 如果未设置SSH(报错信息如下图),请拷贝本地主机的id_rsa.pub内容到个人账户—>SSH公钥

1564910021188

yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。

通配符

路径可以使用’prefix’命令作为前缀。完整的yaml内容将嵌套在新的前缀路径中。

1
yq p <yaml_file> <path>

写到标准输出

给出sample.yaml文件:

1
2
a: simple
b: [1, 2]

然后

1
yq p data1.yaml c

输出

1
2
3
c:
a: simple
b: [1, 2]

任意深度

给定data1.yaml文件:

1
2
a:
b: [1, 2]

然后

1
yq p data1.yaml c.d

输出

1
2
3
4
c:
d:
a:
b: [1, 2]

更新文件

给定data1.yaml文件:

1
2
a: simple
b: [1, 2]

然后

1
yq p -i data1.yaml c

将更新data1.yaml文件,以便路径’c’作为所有其他路径的前缀。

多文档 - 增加前缀到单个文档

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

然后

1
yq p -d1 data1.yaml c

输出

1
2
3
4
5
something: else
---
c:
a: simple
b: cat

多文档 - 增加前缀到所有文档

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

然后

1
yq p -d'*' data1.yaml c

输出

1
2
3
4
5
6
c:
something: else
---
c:
a: simple
b: cat

合并

可以使用’merge’命令合并Yaml文件。与第一个文件合并的每个附加文件将为任何尚未存在的key或没有值的key设置值。

1
yq m <yaml_file> <path>...

写到标准输出

给出data1.yaml文件:

1
2
a: simple
b: [1, 2

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m data1.yaml data2.yaml

输出

1
2
3
4
a: simple
b: [1, 2]
c:
test: 1

更新文件

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m -i data1.yaml data2.yaml

将更新data1.yaml文件,将’c’的值为’test:1’。

覆盖值

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m -x data1.yaml data2.yaml

输出

1
2
3
4
a: other
b: [1, 2]
c:
test: 1

覆盖数组值

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data3.yaml文件:

1
2
3
4
5
b: [3, 4]
c:
test: 2
other: true
d: false

然后

1
yq m -x data1.yaml data3.yaml

输出

1
2
3
4
5
6
a: simple
b: [3, 4]
c:
test: 2
other: true
d: false

请注意,’b’不会导致数组中值的合并

追加数组值

给出data1.yaml文件:

1
2
3
a: simple
b: [1, 2]
d: hi

和data3.yaml文件:

1
2
3
4
5
a: something
b: [3, 4]
c:
test: 2
other: true

然后

1
yq m -a data1.yaml data3.yaml	

输出

1
2
3
4
5
6
a: simple
b: [1, 2, 3, 4]
c:
test: 2
other: true
d: hi

请注意,’b’数组已连接第二个数据文件中的值。另请注意,其他map键不会被覆盖(字段a)。

Append不能与overwrite一起使用,如果给出了两个标志,则忽略append。

多文档 - 合并单个文档

目前,yq仅对要合并的第一个文档提供多文档支持。剩余的yaml文件将选择其第一个文档。

给出data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

和data3.yaml文件:

1
b: dog

然后

1
yq m -x -d1 data1.yaml data3.yaml

输出

1
2
3
4
something: else
---
a: simple
b: dog

多文档 - 合并所有文档

目前,yq仅对要合并的第一个文档提供多文档支持。剩余的yaml文件将选择其第一个文档。

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

和data3.yaml文件:

1
b: dog

然后

1
yq m -x -d'*' data1.yaml data3.yaml

输出

1
2
3
4
5
b: dog
something: else
---
a: simple
b: dog

转换

Yaml到Json

将输出转换为json,请使用–tojson(或-j)标志。这只能与read命令一起使用。

给出sample.yaml文件:

1
2
b:
c: 2

然后

1
yq r -j sample.yaml b.c

输出

1
{"b":{"c":2}}

Json到Yaml

要读入json,只需传入一个json文件而不是yaml,它就可以工作了:)

例如给出一个json文件:

1
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}

然后

1
yq r sample.json

输出

1
2
3
4
5
6
a: Easy! as one two three
b:
c: 2
d:
- 3
- 4

yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。

创建

可以使用“new”命令创建Yaml文件。这与write命令的工作方式相同,但不需要传入已存在的Yaml文件。目前,不支持在单个yaml文件中创建多个文档。

1
yq n <path> <new value>

创建简单文件

1
yq n b.c cat

输出

1
2
b:
c: cat

使用脚本创建文件

创建脚本遵循与更新脚本相同的格式。

给定一个脚本create_instructions.yaml:

1
2
b.c: 3
b.e[+].name: Howdy Partner

然后

1
yq n -s create_instructions.yaml

输出

1
2
3
4
b:
c: 3
e:
- name: Howdy Partner

还可以使用管道方式创建:

1
cat create_instructions.yaml | yq n -s -

带点号的Key

指定具有点号使用键查找指示符的键时。

1
2
b:
foo.bar: 7
1
yaml r sample.yaml 'b[foo.bar]'
1
yaml w sample.yaml 'b[foo.bar]' 9

可以将任何有效的yaml key指定为key查找的一部分。

请注意,路径是引号,以避免shell解释方括号。

带有破折号的键(和值)

如果键或值具有前导破折号,则yq将不知道您传递的是值而不是标志(并且您将收到“错误标志语法”错误)。

要解决这个问题,你需要告诉它通过在最后一个标志之后添加’ - ‘来停止处理标志,如下所示:

1
yq n -t -- --key --value

返回

1
` --key: --value

删除

1
yq d <yaml_file> <path_to_delete>

写到标准输出

给出sample.yaml文件:

1
2
3
b:
c: 2
apples: green

然后

1
yq d sample.yaml b.c

输出

1
2
b:
apples: green

从标准输入读取

1
cat sample.yaml | yq d - b.c

删除数组元素

给出sample.yaml文件:

1
2
3
4
5
b:
c:
- 1
- 2
- 3

然后

1
yq d sample.yaml 'b.c[1]'

输出

1
2
3
4
b:
c:
- 1
- 3

删除节点

给出sample.yaml文件:

1
2
3
b:
c: 2
apples: green

然后

1
yq d -i sample.yaml b.c

将更新sample.yaml文件,以便删除“c”节点。

通配符

给出sample.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
---
bob:
item1:
cats: bananas
dogs: woof
item2:
cats: apples
dogs: woof2
thing:
cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.*.cats

输出

1
2
3
4
5
6
7
8
---
bob:
item1:
dogs: woof
item2:
dogs: woof2
thing:
dogs: woof3

前缀匹配

给出sample.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
---
bob:
item1:
cats: bananas
dogs: woof
item2:
cats: apples
dogs: woof2
thing:
cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.item*.cats

输出

1
2
3
4
5
6
7
8
9
---
bob:
item1:
dogs: woof
item2:
dogs: woof2
thing:
cats: oranges
dogs: woof3

数组匹配

给出sample.yaml文件:

1
2
3
4
5
6
7
8
---
bob:
- cats: bananas
dogs: woof
- cats: apples
dogs: woof2
- cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.[*].cats

输出

1
2
3
4
5
---
bob:
- dogs: woof
- dogs: woof2
- dogs: woof3

多文档 - 删除单个文档

给出sample.yaml文件:

1
2
3
4
5
6
something: else
field: leaveMe
---
b:
c: 2
field: deleteMe

然后

1
yq w -d1 sample.yaml field

输出

1
2
3
4
5
something: else
field: leaveMe
---
b:
c: 2

多文档 - 删除所有文档

给出sample.yaml文件:

1
2
3
4
5
6
something: else
field: deleteMe
---
b:
c: 2
field: deleteMeToo

然后

1
yq w -d'*' sample.yaml field

输出

1
2
3
4
something: else
---
b:
c: 2

请注意,’*’在引号中以避免被shell解释。

带点号的Key

指定具有点号使用键查找指示符的键时。

1
2
b:
foo.bar: 7
1
yaml r sample.yaml 'b[foo.bar]'
1
yaml w sample.yaml 'b[foo.bar]' 9

可以将任何有效的yaml key指定为key查找的一部分。

请注意,路径是引号,以避免shell解释方括号。

带有破折号的键(和值)

如果键或值具有前导破折号,则yq将不知道您传递的是值而不是标志(并且您将收到“错误标志语法”错误)。

要解决这个问题,你需要告诉它通过在最后一个标志之后添加’ - ‘来停止处理标志,如下所示:

1
yq n -t -- --key --value

返回

1
` --key: --value