Integração com o Kubernetes Dashboard e GitLab



O Kubernetes Dashboard é uma ferramenta fácil de usar para obter informações atualizadas sobre um cluster em funcionamento e controle mínimo sobre ele. Você começa a apreciar ainda mais quando o acesso a esses recursos é necessário não apenas pelos administradores / engenheiros do DevOps, mas também pelos que estão menos acostumados ao console e / ou não pretendem lidar com todos os meandros da interação com o kubectl e outros utilitários. Foi o que aconteceu conosco: os desenvolvedores queriam acesso rápido à interface da web do Kubernetes e, como usamos o GitLab, a solução veio naturalmente.

Por que isso?


Os desenvolvedores diretos podem estar interessados ​​em uma ferramenta como o K8s Dashboard para tarefas de depuração. Às vezes, você deseja exibir logs e recursos, às vezes, mata pods, dimensiona Deployments / StatefulSets e até entra no console do contêiner (também existem solicitações para as quais existe outra maneira, por exemplo, através do kubectl-debug ).

Além disso, há um momento psicológico para os gerentes quando eles querem olhar para o cluster - ver que "tudo é verde" e, assim, acalmar que "tudo funciona" (que, é claro, é muito relativo ... mas isso está além do escopo do artigo )

Usamos o GitLab como um sistema de IC padrão: todos os desenvolvedores o usam. Portanto, para dar acesso, era lógico integrar o Dashboard às contas no GitLab.

Observe também que estamos usando o NGINX Ingress. Se você trabalha com outras soluções de ingresso , precisará localizar de forma independente análogos de anotações para autorização.

Tentamos integração


Instalar painel


Atenção : Se você deseja repetir as etapas descritas abaixo, primeiro - para evitar operações desnecessárias - leia primeiro a próxima legenda.

Como usamos essa integração em muitas instalações, automatizamos sua instalação. As fontes necessárias para isso são publicadas em um repositório especial do GitHub . Eles são baseados em configurações YAML levemente modificadas do repositório oficial do Dashboard , bem como em um script Bash para implantação rápida.

O script instala o Dashboard em um cluster e o configura para integrar-se ao GitLab:

$ ./ctl.sh Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL Install kubernetes-dashboard to Kubernetes cluster. Mandatory arguments: -i, --install install into 'kube-system' namespace -u, --upgrade upgrade existing installation, will reuse password and host names -d, --delete remove everything, including the namespace --gitlab-url set gitlab url with schema (https://gitlab.example.com) --oauth2-id set OAUTH2_PROXY_CLIENT_ID from gitlab --oauth2-secret set OAUTH2_PROXY_CLIENT_SECRET from gitlab --dashboard-url set dashboard url without schema (dashboard.example.com) Optional arguments: -h, --help output this message 

No entanto, antes de usá-lo, você precisa ir para o GitLab: Área administrativa → Aplicativos - e adicionar um novo aplicativo para o painel futuro. Vamos chamá-lo de "painel kubernetes":



Como resultado de sua adição, o GitLab fornecerá hashes:



Eles são usados ​​como argumentos para o script. Como resultado, a instalação é a seguinte:

 $ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com 

Depois disso, verifique se tudo começou:

 $ kubectl -n kube-system get pod | egrep '(dash|oauth)' kubernetes-dashboard-76b55bc9f8-xpncp 1/1 Running 0 14s oauth2-proxy-5586ccf95c-czp2v 1/1 Running 0 14s 

Cedo ou tarde tudo começará, mas a autorização não funcionará imediatamente ! O fato é que, na imagem usada (a situação em outras imagens é semelhante), o processo de captura de redirecionamento no retorno de chamada é implementado incorretamente. Essa circunstância leva ao fato de que oauth apaga o cookie, que ele próprio (oauth) nos fornece ...

O problema é resolvido construindo sua imagem oauth com o patch.

Patch para oauth e reinstalar


Para fazer isso, use o seguinte Dockerfile:

 FROM golang:1.9-alpine3.7 WORKDIR /go/src/github.com/bitly/oauth2_proxy RUN apk --update add make git build-base curl bash ca-certificates wget \ && update-ca-certificates \ && go get -u github.com/golang/dep/cmd/dep \ && curl -sSO https://raw.githubusercontent.com/pote/gpm/v1.4.0/bin/gpm \ && chmod +x gpm \ && mv gpm /usr/local/bin RUN git clone https://github.com/bitly/oauth2_proxy.git . \ && git checkout fa2771998a98a5bfdfa3c3503757668ac4f1c8ec ADD rd.patch . RUN patch -p1 < rd.patch && ./dist.sh FROM alpine:3.7 RUN apk --update add curl bash ca-certificates && update-ca-certificates COPY --from=0 /go/src/github.com/bitly/oauth2_proxy/dist/ /bin/ EXPOSE 8080 4180 ENTRYPOINT [ "/bin/oauth2_proxy" ] CMD [ "--upstream=http://0.0.0.0:8080/", "--http-address=0.0.0.0:4180" ] 

E aqui está o próprio patch rd.patch
 diff --git a/Gopkg.lock b/Gopkg.lock index 5a3758a..1294a90 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -131,7 +131,7 @@ version = "v1.0.0" [[projects]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" packages = ["."] revision = "836bfd95fecc0f1511dd66bdbf2b5b61ab8b00b6" version = "v1.2.11" @@ -149,6 +149,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "b502c41a61115d14d6379be26b0300f65d173bdad852f0170d387ebf2d7ec173" + inputs-digest = "cfdd05348394cd0597edb858bdba5681665358a963356ed248d98f39373c33b5" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index c4005e1..422bd43 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -4,7 +4,7 @@ # [[constraint]] - name = "github.com/18F/hmacauth" + name = "github.com/mbland/hmacauth" version = "~1.0.1" [[constraint]] @@ -36,7 +36,7 @@ name = "google.golang.org/api" [[constraint]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" version = "~1.2.0" [[constraint]] diff --git a/dist.sh b/dist.sh index a00318b..92990d4 100755 --- a/dist.sh +++ b/dist.sh @@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}') sha256sum=() echo "... running tests" -./test.sh +#./test.sh -for os in windows linux darwin; do - echo "... building v$version for $os/$arch" - EXT= - if [ $os = windows ]; then - EXT=".exe" - fi - BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX) - TARGET="oauth2_proxy-$version.$os-$arch.$goversion" - FILENAME="oauth2_proxy-$version.$os-$arch$EXT" - GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ - go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1 - pushd $BUILD/$TARGET - sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)") - cd .. && tar czvf $TARGET.tar.gz $TARGET - mv $TARGET.tar.gz $DIR/dist - popd -done +os='linux' +echo "... building v$version for $os/$arch" +TARGET="oauth2_proxy-$version.$os-$arch.$goversion" +GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ + go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1 checksum_file="sha256sum.txt" cd $DIR/dist diff --git a/oauthproxy.go b/oauthproxy.go index 21e5dfc..df9101a 100644 --- a/oauthproxy.go +++ b/oauthproxy.go @@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code if redirect_url == p.SignInPath { redirect_url = "/" } - + if req.FormValue("rd") != "" { + redirect_url = req.FormValue("rd") + } t := struct { ProviderName string SignInMessage string diff --git a/watcher.go b/watcher.go index bedb9f8..4b83946 100644 --- a/watcher.go +++ b/watcher.go @@ -7,8 +7,7 @@ import ( "os" "path/filepath" "time" - - "gopkg.in/fsnotify.v1" + "gopkg.in/fsnotify/fsnotify.v1" ) func WaitForReplacement(filename string, op fsnotify.Op, 

Agora você pode criar a imagem e enviá-la para o nosso GitLab. Em seguida, em manifests/kube-dashboard-oauth2-proxy.yaml especifique o uso da imagem desejada (substitua-a por sua própria):

  image: docker.io/colemickens/oauth2_proxy:latest 

Se você tem um registro fechado por autorização - não esqueça de adicionar um segredo para obter imagens:

  imagePullSecrets: - name: gitlab-registry 

... e adicione o próprio segredo para registro:

 --- apiVersion: v1 data: .dockercfg: eyJyZWdpc3RyeS5jb21wYW55LmNvbSI6IHsKICJ1c2VybmFtZSI6ICJvYXV0aDIiLAogInBhc3N3b3JkIjogIlBBU1NXT1JEIiwKICJhdXRoIjogIkFVVEhfVE9LRU4iLAogImVtYWlsIjogIm1haWxAY29tcGFueS5jb20iCn0KfQoK = kind: Secret metadata: annotations: name: gitlab-registry namespace: kube-system type: kubernetes.io/dockercfg 

Um leitor atento verá que a linha longa acima é base64 da configuração:

 {"registry.company.com": { "username": "oauth2", "password": "PASSWORD", "auth": "AUTH_TOKEN", "email": "mail@company.com" } } 

Esses são os dados do usuário no GitLab, o código pelo qual o Kubernetes extrairá a imagem do registro.

Depois que tudo estiver pronto, você poderá remover a instalação atual do painel (funcionando incorretamente) com o comando:

 $ ./ctl.sh -d 

... e reinstale tudo:

 $ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769e… --oauth2-secret 6b79168f… --dashboard-url dashboard.example.com 

É hora de entrar no Painel e encontrar o botão de login bastante arcaico:



Depois de clicar nele, o GitLab nos encontrará, oferecendo o login em sua página familiar (é claro, se não estivéssemos pré-autorizados lá):



Entre com suas credenciais do GitLab - e tudo aconteceu:



Sobre os recursos do painel


Se você é um desenvolvedor que anteriormente não trabalhou com o Kubernetes ou, por algum motivo, nunca encontrou o Dashboard antes, ilustrarei alguns de seus recursos.

Primeiro, você pode ver que "tudo é verde":



Dados mais detalhados estão disponíveis nos pods, como variáveis ​​de ambiente, imagem desinflada, argumentos de inicialização e seu status:



Os status de implantação são visíveis:



... e outros detalhes:



... bem como a capacidade de dimensionar a implantação:



O resultado desta operação:



Entre outros recursos úteis já mencionados no começo do artigo, estão os logs de exibição:



... e a função de entrar no console do contêiner do pod selecionado:



Por exemplo, você também pode ver o limite / solicitação nos nós:



Obviamente, essas não são todas as características do painel, mas espero que a idéia geral tenha se desenvolvido.

Desvantagens da integração e painel


Na integração descrita, não há controle de acesso . Com ele, todos os usuários que têm acesso ao GitLab obtêm acesso ao Painel. Eles têm o mesmo acesso ao painel, correspondente aos direitos do próprio painel, definidos no RBAC . Obviamente, isso não é adequado para todos, mas, no nosso caso, acabou sendo suficiente.

Dos pontos negativos perceptíveis no próprio painel, observo o seguinte:

  • é impossível entrar no console do contêiner init;
  • não é possível editar Deployments e StatefulSets, embora isso possa ser corrigido no ClusterRole;
  • A compatibilidade do painel com as versões mais recentes do Kubernetes e o futuro do projeto levanta questões.

O último problema merece atenção especial.

Status e alternativas do painel


A tabela de compatibilidade do Dashboard com as versões do Kubernetes, apresentada na versão mais recente do projeto ( v1.10.1 ), não está muito feliz:



Apesar disso, existe (já adotado em janeiro) o PR # 3476 , que anuncia o suporte ao K8s 1.13. Além disso, entre as questões do projeto, você pode encontrar referências a usuários que trabalham com o painel no K8s 1.14. Por fim, as confirmações na base de código do projeto não param. Portanto (pelo menos!) O status real do projeto não é tão ruim quanto pode parecer pela primeira vez na tabela de compatibilidade oficial.

Por fim, o Dashboard tem alternativas. Entre eles estão:

  1. O K8Dash é uma interface jovem (os primeiros commits são datados de março deste ano), que já oferece bons recursos, como uma representação visual do status atual do cluster e o gerenciamento de seus objetos. Posicionado como uma "interface em tempo real", porque atualiza automaticamente os dados exibidos sem exigir uma atualização da página no navegador.
  2. O OpenShift Console é uma interface da Web do Red Hat OpenShift, que, no entanto, trará outras conquistas do projeto ao seu cluster, o que não é adequado a todos.
  3. O Kubernator é um projeto interessante criado como uma interface de nível inferior (que o Dashboard), com a capacidade de exibir todos os objetos no cluster. No entanto, tudo parece que seu desenvolvimento parou.
  4. No outro dia, Polaris anunciou um projeto que combina as funções de um painel (mostra o estado atual do cluster, mas não gerencia seus objetos) e a "validação automática de práticas recomendadas" (verifica o cluster quanto à configuração correta das implantações em execução).

Em vez de conclusões


O painel é a ferramenta padrão para os clusters do Kubernetes que servimos. Sua integração com o GitLab também se tornou parte de nossa “instalação padrão”, pois muitos desenvolvedores estão satisfeitos com as oportunidades que têm neste painel.

O Kubernetes Dashboard periodicamente tem alternativas da comunidade Open Source (e estamos felizes em considerá-las), mas, neste estágio, continuamos com esta solução.

PS


Leia também em nosso blog:



UPD De acordo com o relatório whoch, foi encontrado um erro no patch (as guias foram substituídas por espaços). O patch no artigo foi atualizado.

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


All Articles