archives

Aprenda a usar o EFS Provisioner em um Cluster K8S EC2/RKE.


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Veio a Demanda!

A ideia é instalar um EFS Provisioner no cluster para poder subir APPS que montam o mesmo volume em diferentes PODs.

Então ComoFaz?

Crie o arquivo instalaefsprovisioner.yaml

vim aplica.yaml

Insira o conteúdo abaixo

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: efs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-efs-provisioner
subjects:
  - kind: ServiceAccount
    name: efs-provisioner
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: efs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-efs-provisioner
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-efs-provisioner
subjects:
  - kind: ServiceAccount
    name: efs-provisioner
    namespace: kube-system
roleRef:
  kind: Role
  name: leader-locking-efs-provisioner
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: efs-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: efs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: efs-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: efs-provisioner
    spec:
      serviceAccount: efs-provisioner
      containers:
        - name: efs-provisioner
          image: quay.io/external_storage/efs-provisioner:latest
          env:
            - name: FILE_SYSTEM_ID
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: file.system.id
            - name: AWS_REGION
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: aws.region
            - name: DNS_NAME
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: dns.name
                  optional: true
            - name: PROVISIONER_NAME
              valueFrom:
                configMapKeyRef:
                  name: efs-provisioner
                  key: provisioner.name
          volumeMounts:
            - name: pv-volume
              mountPath: /persistentvolumes
      volumes:
        - name: pv-volume
          nfs:
            server: fs-<ID DO SEU EFS>.efs.<REGIAO AWS>.amazonaws.com
            path: /
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: aws-efs
provisioner: nativetrail.io/aws-efs
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: efs-provisioner
data:
  file.system.id: fs-<ID DO SEU EFS>
  aws.region: <REGIAO AWS>
  provisioner.name: nativetrail.io/aws-efs
  dns.name: ""

Ajuste o ID do seu EFS e região da AWS no manifesto acima, e prestenção, tem que o usar o namespace kube-system pois ele é especificado nas roles e serviceaccount, se instalar o deployment em outro namespace não vai funcionar.

kubectl apply -f instalaefsprovisioner.yaml -n kube-system

Pronto, vamos verificar

kubectl get sc

Saída esperada

NAME                PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
aws-efs             nativetrail.io/aws-efs   Delete          Immediate           false                  43m
aws-ebs (default)   ebs.csi.aws.com          Delete          Immediate           false                  3d16h

agora vamos testar, crie o manifesto valida-pod-efs.ym com o conteúdo abaixo

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: valida-aws-efs
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: aws-efs
  resources:
    requests:
      storage: 1Gi

aplique

kubectl apply -f pod-efs.yaml

saída

persistentvolumeclaim/valida-aws-efs created

vamos ver

kubectl get pvc valida-aws-efs

saída

NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
valida-aws-efs   Bound    pvc-c524234f-4b07-4248-b328-c6c164dddbc2   1Gi        RWX            aws-efs        3m42s

agora com mais detalhes

kubectl describe pvc valida-aws-efs

saída

Name:          valida-aws-efs
Namespace:     default
StorageClass:  aws-efs
Status:        Bound
Volume:        pvc-c524234f-4b07-4248-b328-c6c164dddbc2
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: nativetrail.io/aws-efs
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       <none>
Events:
  Type    Reason                 Age                    From                                                                                   Message
  ----    ------                 ----                   ----                                                                                   -------
  Normal  Provisioning           3m49s                  nativetrail.io/aws-efs_efs-provisioner-644f9f8c8c-n6n48_be97e87c-7e5b-4b42-8756-2adb23a5a105  External provisioner is provisioning volume for claim "default/valida-aws-efs"
  Normal  ProvisioningSucceeded  3m49s                  nativetrail.io/aws-efs_efs-provisioner-644f9f8c8c-n6n48_be97e87c-7e5b-4b42-8756-2adb23a5a105  Successfully provisioned volume pvc-c524234f-4b07-4248-b328-c6c164dddbc2

Perfeito, tudo funcionando, agora é só usar!

:)

refs


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a instalar o LOKI da GrafanaLabs para centralizar Logs do K8S.


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Demanda!

A ideia é instalar um Loki no cluster K8S e começar a centralizar e consumir os logs via dashboard do grafana.

Por que o Loki?

O Loki é leve – em resumo esse é o maior e melhor motivo para usar ele.

Comparando com outras STACKS, ele nao leva 1/3 ou 2/3 do seu cluster só para centralizar logs.

Você acompanha os logs pelo Grafana Dashboard, simples e direto.

Além disso o projeto tem 14 mil estrelas no GitHub e mais de 400 contribuidores :)

Conheça mais do projeto, dá um chance vai :)

Antes de começar

Estou partindo do pressuposto de que você não tem o grafana instalado!

Precisa ter o Helm instalado e um cluster k8s funcional.

Então ComoFaz?

adicione o repositorio e atualize os índices

helm repo add grafana https://grafana.github.io/helm-charts helm repo update

instale o loki

helm upgrade —install loki —namespace=loki grafana/loki alertmanager.persistentVolume.enabled=true

instale o grafana

helm install loki-grafana grafana/grafana

pegue a senha de admin do grafana

kubectl get secret —namespace loki-grafana -o jsonpath=“{.data.admin-password}” | base64 —decode ; echo

crie um port-forward para acessar o grafana

kubectl port-forward —namespace service/loki-grafana 3000:80

acesse o grafana

http://localhost:3000

adicione o datasource conforme a doc abaixo

Pronto, divirta-se!

Refs


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a instalar o novíssimo Rancher 2.6 em modo HA.


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Demanda!

A ideia é instalar um Rancher em HA, cluster de 3 nodes, usando instâncias AWS EC2.

ComoFaz?

antes de começar

Confere aí :)

  1. Tenha o Kubectl instalado
  2. Tenha o RKE instalado
  3. Tenha o Helm instalado
  4. Tenha Conta na AWS
  5. Internet é de bom tom :)

instâncias ec2

Vamos lá!

  1. crie um chave ssh no ec2
  2. crie 3 instâncias EC2 em sua conta AWS com essa chave ssh
  3. crie 2 target groups rancher-80 e rancher-443 apontando para as máquinas do cluster
  4. crie o load balancer NLB com dois listeners apontando para os target groups rancher-80 e rancher-443
  5. crie uma entrada de dns rancher.seudominio.tld apontando para o CNAME do Load Balancer
  6. crie um security group para liberar acesso a porta 80 e 443 as máquinas do cluster
  7. crie um security group para que voce possa instalar o cluster a partir do seu IP via rke (all ports).

preparando instâncias

instale docker nas 3 maquinas

curl https://releases.rancher.com/install-docker/20.10.sh | sh

habilite e inicie

systemctl enable docker && systemctl start docker

coloque o ubuntu no grupo docker

gpasswd -a ubuntu docker

preparando e instalando o cluster (da sua máquina)

criando configuracao

rke config

ele vai te fazer umas perguntinhas, cadastre apenas 1 node para facilitar, eu usei 1.1.1.1 como exemplo, aponte o local da sua chave ssh, a mesma que usou nos EC2.

[+] Cluster Level SSH Private Key Path [~/.ssh/id_rsa]:
[+] Number of Hosts [1]:
[+] SSH Address of host (1) [none]: 1.1.1.1
[+] SSH Port of host (1) [22]:
[+] SSH Private Key Path of host (1.1.1.1) [none]:
[-] You have entered empty SSH key path, trying fetch from SSH key parameter
[+] SSH Private Key of host (1.1.1.1) [none]:
[-] You have entered empty SSH key, defaulting to cluster level SSH key: ~/.ssh/id_rsa
[+] SSH User of host (1.1.1.1) [ubuntu]:
[+] Is host (1.1.1.1) a Control Plane host (y/n)? [y]: y
[+] Is host (1.1.1.1) a Worker host (y/n)? [n]: y
[+] Is host (1.1.1.1) an etcd host (y/n)? [n]: y
[+] Override Hostname of host (1.1.1.1) [none]:
[+] Internal IP of host (1.1.1.1) [none]:
[+] Docker socket path on host (1.1.1.1) [/var/run/docker.sock]:
[+] Network Plugin Type (flannel, calico, weave, canal, aci) [canal]:
[+] Authentication Strategy [x509]:
[+] Authorization Mode (rbac, none) [rbac]:
[+] Kubernetes Docker image [rancher/hyperkube:v1.21.5-rancher1]:
[+] Cluster domain [cluster.local]:
[+] Service Cluster IP Range [10.43.0.0/16]:
[+] Enable PodSecurityPolicy [n]:
[+] Cluster Network CIDR [10.42.0.0/16]:
[+] Cluster DNS Service IP [10.43.0.10]:
[+] Add addon manifest URLs or YAML files [no]:

abra o arquivo e coloque os demais nodos, não se esqueça de cadastrar o ip privado também, depois que finalizar com os nodos, personalize o que for necessário para seu ambiente k8s, o rke é beeem flexível quanto a isso, além de ser o instalador de k8s mais fácil que eu conheço.

nodes:
- address: 1.1.1.1
  port: "22"
  internal_address: "172.31.1.1"
  role:
  - controlplane
  - worker
  - etcd
  hostname_override: "rancher_a"
  user: ubuntu
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 2.2.2.2
  port: "22"
  internal_address: "172.31.1.2"
  role:
  - controlplane
  - worker
  - etcd
  hostname_override: "rancher_b"
  user: ubuntu
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
- address: 3.3.3.3
  port: "22"
  internal_address: "172.31.1.3"
  role:
  - controlplane
  - worker
  - etcd
  hostname_override: "rancher_c"
  user: ubuntu
  docker_socket: /var/run/docker.sock
  ssh_key: ""
  ssh_key_path: ~/.ssh/id_rsa
  ssh_cert: ""
  ssh_cert_path: ""
  labels: {}
  taints: []
services:
  etcd:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
    external_urls: []
    ca_cert: ""
    cert: ""
    key: ""
    path: ""
    uid: 0
    gid: 0
    snapshot: null
    retention: ""
    creation: ""
    backup_config: null
  kube-api:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
    service_cluster_ip_range: 10.43.0.0/16
    service_node_port_range: ""
    pod_security_policy: false
    always_pull_images: false
    secrets_encryption_config: null
    audit_log: null
    admission_configuration: null
    event_rate_limit: null
  kube-controller:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
    cluster_cidr: 10.42.0.0/16
    service_cluster_ip_range: 10.43.0.0/16
  scheduler:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
  kubelet:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
    cluster_domain: cluster.local
    infra_container_image: ""
    cluster_dns_server: 10.43.0.10
    fail_swap_on: false
    generate_serving_certificate: false
  kubeproxy:
    image: ""
    extra_args: {}
    extra_binds: []
    extra_env: []
    win_extra_args: {}
    win_extra_binds: []
    win_extra_env: []
network:
  plugin: canal
  options: {}
  mtu: 0
  node_selector: {}
  update_strategy: null
  tolerations: []
authentication:
  strategy: x509
  sans: []
  webhook: null
addons: ""
addons_include: []
system_images:
  etcd: rancher/mirrored-coreos-etcd:v3.4.16-rancher1
  alpine: rancher/rke-tools:v0.1.78
  nginx_proxy: rancher/rke-tools:v0.1.78
  cert_downloader: rancher/rke-tools:v0.1.78
  kubernetes_services_sidecar: rancher/rke-tools:v0.1.78
  kubedns: rancher/mirrored-k8s-dns-kube-dns:1.17.4
  dnsmasq: rancher/mirrored-k8s-dns-dnsmasq-nanny:1.17.4
  kubedns_sidecar: rancher/mirrored-k8s-dns-sidecar:1.17.4
  kubedns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.3
  coredns: rancher/mirrored-coredns-coredns:1.8.4
  coredns_autoscaler: rancher/mirrored-cluster-proportional-autoscaler:1.8.3
  nodelocal: rancher/mirrored-k8s-dns-node-cache:1.18.0
  kubernetes: rancher/hyperkube:v1.21.5-rancher1
  flannel: rancher/mirrored-coreos-flannel:v0.14.0
  flannel_cni: rancher/flannel-cni:v0.3.0-rancher6
  calico_node: rancher/mirrored-calico-node:v3.19.2
  calico_cni: rancher/mirrored-calico-cni:v3.19.2
  calico_controllers: rancher/mirrored-calico-kube-controllers:v3.19.2
  calico_ctl: rancher/mirrored-calico-ctl:v3.19.2
  calico_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.19.2
  canal_node: rancher/mirrored-calico-node:v3.19.2
  canal_cni: rancher/mirrored-calico-cni:v3.19.2
  canal_controllers: rancher/mirrored-calico-kube-controllers:v3.19.2
  canal_flannel: rancher/mirrored-coreos-flannel:v0.14.0
  canal_flexvol: rancher/mirrored-calico-pod2daemon-flexvol:v3.19.2
  weave_node: weaveworks/weave-kube:2.8.1
  weave_cni: weaveworks/weave-npc:2.8.1
  pod_infra_container: rancher/mirrored-pause:3.4.1
  ingress: rancher/nginx-ingress-controller:nginx-0.48.1-rancher1
  ingress_backend: rancher/mirrored-nginx-ingress-controller-defaultbackend:1.5-rancher1
  ingress_webhook: rancher/mirrored-jettech-kube-webhook-certgen:v1.5.1
  metrics_server: rancher/mirrored-metrics-server:v0.5.0
  windows_pod_infra_container: rancher/kubelet-pause:v0.1.6
  aci_cni_deploy_container: noiro/cnideploy:5.1.1.0.1ae238a
  aci_host_container: noiro/aci-containers-host:5.1.1.0.1ae238a
  aci_opflex_container: noiro/opflex:5.1.1.0.1ae238a
  aci_mcast_container: noiro/opflex:5.1.1.0.1ae238a
  aci_ovs_container: noiro/openvswitch:5.1.1.0.1ae238a
  aci_controller_container: noiro/aci-containers-controller:5.1.1.0.1ae238a
  aci_gbp_server_container: noiro/gbp-server:5.1.1.0.1ae238a
  aci_opflex_server_container: noiro/opflex-server:5.1.1.0.1ae238a
ssh_key_path: ~/.ssh/id_rsa
ssh_cert_path: ""
ssh_agent_auth: false
authorization:
  mode: rbac
  options: {}
ignore_docker_version: null
enable_cri_dockerd: null
kubernetes_version: ""
private_registries: []
ingress:
  provider: ""
  options: {}
  node_selector: {}
  extra_args: {}
  dns_policy: ""
  extra_envs: []
  extra_volumes: []
  extra_volume_mounts: []
  update_strategy: null
  http_port: 0
  https_port: 0
  network_mode: ""
  tolerations: []
  default_backend: null
  default_http_backend_priority_class_name: ""
  nginx_ingress_controller_priority_class_name: ""
cluster_name: ""
cloud_provider:
  name: ""
prefix_path: ""
win_prefix_path: ""
addon_job_timeout: 0
bastion_host:
  address: ""
  port: ""
  user: ""
  ssh_key: ""
  ssh_key_path: ""
  ssh_cert: ""
  ssh_cert_path: ""
  ignore_proxy_env_vars: false
monitoring:
  provider: ""
  options: {}
  node_selector: {}
  update_strategy: null
  replicas: null
  tolerations: []
  metrics_server_priority_class_name: ""
restore:
  restore: false
  snapshot_name: ""
rotate_encryption_key: false
dns: null

depois de cadastrar os nodos, vamos começar o provisionamento

rke up —config cluster.yaml

após instalar verá a seguinte mensagem ( se tudo der certo )

INFO[0255] Finished building Kubernetes cluster successfully

configure o kubectl

export KUBECONFIG=kubeconfigcluster.yml

verifique se o cluster está funcionando

kubctl get nodes

saída exemplo

NAME             STATUS   ROLES                      AGE   VERSION
54.225.184.xxx   Ready    controlplane,etcd,worker   12m   v1.21.5
54.243.65.xxx    Ready    controlplane,etcd,worker   12m   v1.21.5
72.44.32.xxx     Ready    controlplane,etcd,worker   12m   v1.21.5

cluster instalado, agora verifique a saúde de seu cluster

kubectl get pods —all-namespaces

saída exemplo

NAMESPACE       NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx   default-http-backend-6977475d9b-z64cj      1/1     Running     0          17m
ingress-nginx   nginx-ingress-controller-h4c67             1/1     Running     0          17m
ingress-nginx   nginx-ingress-controller-kjd8r             1/1     Running     0          17m
ingress-nginx   nginx-ingress-controller-q4lp2             1/1     Running     0          17m
kube-system     calico-kube-controllers-7d5d95c8c9-mcfj6   1/1     Running     0          18m
kube-system     canal-lsbkv                                2/2     Running     0          18m
kube-system     canal-lwtq9                                2/2     Running     0          18m
kube-system     canal-wm7c8                                2/2     Running     0          18m
kube-system     coredns-55b58f978-jnfsq                    1/1     Running     0          17m
kube-system     coredns-55b58f978-wr4w7                    1/1     Running     0          18m
kube-system     coredns-autoscaler-76f8869cc9-lz44p        1/1     Running     0          18m
kube-system     metrics-server-55fdd84cd4-rjk7w            1/1     Running     0          18m
kube-system     rke-coredns-addon-deploy-job-th472         0/1     Completed   0          18m
kube-system     rke-ingress-controller-deploy-job-59cm4    0/1     Completed   0          17m
kube-system     rke-metrics-addon-deploy-job-94b8t         0/1     Completed   0          18m
kube-system     rke-network-plugin-deploy-job-q5nts        0/1     Completed   0          18m

aparentemente tudo bem :)

preparando e instalando o cert-manager neste cluster (sua máquina)

instale os crds do cert-manager

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.1/cert-manager.crds.yaml

adicione o repo e atualize o índices

helm repo add jetstack https://charts.jetstack.io. helm repo update

crie o namespace

kubectl create namespace cert-manager

instale o cert-mamanger

helm install cert-manager jetstack/cert-manager \ —namespace cert-manager \ —create-namespace \ —version v1.5.1

crie o cluster issuer, sem isso ele não gera os certs via lets

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  namespace: cert-manager
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: certmanager@nativetrail.io
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class: nginx

aplique o issuer

kubectl apply -f issuer.yml

saída esperada

clusterissuer.cert-manager.io/letsencrypt-prod created

verifique se está ok

kubectl get clusterissuer

saída esperada

NAME READY AGE letsencrypt-prod True 48s

se estiver mostrando “True” deu certo!

preparando e instalando o rancher neste cluster (na sua máquina)

adicione o repo e atualize os índices

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update

crie o namespace cattle-system

kubectl create namespace cattle-system

instale o rancher

helm install rancher rancher-latest/rancher \ —namespace cattle-system \ —set hostname=kloud.gr1d.io \ —set replicas=3 \ —set ingress.tls.source=letsEncrypt \ —set letsEncrypt.email=certmanager@nativetrail.io

verifique

kubectl get pods -n cattle-system

saída esperada, estará criando na primeira vez que rodar o comando

NAME                       READY   STATUS              RESTARTS   AGE
rancher-58b56d54df-7mv7d   0/1     ContainerCreating   0          29s
rancher-58b56d54df-csmpl   0/1     ContainerCreating   0          29s
rancher-58b56d54df-pkpz6   0/1     ContainerCreating   0          29s

aguarde e verifique novamente, use o mesmo comando

kubectl get pods -n cattle-system

saída

NAME                       READY   STATUS    RESTARTS   AGE
rancher-58b56d54df-7mv7d   0/1     Running   0          41s
rancher-58b56d54df-csmpl   0/1     Running   0          41s
rancher-58b56d54df-pkpz6   0/1     Running   0          41s

rancher instalado e rodando!

pós instalação

observe a saída do comando helm, ele vai te dizer como pegar a senha gerada para o primeiro acesso, depois disso, acesse o rancher via web através da URL definida e siga as os procedimentos para trocar a senha e iniciar o uso do seu rancher.

refs

:)


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Conheça algumas ferramentas open source para APM para seus projetos


Estude e avalie essas boas ferramentas que você pode usar em seu projeto e infraestrutura.

Apache Skywalking

Site do projeto: https://skywalking.apache.org/

GitHub do projeto: 14.7k stars e 250+ contributors

Recomendado para APPs rodando em Cloud e API.

Se você está imerso no universo de API, microserviços, kubernetes e cloud native esse é o projeto para você, ele foi desenhado para Cloud e API sendo hoje um dos maiores, mais respeitados e ativos do GitHub.

Há quem diga que é o melhor nesse segmento hoje.

PinPoint

Site do projeto: https://github.com/naver/pinpoint

GitHub 10.8k stars e 90+ contributors

Acho que o PinPoint é o preferido da galera de JAVA em 2021, é bem conhecido e vastamente utilizado.

Recomendado para APPs JAVA ou Python

Baseado no Google's Dapper.

StageMonitor

Site do projeto https://www.stagemonitor.org

GitHub 1.6k stars e 24+ contributors

Recomendado para JAVA, tem compatibilidade e integração com OpenTracing.

Scouter

Site do projeto https://github.com/scouter-project/scouter

GitHub 1.8k starts e 40+ contributors.

Inspirado no New Relic e APP Dynamics, é uma aplicação modular e bastante extensível.

Oferece interações nativas com Telegraf e Zipkin.

Tem agente nativo para java, linux, unix e até windows.

Monitora nativamente (usando telegraph)

  • Redis
  • Nginx
  • Apache HTTPd
  • HAProxy
  • Kafka
  • MySQL
  • MongoDB
  • RabbitMQ
  • ElasticSearch
  • Kubernetes
  • Mesos

Instrumenta nativamente:

  • C#
  • GO
  • Java
  • JavaScript
  • Ruby
  • Scala
  • PHP

Instrumentação extendida via código da comunidade

  • C++
  • Python
  • Clojure
  • Elixir
  • Lua

Veja dados completos da instrumentação

APP Metrics

Site do projeto https://www.app-metrics.io/

GitHub 2k starts e 40+ contributors

Recomendado para APPs .Net.

Se o seu negócio é .NET o APP Metrics é a ferramenta pra você e seu time.

InspectIT Ocelot

Site do projeto: https://github.com/inspectIT/inspectit-ocelot

GitHub 158 starts e 25+ contributors

Esse é um projeto novo, o caçula da turma, mas tem muito potencial.

Ele tem uma pegada na fácil configuração, aliás zero configuração e uma boa oferta nativa de métricas.

E isso, bons estudos!

[s]


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a se conectar em um serviço K8S sem exposição!


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Demanda!

Preciso me conectar em um Mongo no cluster sem expor ele para o mundo.

ComoFaz?

Vamos usar o port-forward, veja como a sintaxe é simples

kubectl port-forward nomedopod portalocal:portalcluster -n seu_namespace

Exemplo!

kubectl port-forward mongodb-replicaset-0 28015:27017 -n seu_namespace

E como eu acho a porta certa

kubectl get pod mongodb-replicaset-0 —template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{”\n”}}' -n seu_namespace

Prontinho!

Refs


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a pegar imagens de registry ECR privado em seu cluster K8S.


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Demanda!

Precisamos cadastrar um secret para pegar imagens de um ECR privado

ComoFaz?

Primeiro vamos gerar o TOKEN, você precisa do AWS CLI para isso,

aws configure

depois de configurado gere o TOKEN

aws ecr get-login-password —region us-east-1

agora vamos no K8S criar o secret

kubectl create secret docker-registry ecr-nativetrail \ —docker-server=ID.dkr.ecr.us-east-1.amazonaws.com/ \ —docker-username=AWS \ —docker-password=SEUTOKENGERADOVIAAWSCLI \ —namespace=SEUNAMESPACE

verifique

kubectl get secrets -n SEU_NAMESPACE|grep ecr

saída

ecr-nativetrail kubernetes.io/dockerconfigjson 1 15h

Nao se esqueça de setar o secret no seu manifesto de deployment, dentro de “spec”

      spec:
        imagePullSecrets:
        - name: ecr-nativetrail

Exemplo

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: app-example
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: app-example
    template:
      metadata:
        labels:
          app: nativetrail
      spec:
        imagePullSecrets:
        - name: ecr-nativetrail
        containers:
        - name: app-examp;e
          image:  ID.dkr.ecr.us-east-1.amazonaws.com/app:latest

Prontinho!


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a usar o storage EBS como SC em seu cluster EC2!


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente de algo que eu acabei de fazer.

Eu – quase sempre – volto para detalhar mais cada passo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)

Demanda

Configurar um storageclass EBS em um cluster K8S rodando via EC2.

ComoFaz?

crie o arquivo aws-ebs-secrets.yaml

vim ws-ebs-secrets.yaml

insira o conteúdo abaixo, e ajuste suas credenciais

apiVersion: v1
kind: Secret
metadata:
  name: aws-secret
  namespace: kube-system
stringData:
  key_id: "SUA_ACCESS_KEY"
  access_key: "SUA_SECRET_KEY"

aplique o manifesto

kubectl apply -f aws-ebs-secrets.yaml

agora instale o driver ebs

kubectl apply -k “github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.4”

saída esperada

serviceaccount/ebs-csi-controller-sa created
serviceaccount/ebs-csi-node-sa created
clusterrole.rbac.authorization.k8s.io/ebs-csi-node-role created
clusterrole.rbac.authorization.k8s.io/ebs-external-attacher-role created
clusterrole.rbac.authorization.k8s.io/ebs-external-provisioner-role created
clusterrole.rbac.authorization.k8s.io/ebs-external-resizer-role created
clusterrole.rbac.authorization.k8s.io/ebs-external-snapshotter-role created
clusterrolebinding.rbac.authorization.k8s.io/ebs-csi-attacher-binding created
clusterrolebinding.rbac.authorization.k8s.io/ebs-csi-node-getter-binding created
clusterrolebinding.rbac.authorization.k8s.io/ebs-csi-provisioner-binding created
clusterrolebinding.rbac.authorization.k8s.io/ebs-csi-resizer-binding created
clusterrolebinding.rbac.authorization.k8s.io/ebs-csi-snapshotter-binding created
deployment.apps/ebs-csi-controller created
poddisruptionbudget.policy/ebs-csi-controller created
daemonset.apps/ebs-csi-node created
csidriver.storage.k8s.io/ebs.csi.aws.com created

verifique se tá tudo bem

kubectl get pods -n kube-system|grep ebs

saída esperada

ebs-csi-controller-7c486f7676-826ph        6/6     Running     0          110s
ebs-csi-controller-7c486f7676-l5wsg        6/6     Running     0          110s
ebs-csi-node-5q7lk                         3/3     Running     0          108s
ebs-csi-node-cxv4p                         3/3     Running     0          109s
ebs-csi-node-fskfw                         3/3     Running     0          108s

tá tudo bem, agora crie o manifesto do storageclass

vim ebs-storageclass.yaml

insira o conteúdo abaixo

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ebs-storageclass
parameters:
  type: gp2
provisioner: ebs.csi.aws.com
volumeBindingMode: Immediate

aplique o manifesto

kubectl apply -f ebs-storageclass.yaml

verifique se criou o sc

kubectl get sc

saída esperada

NAME                         PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
ebs-storageclass             ebs.csi.aws.com   Delete          Immediate   false                  3m24s

caso queira, defina este sc como default

kubectl patch storageclass ebs-storageclass -p '{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:“true”}}}

prontinho! :)


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a criar um cluster EKS básico via Terraform! Só vem :“)

O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam.

Geralmente eu volto para detalhar mais cada passo – com o devido tempo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)


requisitos

Tenha kubeclt e helm instalados.

Tenha o awscli e aws-iam-authenticator instalados.

Esteja logado com aws-cli na conta correta com permissoes para criar o EKS.

Quais permissões?

crie um diretório para seu projeto

mkdir -p terraform/eks/meucluster cd terraform/eks/meucluster

crie o arquivo para definir as versões dos módulos

edite o arquiovo

vim defaults.tf

insira o conteúdo abaixo para definir der forma clara as versões que vamos usar

terraform {
  required_version = ">= 0.13.1"

  required_providers {
    aws        = ">= 3.62.0"
    local      = ">= 2.1.0"
    kubernetes = ">= 2.5.0"
    cloudinit  = ">= 2.2.0"
    http = {
      source  = "terraform-aws-modules/http"
      version = ">= 2.4.1"
    }
  }
}

provider "aws" {
  region  = "us-east-1"
}

data "aws_caller_identity" "current" {} # used for accesing Account ID and ARN

valide

terraform validate

saída esperada

Success! The configuration is valid.

crie o arquivo com as variáveis que vão configurar a vpc e o eks

crie o arquivo

vim configs.tfvars

coloque o conteúdo

## configuracoes para vpc

cluster_name            = "hackathon"
name_prefix             = "hackathon"
main_network_block      = "10.0.0.0/16"
subnet_prefix_extension = 4
zone_offset             = 8

## configuracoes para eks

eks_cluster_version = "1.21"

node_group_default_disk_size = 30
node_group_default_ami_type = "AL2_x86_64"
    
node_group_desired_capacity = 1
node_group_max_capacity = 8
node_group_min_capacity = 1
node_group_max_unavailable_percentage = 50
    
node_group_capacity_type = "ON_DEMAND"
node_group_instance_type = "t3.large"

valide

terraform validate

saída esperada

Success! The configuration is valid.

crie o manifesto que vai criar e configurar a VPC

vamos criar agora a vpc

vim vpc.tl

insira o conteúdo abaixo

# Declarando variaveis

variable "cluster_name" {
  type        = string
  description = "Nome do Cluster"
}

variable "name_prefix" {
  type        = string
  description = "Prefixo que será utilizado nos nomes dos objetos de infraestrutura criados na AWS"
}

variable "main_network_block" {
  type        = string
  description = "Bloco CIDR base que sera usado em sua VPC"
}

variable "subnet_prefix_extension" {
  type        = number
  description = "Bits de extensao do seu bloco CIDR que sera usado para calcular as suberedes"
}

variable "zone_offset" {
  type        = number
  description = "Offset de extensao dos bits CIDR para calculo e subnets, para evitar colisoes entre redes publicas e privadas"
}

# Fixando o IP do Nat Gateway

resource "aws_eip" "nat_gw_elastic_ip" {
  vpc = true
  tags = {
    Name            = "${var.cluster_name}-nat-eip"
  }
}

# Criando a VPC usando configs do modulo oficial AWS

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"

  name = "${var.name_prefix}-vpc"
  cidr = var.main_network_block
  azs  = [ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d" ]

  private_subnets      = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24", "10.0.4.0/24" ]
  public_subnets       = ["10.0.5.0/24", "10.0.6.0/24", "10.0.7.0/24", "10.0.8.0/24" ]

  enable_nat_gateway     = true
  single_nat_gateway     = true
  one_nat_gateway_per_az = false
  enable_dns_hostnames   = true
  reuse_nat_ips          = true
  external_nat_ip_ids    = [aws_eip.nat_gw_elastic_ip.id]

  # Adicionando tags necessarias para o EKS

  tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
  }
  public_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/elb"                    = "1"
  }
  private_subnet_tags = {
    "kubernetes.io/cluster/${var.cluster_name}" = "shared"
    "kubernetes.io/role/internal-elb"           = "1"
  }
}

valide

terraform validate

saída esperada

Success! The configuration is valid.

crie o manifesto que vai configurar o eks

crie o arquivo

vim eks.tf

coloque o conteúdo

# declarando variáveis

variable "eks_cluster_version" {
  type        = string
}

variable "node_group_default_disk_size" {
  type        = number
}

variable "node_group_default_ami_type" {
  type        = string
}

variable "node_group_desired_capacity" {
  type        = number
}

variable "node_group_max_capacity" {
  type        = number
}

variable "node_group_min_capacity" {
  type        = number
}

variable "node_group_max_unavailable_percentage" {
  type        = number
}

variable "node_group_capacity_type" {
  type        = string
}

variable "node_group_instance_type" {
  type        = string
}


# dados para configuracao

data "aws_eks_cluster" "eks" {
  name = module.eks.cluster_id
}

data "aws_eks_cluster_auth" "eks" {
  name = module.eks.cluster_id
}

# configurando provider kubernetes

provider "kubernetes" {
  host                   = data.aws_eks_cluster.eks.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.eks.certificate_authority[0].data)
  token                  = data.aws_eks_cluster_auth.eks.token
}

# configurando eks

module "eks" {
  source          = "terraform-aws-modules/eks/aws"

  cluster_version = var.eks_cluster_version
  cluster_name    = "${var.cluster_name}"

  subnets = module.vpc.private_subnets
  vpc_id  = module.vpc.vpc_id

 node_groups_defaults = {
    ami_type  = var.node_group_default_ami_type
    disk_size = var.node_group_default_disk_size
  }

  node_groups = {
    hacka_node_group = {
      desired_capacity = var.node_group_desired_capacity
      max_capacity     = var.node_group_max_capacity
      min_capacity     = var.node_group_min_capacity

      instance_types = [ var.node_group_instance_type ]
      capacity_type  = var.node_group_capacity_type
      update_config = {
        max_unavailable_percentage = var.node_group_max_unavailable_percentage
      }
    }
  }

}

valide

terraform validate

saída esperada

Success! The configuration is valid.

crie o plano de instalação

Use o arquivo configs.tfvars para construir o plano

terraform plan -out=plan -var-file=configs.tfvars;

saída esperada

.
.
.

Plan: 54 to add, 0 to change, 0 to destroy.

aplique o plano criado

vamos aplicar agora

terraform apply plan

saída esperada

.
.
.
Apply complete! Resources: 54 added, 0 changed, 0 destroyed.

validando o acesso ao cluster

carregue o kubconfig

export KUBECONFIG=kubeconfig kubectl cluster-info

saída esperada

Kubernetes control plane is running at https://xxxx.gr7.us-east-1.eks.amazonaws.com
CoreDNS is running at https://xxx.gr7.us-east-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

verifique os nodes

kubectl get nodes

saída esperada

NAME                        STATUS   ROLES    AGE     VERSION
ip-10-xx-xx-xx.ec2.internal   Ready    <none>   3m11s   v1.21.2-eks-55daa9d

Parece tudo ok!

Agora vai na AWS e confere VPC, EKS e o restante ;)

post-install

Agora precisamos instalar o ingress e o cert-manager, vai lá!

  1. https://gutocarvalho.net/instalando-ingress-aws-no-k8s-eks/
  2. https://gutocarvalho.net/instalando-cert-manager-no-k8s/

Caso precise regerar o kubeconfig

Bons estudos!

refs


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Aprenda a instalar o gitlab-runner para rodar docker DIND.


O que são drops?

São DUMPs mentais rápidos e rasteiros, simples e objetivos – que funcionam. 

Geralmente eu volto para detalhar mais cada passo – com o devido tempo.

Considere com a mesma qualidade de um rascunho ou uma anotação rápida.

De qualquer forma comenta ai qquer coisa, os comentários estão ligados nos DROPS ;)


Instalando docker no Ubuntu

curl https://releases.rancher.com/install-docker/19.03.sh | sh
systemctl enable docker
systemctl start docker

Instalando o GitLab Runner no Ubuntu

curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb"
dpkg -i gitlab-runner_amd64.deb
systemctl enable gitlab-runner
systemctl start gitlab-runner

Registrando um Runner Docker-in-Docker

gitlab-runner register -n \
  --url https://gitlab.com/ \
  --registration-token TOKEN \
  --description "Runner Guto 1" \
  --tag-list docker \
  --executor docker \
  --docker-image "docker:19.03.12" \
  --docker-privileged true \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock 

Crie quantos runners achar necessário, eu costumo reservar 1 vCPU e 1 GB de RAM para cada Runner.

Um exemplo, se eu subir 4 runners, a VM vai ter 4 vCPUs + 4 GB de RAM só para os Runners, normalmente deixo mais 1 vCPU + 1 GB pro OS e assim fica tranquilo para cenários bem básicos.

Configurando a concorrência do gitlab-runner

edite o arquivo

vim  /etc/gitlab-runner/config.toml

altere o número de runners concorrentes para a quantidade que você criou.

concurrent = 4

reinicie o runner

systemctl restart gitlab-runner

ah, tenha certeza que a instância tem recursos que aguentam a demanda de concorrência, tanto do ponto de vista de memória, quanto de processamento e disco.

[s]
Guto


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]

Seguem as opções de standing desk que eu encontrei no Brasil.



https://slik.com.br/

https://www.geniodesks.com.br

https://baherstore.com.br/produto/mesa-reta

Melhor custo/beneficio até agora é a Baherstore.

[s]
Guto


Gostou do conteúdo?

Você também me encontra nessas redes!

Mastodon

@gutocarvalho@bolha.us

PixelFed

@gutocarvalho@bolha.photos

Lemmy

@gutocarvalho@bolha.forum

WriteFreely

@gutocarvalho@bolha.blog @notamental@bolha.blog @poesias@bolha.blog @contos@bolha.blog

Bookwyrm

@gutocarvalho@bolha.review

Peertube

@gutocarvalho@bolha.tube

Friendica

@gutocarvalho@bolha.network

Quer saber mais sobre mim?

Visite meus sites!

E meus blogs:

Conhece o Coletivo Bolha?

Então vem conhecer o bolha.io ou bolhaverso!

Nós temos muito mais para compartilhar contigo!

Quer apoiar nosso trabalho? Você pode!

Te vejo no mastodon da bolha.us!

[s]