新手的OpenShift oc命令
有一天,我发现这篇关于bash帖子。如果您是专业用户,您可能已经知道所有这些技巧,但如果您是新手或不是这样的专业用户,那么该帖子很可能是您的一天。
我认为为oc
命令创建类似的帖子会很有用。oc
命令是dope,每个人都应该知道。它设计精良,一致,灵活,正如您将看到的,有许多值得尝试的隐藏功能。
如果您是OpenShift专业人士,您可能已经知道我将在这里揭示的大部分内容; 否则,如果您刚开始使用OpenShift,或者您不是经验丰富的用户,这将为您节省一些宝贵的时间。
1. 首先要做的事:调试
当我不知道发生了什么或者我收到了不友好的错误消息时,我总是使用该标志--loglevel
。它将日志级别信息写入stderr。根据日志级别,您将获得curl API Rest调用,、API Rest正文答案,甚至更详细的信息。
$ oc --loglevel 7 get pod
...
I0216 21:24:12.027793 973 cached_discovery.go:72] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/v1/serverresources.json
I0216 21:24:12.028046 973 round_trippers.go:383] GET https://192.168.42.77:8443/api/v1/namespaces/myproject/pods
I0216 21:24:12.028052 973 round_trippers.go:390] Request Headers:
I0216 21:24:12.028057 973 round_trippers.go:393] Accept: application/json
I0216 21:24:12.028061 973 round_trippers.go:393] User-Agent: oc/v1.7.6+a08f5eeb62 (linux/amd64) kubernetes/c84beff
I0216 21:24:12.053230 973 round_trippers.go:408] Response Status: 200 OK in 25 milliseconds
I0216 21:24:12.055143 973 cached_discovery.go:119] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/servergroups.json
I0216 21:24:12.055228 973 cached_discovery.go:72] returning cached discovery info from /home/jtudelag/.kube/192.168.42.77_8443/authentication.k8s.io/v1/serverresources.json
I0216 21:24:12.055288 973 cached_discovery.go:72]
...
如果要修补OCP对象,loglevel 9非常方便,因为它显示了您需要应用的补丁(API请求体)。
假设您要更改服务对象的标签,在本例中标签为“app:hello-jorge”。
$ oc --loglevel 9 edit svc hello-openshift
...
I0216 21:33:15.786463 1389 request.go:994] Request Body: {"metadata":{"labels":{"app":"hello-jorge"}}}
I0216 21:33:15.786590 1389 round_trippers.go:386] curl -k -v -XPATCH -H "Accept: application/json" -H "Content-Type: application/strategic-merge-patch+json" -H "User-Agent: oc/v1.7.6+a08f5eeb62 (linux/amd64) kubernetes/c84beff" https://192.168.42.77:8443/api/v1/namespaces/myproject/services/hello-openshift
I0216 21:33:15.797185 1389 round_trippers.go:405] PATCH https://192.168.42.77:8443/api/v1/namespaces/myproject/services/hello-openshift 200 OK in 10 milliseconds
...
注意:在绝望的时刻,你总是可以添加任意数量的9,结果将只有一个9,但你可能会感到宽慰。
$ oc --loglevel 9999 get pod
2. su -
是的,你没有看错。您可以替换正在运行oc命令的用户,或者在OCP术语中,您可以"模拟"(impersonate )用户。显然,如果你有足够的权限进行模拟, 那么你只需要使用flag --as
。
例如:
# run the command as jorge user
$ oc --as=jorge get pods
此外,可以进行组模拟,而不是用户模拟:
# run the command as the developers group
$ oc --as-group=developers get pods
在许多情况下,它非常方便快捷,例如,检查用户是否可以执行特定操作或检查用户在运行oc时将收到的输出。在搞不清角色和权限时,它也很有用。
3. Whoami?
oc whoami
命令众所周知,特别是加上flag -t
用于获取当前用户/会话的持有者令牌。但是当你有一个令牌并且你不知道谁是所有者时会发生什么?
您可以做的一件事是使用令牌登录OpenShift,然后执行oc whoami
...等待一秒钟。oc whoami
会给你这个信息!只需在命令行中传递令牌作为第3个参数,不需要任何标志。
试试看:
# save the token
$ token=$(oc whoami -t)
# get the owner of the token
$ oc whoami $token
jorge
4. oc debug
你可以运行一个pod并获得一个shell。有时获取正在运行的pod配置的副本并使用shell对其进行故障排除很有用。这是默认行为。
介绍下oc debug
选项,您可以以root用户, 或任何其他用户ID身份运行容器,强制它在特定节点中运行各种命令。
您必须针对有效的 dc 运行命令,例如:
# get a shell inside a pod for dc/jorge
$ oc debug dc/jorge
# same but as root user
$ oc debug --as-root=true dc/jorge
5. oc explain
OpenShift / k8s对象有时很复杂,有很多字段。很多时候,我最终在OCP文档或其他来源中寻找对象定义示例。在涉及OCP / k8s对象定义时,您可以考虑用 oc explain
作为可信来源。
oc explain
为您提供资源及其字段的文档。在声明新的OCP对象时,或者当您无法访问官方OCP文档时,它非常有用。
例如,您可以获取pod文档和pod spec affinity字段描述:
# get pod explanation
$ oc explain pod
DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts.
FIELDS:
metadata <Object>
Standard object's metadata. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
spec <Object>
Specification of the desired behavior of the pod. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
status <Object>
Most recently observed status of the pod. This data may not be up to date.
Populated by the system. Read-only. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds
# get pod spec affinity field
$ oc explain pod.spec.affinity
RESOURCE: affinity <Object>
DESCRIPTION:
If specified, the pod's scheduling constraints
Affinity is a group of affinity scheduling rules.
FIELDS:
nodeAffinity <Object>
Describes node affinity scheduling rules for the pod.
podAffinity <Object>
Describes pod affinity scheduling rules (e.g. co-locate this pod in the
same node, zone, etc. as some other pod(s)).
podAntiAffinity <Object>
Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod
in the same node, zone, etc. as some other pod(s)).
6. 忘掉grep,awk,cut等
关于oc命令的一个非常酷的事情是它具有格式化输出的内置功能。我们都知道-o json
或者-o yaml
,但flag -o
为您提供了许多其他可能性。
在我发现的所有这些输出选项中, go-template
和jsonpath
是最强大的输出选项:
json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...
例如,假设您想要获取特定路由(router)(docker registry router)所公开的服务(service):
# get the service being exposed by a route, only if the hostname matches my-docker-registry.example.com
$ oc get routes -o=go-template='{{range .items}}{{if eq .spec.host "my-docker-registry.example.com"}}{{.metadata.name}}{{end}}{{end}}'
docker-registry
或者您想了解路由器DC的部署策略:
# get router deployment strategy
$ oc get dc router -o=go-template='{{ .spec.strategy.type }}'
Rolling
如您所见,oc命令非常棒。我鼓励你继续玩它,因为这是OpenShift最酷的事情之一。
作者
Jorge Tudela Gonzalez de Riancho在红帽西班牙工作,担任云顾问,专门研究OpenShift和容器相关技术。
译文: