Atividade 07 - Registry

Instalando o Harbor como registry do ambiente

helm install registry harbor \
  --repo https://helm.goharbor.io \
  -n registry --create-namespace \
  --set service.type=ClusterIP \
  --set externalURL=http://registry.<IP_DO_INGRESS>.nuvem.unicamp.br \
  --set expose.ingress.hosts.core=registry.<IP_DO_INGRESS>.nuvem.unicamp.br \
  --set expose.ingress.annotations."cert-manager\.io/cluster-issuer"=letsencrypt \
  --set harborAdminPassword="batata"

Acesse http://registry.<IP_DO_INGRESS>.nuvem.unicamp.br e logue com usuário admin e senha batata

Acesse Administração -> Configuração -> Configurações do Sistema

Altere o Prefixo para contas de automação para robot@

Acesse o dashboard para gerenciamento dos repositórios

Crie um projeto com nome curso, marque como publico e coloque 10GB de quota no projeto

Dentro do projeto, crie uma conta de robo, e efetue login no harbor pelo docker

docker login registry.<IP_DO_INGRESS>.nuvem.unicamp.br -u <usuario-robo> -p <senha>

Crie um arquivo index.html com o conteúdo:

<html>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

Utilize o seguinte Dockerfile

FROM registry.nuvem.unicamp.br/curso-kubernetes/nginx

COPY index.html /usr/share/nginx/html/index.html

Build a imagem e push para o harbor

docker build . -t registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso/webserver
docker push registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso/webserver

Crie um arquivo deploy-pelo-registry.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver
  template: 
    metadata:
      labels:
        app: webserver
    spec:
      containers:
        - name: webserver
          image: registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso/webserver
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webserver
spec:
  type: ClusterIP
  selector:
    app: webserver
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webserver
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
        - webserver.<IP_DO_INGRESS>.nuvem.unicamp.br
      secretName: webserver-tls
  rules:
    - host: webserver.<IP_DO_INGRESS>.nuvem.unicamp.br
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: webserver
                port: 
                  number: 80

Aplique o deploy:

kubectl apply -f deploy-pelo-registry.yaml

Crie outro projeto chamado curso-privado, marque como privado e coloque 10GB de quota no projeto

Dentro do projeto, crie uma conta de robo, e efetue login no harbor pelo docker

docker login registry.<IP_DO_INGRESS>.nuvem.unicamp.br -u <usuario-robo> -p <senha>

Taguei a imagem criada no novo repositorio

docker tag registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso/webserver registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso-privado/webserver
docker push registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso-privado/webserver

Crie um deploy com o mesmo conteúdo do deploy anterior, mas utilizando a imagem do novo repositorio

Adicione um arquivo secret-dockerconfig.yaml com o secret de dockerconfig com o seguinte conteudo:

apiVersion: v1
kind: Secret
metadata:
  name: registry-auth
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: <base64 do arquivo .dockerconfigjson>

Obs: O arquivo .dockerconfigjson fica em $HOME/.docker/config.json, para gerar o base64 use o seguinte comando:

cat $HOME/.docker/config.json | base64 -w 0

Alternativamente, você pode gerar o yaml desse secret utilizando o seguinte abaixo:

kubectl create secret docker-registry registry-auth \
  --docker-server=registry.<IP_DO_INGRESS>.nuvem.unicamp.br \
  --docker-username=<usuario-robo> \
  --docker-password=<senha> \
  --docker-email=<email> \
  --dry-run=client -o yaml > secret-dockerconfig.yaml

Aplique o secret:

kubectl apply -f secret-dockerconfig.yaml

Crie um arquivo deploy-pelo-registry-privado.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webserver-privado
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webserver-privado
  template: 
    metadata:
      labels:
        app: webserver-privado
    spec:
      imagePullSecrets:
        - name: registry-auth
      containers:
        - name: webserver
          image: registry.<IP_DO_INGRESS>.nuvem.unicamp.br/curso-privado/webserver
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: webserver-privado
spec:
  type: ClusterIP
  selector:
    app: webserver-privado
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: webserver-privado
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
        - webserver-privado.<IP_DO_INGRESS>.nuvem.unicamp.br
      secretName: webserver-privado-tls
  rules:
    - host: webserver-privado.<IP_DO_INGRESS>.nuvem.unicamp.br
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: webserver-privado
                port: 
                  number: 80

Aplique o deploy:

kubectl apply -f deploy-pelo-registry-privado.yaml

Projeto

Criei um projeto no seu harbor e faça um docker push da imagem da aplicação python no seu registry.