Pull to refresh
0
Red Hat
Программные решения с открытым исходным кодом

Команда oc спешит на помощь

Reading time 5 min
Views 13K
Если вы спец в OpenShift, то этот пост вряд ли откроет вам много нового. Но если вы только начинаете его осваивать, то он сэкономит вам массу времени и нервов. Мы попросили Хорхе Тудела Гонсалеса де Рианчо, облачного консультанта в испанском офисе Red Hat, написать несколько лайфхаков для утилиты oc.



Это крутая команда, она здорово продумана, она мощная, она гибкая, и у нее, как вы увидите, есть много скрытых возможностей, которые стоит попробовать.

1. Перво-наперво: отладка


Когда я не знаю, что происходит, или получаю непонятное сообщение об ошибке, я всегда использую флаг --loglevell, который включает запись лога в 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]
...

Например, loglevel 9 очень удобен, когда вы патчите OCP-объект, поскольку позволяет увидеть сам патч (содержание 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
...

Примечание. В моменты отчаяния вместо одной девятки можно вбивать сразу несколько. Вывод команды oc от этого не изменится, но, возможно, вам полегчает.

$ oc --loglevel 9999 get pod

2. su –


Да, вы правильно поняли. Команду oc можно запустить от имени другого пользователя, или, говоря на языке OCP, использовать имперсонацию. Разумеется, при наличии соответствующих прав. И для этого достаточно всего лишь использовать флаг --as.

Например:

# запускаем от имени пользователя jorge
$ oc --as=jorge get pods

Имперсонация работает не только для пользователей, но и для групп:

# запускаем от имени группы developers
$ oc --as-group=developers get pods

Имперсонация пригодится в самых разных случаях. Например, когда надо проверить, сможет ли пользователь выполнить то или иное действие, или посмотреть, что ему выдаст команда oc. Еще имперсонация очень помогает при неразберихе с ролями и разрешениями.

3. Whoami


Команда oc whoami знакома, наверное, всем. Особенно флаг -t, позволяющий получить токен носителя для текущего пользователя/сеанса. Но что делать, если у вас есть токен, но вы не его владелец?

В этом случае можно войти в OpenShift с помощью этого токена, а затем выполнить команду oc whoami. Хотя, подождите, можно же сразу узнать имя владельца, просто передав токен команде oc whoami третьим аргументом без всяких флагов.

Смотрите:
# сохраняем токен
$ token=$(oc whoami -t)

# получаем имя владельца токена
$ oc whoami $token
jorge

4. oc debug


Как известно, shell можно запустить прямо в работающем pod'е. Иногда бывает полезно сделать полную копию конфигурации запущенного pod'а и устранять неполадки через shell. Это так называемый метод по умолчанию.

А теперь взгляните, что позволяют сделать опции oc debug: можно запустить контейнер от имени root или любого другого пользователя; можно запустить его на выбранном узле или можно запустить в нем не shell, а другую команду.

При этом надо указывать верный dc, например:
# получаем shell внутри pod’а dc/jorge
$ oc debug dc/jorge

# то же самое, но как root
$ oc debug --as-root=true dc/jorge

5. oc explain


В объектах OpenShift/Kubernetes иногда бывает огромное множество полей. В поисках примеров определений таких объектов часто приходится обращаться к документации по OCP или другим первоисточникам. Однако с тем же успехом можно использовать команду oc explain.

Эта команда выводит документацию по ресурсам и их полям, что бывает очень полезно при декларировании новых объектов OCP или в тех случаях, когда у вас нет доступа к официальной документации OCP.

Например, вот как можно получить документацию по pod’ам и описание affinity-полей:

# получаем справку по pod’у
$ 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

# получаем описание полей affinity
$ 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 знают все, но у флага -o есть и множество других опций.

Самые мощные, возможно, – это go-template и jsonpath:

json|yaml|wide|name|custom-columns=...|custom-columns-file=...|go-template=...|go-template-file=...|jsonpath=...|jsonpath-file=...

Скажем, вы хотите узнать, какой сервис, предоставляется определенным маршрутом (маршрутом docker-реестра):

# запросим сервисы, предоставляемые маршрутами, но только для узла с именем 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

Или, допустим, нужно узнать стратегию развертывания маршрутизатора router dc:

# запросим стратегию развертывания маршрутизатора
$ oc get dc router -o=go-template='{{ .spec.strategy.type }}'
Rolling

Как видите, oc – это удивительная команда. С ней определенно стоит поиграться, поскольку это одна из самых крутых вещей в OpenShift.

Если вы хотите узнать больше про интересные возможности OpenShift, рекомендуем заглянуть в наш блог Red Hat Developer – здесь вас ждут не только статьи от наших разработчиков практически на любую тему, но и огромный каталог бесплатной литературы. А еще можно освежить в памяти наш пост о том, как развернуть Minishift на своем ноутбуке и начать жить.
Tags:
Hubs:
+5
Comments 2
Comments Comments 2

Articles

Information

Website
www.redhat.com
Registered
Founded
Employees
5,001–10,000 employees
Location
США