Oc equipe para o resgate

Se você é especial no OpenShift, é improvável que esta postagem revele muito a você. Mas se você está começando a dominá-lo, economizará muito tempo e nervos. Pedimos a Jorge Tudela González de Riancho, consultor de nuvem do escritório espanhol da Red Hat, que escrevesse alguns hacks para o utilitário oc .



Essa é uma equipe legal, bem pensada, poderosa, flexível e, como você verá, tem muitos recursos ocultos que valem a pena tentar.

1. Primeiras coisas primeiro: depuração


Quando não sei o que está acontecendo ou recebo uma mensagem de erro incompreensível, sempre uso o sinalizador --loglevell , que permite que o log seja stderr. Dependendo do valor desse sinalizador, é possível ver chamadas de Resto da API de retorno, o conteúdo das respostas do Resto da API ou informações ainda mais detalhadas.



$ 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]
...

Por exemplo, o nível de log 9 é muito conveniente quando você aplica um patch em um objeto OCP, porque permite ver o próprio patch (o conteúdo da solicitação da API).

Se, por exemplo, um patch alterar o rótulo de serviço para "app: hello-jorge", ficará assim:

$ 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
...

Nota Em tempos de desespero, em vez de nove, você pode dirigir vários ao mesmo tempo. A saída do comando oc não será alterada a partir disso, mas poderá ser melhor para você.

$ oc --loglevel 9999 get pod

2. su -


Sim, você entendeu corretamente. O comando oc pode ser executado em nome de outro usuário ou, usando o idioma do OCP, use a representação . Claro, com os direitos apropriados. E para isso, basta usar a bandeira --as é suficiente .

Por exemplo:

# jorge
$ oc --as=jorge get pods

A representação funciona não apenas para usuários, mas também para grupos:

# developers
$ oc --as-group=developers get pods

A representação é útil em vários casos. Por exemplo, quando você precisa verificar se o usuário pode executar uma ou outra ação ou ver o que o comando oc emite para ele. A representação também ajuda muito na confusão com funções e permissões.

3. Whoami


A equipe de oc whoami provavelmente é familiar para todos. Especialmente o sinalizador -t , que permite obter o token de mídia para o usuário / sessão atual. Mas e se você tiver um token, mas não for o proprietário?

Nesse caso, você pode efetuar login no OpenShift usando esse token e, em seguida, executar o comando oc whoami . Embora, espere, você pode descobrir imediatamente o nome do proprietário simplesmente passando o token para o comando oc whoami como o terceiro argumento sem nenhuma sinalização.

Veja:
#
$ token=$(oc whoami -t)

#
$ oc whoami $token
jorge

4. depuração oc


Como você sabe, um shell pode ser executado diretamente em um pod de corrida. Às vezes, é útil fazer uma cópia completa da configuração do pod em execução e solucionar problemas através do shell. Este é o chamado método padrão.

Agora dê uma olhada no que as opções de depuração oc permitem: você pode executar o contêiner como root ou qualquer outro usuário; você pode executá-lo no nó selecionado ou nele, não em um shell, mas em outro comando.

Nesse caso, você deve especificar o dc correto, por exemplo:
# shell pod' dc/jorge
$ oc debug dc/jorge

# , root
$ oc debug --as-root=true dc/jorge

5. oc explicar


Os objetos OpenShift / Kubernetes às vezes têm um grande número de campos. Ao procurar exemplos de definições para esses objetos, muitas vezes é necessário recorrer à documentação do OCP ou de outras fontes principais. No entanto, você também pode usar o comando oc

Este comando exibe a documentação dos recursos e seus campos, o que é muito útil ao declarar novos objetos do OCP ou nos casos em que você não tem acesso à documentação oficial do OCP.

Por exemplo, veja como obter a documentação do pod e uma descrição dos campos de afinidade:

 # obtenha ajuda no pod
 Pod de explicação $ oc
 DESCRIÇÃO:
 Pod é uma coleção de contêineres que podem ser executados em um host.  Este recurso é criado por clientes e agendado para hosts.

 CAMPOS:
   metadados <Objeto>
     Metadados do objeto padrão.  Mais informações:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata

   especificação <Object>
     Especificação do comportamento desejado do pod.  Mais informações:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status

   status <Object>
     Status mais recentemente observado do pod.  Esses dados podem não estar atualizados.
     Preenchido pelo sistema.  Somente leitura.  Mais informações:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status

   apiVersion <string>
     APIVersion define o esquema versionado dessa representação de um
     objeto  Os servidores devem converter esquemas reconhecidos nos mais recentes
     valor e pode rejeitar valores não reconhecidos.  Mais informações:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

   tipo <string>
     Kind é um valor de sequência que representa o recurso REST deste objeto
     representa.  Os servidores podem inferir isso a partir do terminal que o cliente envia
     pedidos para.  Não pode ser atualizado.  No CamelCase.  Mais informações:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

 # obter descrição do campo de afinidade
 $ oc explica pod.spec.affinity
 RECURSO: afinidade <Object>

 DESCRIÇÃO:
     Se especificado, as restrições de agendamento do pod

    Afinidade é um grupo de regras de agendamento de afinidades.

 CAMPOS:
   nodeAffinity <Object>
     Descreve as regras de agendamento de afinidade do nó para o pod.

   podAffinity <Object>
     Descreve as regras de agendamento de afinidade do pod (por exemplo, co-localiza esse pod no
     mesmo nó, zona etc.  como alguns outros pods).

   podAntiAffinity <Object>
     Descreve as regras de agendamento de anti-afinidade do pod (por exemplo, evite colocá-lo
     no mesmo nó, zona etc.  como alguns outros pods).

6. Esqueça grep, awk, cut, etc.


Outro recurso interessante do comando oc são as funções internas de formatação de saída. Todo mundo conhece as opções -o json ou -o yaml , mas o sinalizador -o tem muitas outras opções.

Os mais poderosos provavelmente são go-template e jsonpath :

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

Digamos que você queira saber qual serviço é fornecido por uma rota específica (a rota do registro do 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

Ou, digamos que você precise conhecer a estratégia de implantação do roteador dc router:

#
$ oc get dc router -o=go-template='{{ .spec.strategy.type }}'
Rolling

Como você pode ver, o oc é uma equipe incrível. Definitivamente, vale a pena brincar, pois é uma das coisas mais legais do OpenShift.

Se você quiser aprender mais sobre os recursos interessantes do OpenShift, recomendamos que você consulte o blog do Red Hat Developer - aqui você encontrará não apenas artigos de nossos desenvolvedores sobre quase qualquer tópico, mas também um enorme catálogo de literatura gratuita . E você pode atualizar nossa publicação sobre como implantar o Minishift em seu laptop e começar a viver .

Source: https://habr.com/ru/post/pt418437/


All Articles