<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://tonio-m.github.io/blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tonio-m.github.io/blog/" rel="alternate" type="text/html" /><updated>2026-07-02T06:49:55+00:00</updated><id>https://tonio-m.github.io/blog/feed.xml</id><title type="html">tonio [🌱📝]</title><subtitle>thinking in public.</subtitle><entry><title type="html">❋ Dump Anthropic Certified Architect</title><link href="https://tonio-m.github.io/blog/2026/06/30/dump-anthropic-certified-architect.html" rel="alternate" type="text/html" title="❋ Dump Anthropic Certified Architect" /><published>2026-06-30T00:00:00+00:00</published><updated>2026-06-30T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2026/06/30/%E2%9D%8B-dump-anthropic-certified-architect</id><content type="html" xml:base="https://tonio-m.github.io/blog/2026/06/30/dump-anthropic-certified-architect.html"><![CDATA[<h1 id="introduction-to-agent-skills">Introduction to agent skills</h1>
<ul>
  <li>skills
  - enterprise, personal, project, plugin
  - md frontmatter: name, description, model, allowed-tools
  - folder with a SKILL.md 
  - can reference assets in same folder
  - keep under 500 lines</li>
  <li>hooks
  - in hooks/*.md</li>
  <li>Claude.md</li>
  <li>subagents
  - in agents/*.md</li>
  <li>MCP</li>
</ul>

<hr />
<h1 id="building-with-the-claude-api">Building with the Claude API</h1>
<ul>
  <li>Claude API
    <ul>
      <li>chat.messages.create()</li>
      <li>with chat.messages.stream()</li>
    </ul>
  </li>
  <li>structured data
    <ul>
      <li>prefilled message + stop sequences</li>
    </ul>
  </li>
  <li>prompt evaluation
    <ul>
      <li>eval dataset + run through grader + calculate average grade</li>
      <li>eval dataset
        <ul>
          <li>task, format, solution criteria</li>
        </ul>
      </li>
      <li>grader:
        <ul>
          <li>model with system prompt with XML tags <task></task> <solution></solution></li>
          <li>also outputs strengths, weaknesses, reasoning</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>prompt engineering
    <ul>
      <li>clear and direct
        <ul>
          <li>first line of prompt is most important</li>
          <li>clear (simple language, explicit)</li>
          <li>direct (instructive, action verbs)</li>
        </ul>
      </li>
      <li>specific
        <ul>
          <li>guidelines: section with bullet points</li>
          <li>follow these steps: with sequential steps (complex problems only)</li>
        </ul>
      </li>
      <li>xml to separate sections, like multi-page strings formated into the system prompt</li>
      <li>multi-shot prompting:
        <ul>
          <li>just providing examples in the system prompt</li>
          <li>here are some examples:
            <sample_input>a</sample_input>
            <ideal_output>b</ideal_output>
            <p>be careful of x:</p>
            <sample_input>x</sample_input>
            <ideal_output>y</ideal_output>
          </li>
          <li>use highly graded examples of your eval in the multi-shot</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>tools
    <ul>
      <li>tool function + JSONschema of params</li>
      <li>anthropic.messages.create(tools=[])</li>
      <li>TextBlock, ToolUseBlock, ToolResultBlock (could have many tooluse/toolresult)</li>
      <li>ToolUseBlock comes from the agent</li>
      <li>ToolResultBlock comes from the user (python function is run on client)</li>
      <li>while true loop with ‘stop_reason’ handling</li>
      <li>parse tool name from ToolUseBlock in response</li>
      <li>tool use in streaming:
        <ul>
          <li>“type”: “input_json” in the ContentBlockDelta blocks</li>
          <li>fine_grain=True: disable tool json validation, needs to check on client</li>
        </ul>
      </li>
      <li>builtin tools:
        <ul>
          <li>text editor (only schema builtin)</li>
          <li>web search, allowed_domains</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>rag
    <ul>
      <li>take large doc -&gt; chunk it -&gt; make relevance search mechanism to add to prompt</li>
      <li>chunking is the most complex part
        <ul>
          <li>by size (chunks of fixed size, w or w/o overlap),
by structure (md headers),
by semantics (NLP models)</li>
        </ul>
      </li>
      <li>relevance search: cosine distance of the user query with all vectors of db</li>
      <li>multi-index RAG:
        <ul>
          <li>multiple search mechanisms</li>
          <li>combine cosine distance with BM25 word match
            <ul>
              <li>good if you have IDs or specific strings in corpus</li>
            </ul>
          </li>
          <li>2 results weighted by RRF (Reciprocal Rank Fusion), its a weighted avg</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Claude
    <ul>
      <li>extended thinking - enable when evals are not working
        <ul>
          <li>thinking_budget=x  (max_tokens needs to be bigger)</li>
        </ul>
      </li>
      <li>images
        <ul>
          <li>max 100, max 5MB img size</li>
          <li>prompting can improve a lot. clear and direct, guidelines, etc</li>
          <li>multi-shot with other images as example</li>
        </ul>
      </li>
      <li>pdf
        <ul>
          <li>can look at images inside pdf</li>
          <li>“citations”: { “enabled”: True }
            <ul>
              <li>get citationblock</li>
              <li>can also be used on plaintext, not only pdf</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>caching
        <ul>
          <li>cheaper, faster, 1 hour TTL,</li>
          <li>cache_control: type: ephemeral</li>
          <li>set in textblock as a breakpoint at least at every 1024 tokens</li>
          <li>put on tool schemas and system prompts
            <ul>
              <li>tools[-1][“cache_control”] = “ephemeral”</li>
            </ul>
          </li>
          <li>cache_creation_input_tokens and cache_read_input_tokens at result block</li>
        </ul>
      </li>
      <li>files API
        <ul>
          <li>upload file ahead of time</li>
          <li>then refer with source: type: file, file_id: on future image block</li>
        </ul>
      </li>
      <li>code execution tool
        <ul>
          <li>managed by anthropic</li>
          <li>docker containers have no network access</li>
          <li>can use pre-uploaded files from files API with ContainerUploadBlock</li>
          <li>flow:
            <ul>
              <li>file upload with files API</li>
              <li>messages.create
                <ul>
                  <li>user message asking for text</li>
                  <li>container upload: file upload id</li>
                  <li>code execution tool schema</li>
                </ul>
              </li>
              <li>result: text + code_execution_output with file id</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>agents vs workflows
        <ul>
          <li>workflow patterns: evaluator optimizer, parallelizator, chaining, routing</li>
          <li>
            <h2 id="agents-tools-must-be-generic-should-have-environment-inspection-tools">agents: tools must be generic, should have environment inspection tools</h2>
            <h1 id="introduction-to-mcp">Introduction to MCP</h1>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>MCP
    <ul>
      <li>can communicate over stdio, http, websocket</li>
      <li>implements a set of tools for Claude to use</li>
      <li>mcp server
        <ul>
          <li>just a class with each function as tools</li>
          <li>mcp inspector with <code class="language-plaintext highlighter-rouge">mcp dev</code></li>
        </ul>
      </li>
      <li>mcp client
  -part of the lib (mcp.client.stdio.stdio_client, mc.ClientSession)
        <ul>
          <li>very convoluted.</li>
          <li>Usually wrapped in own class that does:
            <ul>
              <li>session.list_tools(), session.call_tool(), does cleanup</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>resources
        <ul>
          <li>tools are called by Claude, resources are called by you (app)</li>
          <li>they have uri, like docs://docs/{doc_id} or docs://docs/</li>
          <li>could be remote files, strings, or whatever app needs</li>
          <li>canon example: @remote_file.md</li>
          <li>return json, string, list</li>
        </ul>
      </li>
      <li>prompts
        <ul>
          <li>like skills, but defined on the server</li>
          <li>can accept arguments, like “review pr {num}, be adhd friendly”</li>
          <li>canon example: /slash-command</li>
          <li>
            <h2 id="returns-messages-json-like-msg-history">returns <code class="language-plaintext highlighter-rouge">messages</code> json (like msg history)</h2>
            <h1 id="claude-code-in-action">Claude Code in Action</h1>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Claude code
    <ul>
      <li>claude.md
        <ul>
          <li>/init generates the file</li>
          <li>/memory comment -&gt; updates claude.md</li>
          <li>repo: claude.md, user: claude.local.md, global: ~/.claude/claude.md</li>
        </ul>
      </li>
      <li>basics
        <ul>
          <li>@ to reference files in chat</li>
          <li>alt+enter for newlines</li>
        </ul>
      </li>
      <li>thinking and planning
        <ul>
          <li>plan mode = shift + tab</li>
          <li>thinking level = /effort</li>
          <li>plan = breadth, thinking = depth</li>
        </ul>
      </li>
      <li>/compact between tasks that have overlap</li>
      <li>.Claude/commands/*.md to define slash commands</li>
      <li>claude mcp add “name” “command”</li>
      <li>/install-github-app -&gt; setup github actions
        <ul>
          <li>uses api key, has mcp support,</li>
          <li>can be referenced on yaml</li>
          <li>can mention @claude on PRs, like devin</li>
        </ul>
      </li>
      <li>hooks:
        <ul>
          <li>defined inside .claude/settings.json or settings.local.json</li>
          <li>prevent .env read
            <ul>
              <li>PreToolUse (or PostToolUse)</li>
              <li>runs script that parses tool use JSON</li>
            </ul>
          </li>
          <li>run linter/typechecker after file edit</li>
          <li>run unit tests after plan implementation</li>
          <li>could spawn another claude from command line but very manual</li>
          <li>claude code SDK: claude -p on cli, import on python or on js</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Introduction to agent skills skills   - enterprise, personal, project, plugin   - md frontmatter: name, description, model, allowed-tools   - folder with a SKILL.md    - can reference assets in same folder   - keep under 500 lines hooks   - in hooks/*.md Claude.md subagents   - in agents/*.md MCP]]></summary></entry><entry><title type="html">🐳 Dump Kubernetes Cka</title><link href="https://tonio-m.github.io/blog/2025/08/13/dump-kubernetes-cka.html" rel="alternate" type="text/html" title="🐳 Dump Kubernetes Cka" /><published>2025-08-13T00:00:00+00:00</published><updated>2025-08-13T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2025/08/13/%F0%9F%90%B3-dump-kubernetes-cka</id><content type="html" xml:base="https://tonio-m.github.io/blog/2025/08/13/dump-kubernetes-cka.html"><![CDATA[<h1 id="intro">intro</h1>
<p>isso é um dump do que eu aprendi e anotei estudando kubernetes pra CKA.</p>

<p>essas anotações foram feitas pra mim, então se não entendeu algo se vira (ou me pergunta github@mtonio.com).</p>

<p>hoje em dia tudo da pra copiar e colar pra uma LLM, então o importante é manter palavras-chave, explicações de conceitos e edge cases, os especificos</p>

<h1 id="core">core</h1>
<h2 id="kubectl">kubectl</h2>
<p>k get all -A</p>

<p>lembra de usar a API reference ao invés de ficar perdido na documentação deles https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands</p>

<h2 id="pods">pods</h2>
<p>k get pods –selector env=dev</p>

<p>k run podname –image=x –labels=”a=foo,b=bar”</p>

<p>k run podname –image=x –dry-run=client -o=yaml</p>

<p>use k get pod x -o=yaml &gt; pod.yaml pra recriar o pod</p>

<p>k get pods -o=wide (pode ver em que node os pods estão)</p>

<p>você pode especificar <strong>Requests</strong> minimos e <strong>Limits</strong> máximos para os cpu e memória de um pod</p>

<p>quando você coloca –expose –port 80, ele cria um service clusterIp pra você junto com o pod</p>

<p>CrashLoopBackOff num pod pode ser varias coisas, se você der k get pod, dentro do yaml tem a razão pela qual ele deu erro</p>

<p>k logs podname –container=x pra ver os logs do pod</p>

<p>quando um pod é filho de um controller dá pra ver em k describe pod podname | grep ControlledBy:</p>

<p>volumes hostPath montam a pasta do pod diretamente no host, é muito usado em static pods</p>

<p>imagePullSecrets dentro da spec do pod pra usar um registry do docker privado</p>

<p>k delete pod –force pra não ter que ficar esperando</p>

<p>lembra de olhar os configmaps dos pods (que são montados como volumes), as vezes uma config importante está num configmap do pod e vc não sabe</p>

<h2 id="sidecar-containers-e-init-containers">sidecar containers e init containers</h2>
<p>sidecar containers são tipos especificos de init containers que tem restartPolicy: Always</p>

<p>se um init container tem <strong>restartPolicy: Always</strong>, ele só morre quando o container principal morrer tambem</p>

<p>Init Containers são usados na spec de pods pra criar um container itermediario pra fazer algum build ou setup antes do container principal, da pra dividir um volume entre os dois containers com <strong>volumeMounts</strong> pra eles terem acesso aos mesmos arquivos</p>

<p>init containers rodam um depois do outro, não simultaneamente</p>

<p>pra ver pq o init container falhou, usa k logs podname -c init-container-name</p>

<h2 id="nodes">nodes</h2>
<p>pods tambem podem rodar no node controlplane</p>

<p>você pode forçar um node manualmente num pod com k edit -&gt; nodeName (manual scheduling)</p>

<p>k get nodes -o wide para pegar os ips dos nós</p>

<p>ssh node-ip para dar ssh num nó</p>

<p>k top pods/nodes (precisa do metrics server rodando)</p>

<p>kubectl drain node01 –ignore-daemonsets (adiciona taint de unschedulable pra fazer manutencao e mata todos os pods dentro)</p>

<p>drain não funciona pra dar evict em pods sem controler, pq ele deletaria algo pra sempre</p>

<p>kubectl uncordon node01 (deixa o node schedulable de novo)</p>

<p>use o comando <code class="language-plaintext highlighter-rouge">ip a</code> pra ver todas as network interfaces 
a interface com (172.0.0.0/16) é a dos containeres
(kube-controller-manager.yaml dentro dos manifests é onde você encontra o range de ips dos pods)</p>

<p><code class="language-plaintext highlighter-rouge">ip route show default</code> mostra o gateway padrão do nó (ip do roteador)</p>

<p>containeres tem um ip do roteador virtual que não precisa estar na mesma subnet da rede, se o nó for um container tipo minikube já sabe</p>

<h2 id="deployments">deployments</h2>
<p>deployments são controllers feitos só pra pods e replicasets</p>

<p>depois de uma mudança, você tem que dar scale=0 ou deletar os pods manualmente  pro controller recriar</p>

<p>k create deploy –image=x –replicas=3</p>

<p>k scale –replicas=5 rs/new-replica-set</p>

<p>selector labels e template labels no spec de um controller é como o controller sabe de quais pods ele é dono</p>

<p>deployments do tipo RollingUpdate trocam pods um por um sem precisarem ser deletados</p>

<h2 id="services">services</h2>
<p>dns dos serviços tbm funciona se quebrado em partes (tanto service-name quanto service-name.default.svc.cluster.local) funcionam</p>

<p>o service tipo clusterIP é virtual, expõe uma porta acessado só internamente por outros pods</p>

<p>o service tipo nodeport expõe uma porta alta em todos nodes, a <strong>nodePort</strong>, mas ele tambem expõe uma porta interna <strong>port</strong> e leva em sua config a <strong>targetPort</strong>, do pod</p>

<p>da pra usar pod: nameselector pra escolher quais pods o service vai servir de proxy</p>

<h2 id="kube-system-static-pods--daemonsets-and-etcd">kube-system, static pods,  daemonsets and etcd</h2>
<p>static pod é um pod sem controller definido por padrão em em /etc/kubernetes/manifests/ ()</p>

<p>daemonset é um controller que roda um pod pra cada nó do cluster, e é muito comum em ferramentas de logging, monitoramento e networking</p>

<p>kube-proxy é um daemonset que implementa os services, ele tbm lida com firewalls de services</p>

<p>coredns roda no kube-system e é o que resolve os dns tipo .svc.cluster.local</p>

<p>o coredns é definidos nos pods como um servidor dns mesmo, na porta 53 e tudo mais</p>

<p>se você fizer ps aux | grep kubelet você consegue ver onde ficam os arquivos de configuração do kubelet, incluindo o –config que é o mais importante</p>

<p>é possivel deployar mais de um scheduler no kubernetes, e as vezes pra setups de infraestrutura muito customizados, ou que sofrem trafego de criacao/destruicao de pods muito alto é o que eles fazem</p>

<p>da pra usar o help dos binarios dos containeres que você não faz ideia do que fazem, tipo k exec -it kube-apiserver-controlplane -n kube-system – kube-apiserver –help</p>

<p>crictl ps -a (é tipo docker ps -a mas para os containeres que implementam o kubernetes)</p>

<p>crictl logs container-id</p>

<p>etcd node roda como pod mas você pode usar etcdctl no controlplane pra usar ele</p>

<p>etcd guarda todas as resource definitions e metadata de pods rodando</p>

<p>etc é um static pod em /etc/kubernetes/manifests/etcd.yaml, tipo o kube-apiserver</p>

<p>pra fazer um backup do etcd:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>etcdctl snapshot save --endpoints --cacert --cert --key  /opt/snapshot-pre-boot.db
etcdctl snapshot restore /opt/snapshot-pre-boot.db data-dir/
rm -rf /var/lib/etcd/ &amp;&amp;  mv data-dir /var/lib/etcd
</code></pre></div></div>

<p>o port do etcd 2379 é pra comunicação controlplane -&gt; node</p>

<p>o port etcd 2380 é pra comunicação controlplane &lt;-&gt; controlplane (peer to peer)</p>

<h2 id="dicas-para-debugging">dicas para debugging</h2>
<p>se for application failure: olhe a config do service e do pod</p>

<p>se for failure no controlplane: olha os pods do kube-system e o /etc/kubernetes/manifests</p>

<p>se for failure no worker node: olha o systemctl status kubelet, a /var/lib/kubelet/config.yaml, e o /etc/kubernetes/kubelet.conf (acho que essas coisas estão no comando de instalação do kubelet ou no service)</p>

<p>se for network failure: olha se o CNI tá instalado, olha os pods do CNI (eles ficam em outros namespaces normalmente)</p>

<h2 id="pvs-pvc">pvs, pvc</h2>
<p>persistent volumes são como definições de espaço a ser usado em disco, tipo definições de uma pasta</p>

<p>da pra cirar um persistentvolume de tipo hostPath, que monta direto numa pasta do host</p>

<p>volumes com tipo readwritemany podem ser montados em varios nodes, readwriteonce só em um</p>

<p>se vc usar a config do pv retain ele fica unavailable depois de usado pra evitar que ele autodelete quando outro pod quiser usar ele</p>

<p>persistent volume claims são “escrituras/reservas” de persistent volume</p>

<p>pvc é como os pods usam o storage do pv, você referencia a pvc no spec</p>

<p>enquanto o pvc tiver criado, os dados vão continuar lá, reservados</p>

<p>1 pvc = 1 pv, sempre são de um pra um, nunca da pra fazer varios pvcs pra 1 pv, são monogamicos</p>

<p>PVCs com storageclass especificada não precisam de nenhum PV pré-criado, criam automaticamente</p>

<p><strong>storageclassname</strong> é especificado na spec do pvc</p>

<p>kubectl describe pvc pvcname</p>

<h1 id="pod-management">pod management</h1>
<h2 id="taints-tolerations">taints, tolerations</h2>
<p>taints afastam pods que não tenha toleration</p>

<p>tolerations toleram pods com taints especificas</p>

<p>taints normalmente são um key-value pair</p>

<p>k taint nodes node1 afasta=tudo:NoSchedule</p>

<h2 id="node-affinity">node affinity</h2>
<p>node affinity é uma config do pod pra preferir/requisitar nodes com certas labels</p>

<p>k label node node01 gpu=True</p>

<p>o node affinity é editado no spec do deployment ou do pode</p>

<p>node affinity pode ser required ou preferred, with conditions key has value x  or key exists</p>

<h2 id="priorityclasses">priorityclasses</h2>
<p>k get priorityclasses</p>

<p>k create priorityclass low-priority –value=1000 –description=”bla” –global-default=false</p>

<p>priorityclasses são classes que fazerm um pod ter prioridade sobre outros pods</p>

<p><strong>priorityClassName</strong> pode ser especificado no spec de pods</p>

<p>a priorityclass do tipo PreemptLowerPriority dá evict em outros pods, a Never não</p>

<h2 id="configmaps-e-secrets">configmaps e secrets</h2>
<p>configmap é tipo um secret só que sem criptografia</p>

<p>dá pra usar os valores do configmap em environment variables</p>

<p>o único outro jeito de usar é em volumes (ai cada par key-value vira um arquivo no volume)</p>

<p>tem muitas vezes onde secrets são do tipo TLS, onde tem arquivos .crt, .key and .ca</p>

<p>tem secret do tipo docker-registry tambem, pra registries privados do docker</p>

<h2 id="horizontal-pod-autoscaler-e-vertical-pod-autoscaller">Horizontal Pod autoscaler e Vertical Pod autoscaller</h2>
<p>HPA precisa de requests / limits especificados no pod, pq ele calcula o threshold pra criar uma nova replica baseado nesses requests</p>

<p>VPA é um custom resource definition que vc precisa instalar, ele deleta o pod e cria de novo com mais memoria/cpu</p>

<p>o VPA usa machine learning pra dar update em limites de CPU e memoria</p>

<p>o VPA da erro quando tem só uma replica do que você tá autoscaling, pq o serviço ficaria indisponivel na recriação</p>

<h1 id="security-settings">security settings</h1>
<h2 id="users-and-certificates">users and certificates</h2>
<p>o jeito mais comum sem um provider externo de criar um user no kubernetes é criado um certificado e uma clusterrole</p>

<p>certificado tls é composto por .crt, .key and .ca</p>

<p>.ca pode ser compartilhado as vezes, as vezes não, pq certificados TLS conseguem fazer uma chain de pai CAzão pra filho CAzinho pra filho CAzito</p>

<p>quando tu usa o comando do openssl x509, vem varios campos</p>

<p>nesses campos Subject CN: dentro do .crt é o CommonName, mostra o que ele representa, tipo o username dele</p>

<p>o campo Issuer CN mostra o pai dele, o CAzão</p>

<p>o Subject Alternative Name: tem todos os DNSs onde o certificado é usado</p>

<p>certificatesigningrequest é um recurso que é usado pra pedir aprovação de certificados TLS pra usuários da API</p>

<p>k get csr</p>

<p>k certificate approve fulano</p>

<h2 id="rbac-roles-e-clusterroles">RBAC, roles e clusterroles</h2>
<p>a diferença de roles e clusterroles é que as clusterroles não se restringem por namespace</p>

<p>uma rolebinding binda uma role com permissões em um ou vários subjects, mas ela não consegue usar mais de uma role ao mesmo tempo não</p>

<p>dar acesso pra alguem é: criar role com permissão x + criar rolebinding dessa role no user</p>

<p>nas roles, os “apigroups” na spec são o que fica em cima da spec de todos recursos (o api:)</p>

<p>nas roles, resourceNames é tipo prefixo da role do IAM da aws, e.g.: quero permissão x pra todos pods com prefixo bonito-*</p>

<p>cluster roles são pra coisas tipo permissões de usuário ou pra dar permissão pra recursos sem namespace como nodes ou storageclasses</p>

<h2 id="admission-controllers">admission controllers</h2>
<p>admission controllers podem ter o tipo mutating ou validating,</p>

<p>admission controllers são hookzinhos validadores de template que rodam depois que tu dá o comando de criar o recurso, mas antes dele serem efetivamente criados</p>

<p>exemplos de admission controller validating  NamespaceExists (quando tu cria e ele da erro, valida se ja existe)</p>

<p>exemplos de admission controlller mutating NamespaceAutoProvision (quando tu da k create namespace e ele nao da erro)</p>

<p>tem recursos builtin pra fazer admission controllers customizados com webhooks</p>

<h2 id="serviceaccounts">serviceaccounts</h2>
<p>serviceaccounts são usados no campo serviceAccountName: dos pods pra dar direitos de kubectl pra eles</p>

<p>k create serviceaccount saname</p>

<p>k create token saname</p>

<h1 id="networking">networking</h1>
<h2 id="networkpolicies">networkpolicies</h2>
<p>é o firewall do kubernetes basicamente, tem ingress egress allow deny</p>

<p>o deny é meio que por padrao, se vc criar uma netpol e não botar nenhuma regra é tipo um deny all</p>

<p>k get netpol</p>

<p>da pra usar pod: nameselector na network policy e filtrar por pods</p>

<p>essa porra é mto complexa então usa essas receitas aqui https://github.com/ahmetb/kubernetes-network-policy-recipes</p>

<h2 id="cni">cni</h2>
<p>container network interface é quem decide como os ips entre os pods vão funcionar</p>

<p>eles são como se fossem plugins e você escolhe qual vai usar</p>

<p>flannel nao tem suporte pra networkpolicy</p>

<p>calico tem suporte pra networkpolicy</p>

<p>plugins cni são instalados em /etc/cni/net.d/</p>

<p>aliás, paths com unix:// paths são sockets unix (que são diferentes de sockets de rede)</p>

<h2 id="ingress-e-gateway">ingress e gateway</h2>
<p>um ingress no k8s é tipo um nginx, ele faz port forwarding usando http e regras de dns</p>

<p>vc tem que instalar um ingress especifico pra usar, no meu caso foi o nginx-ingress</p>

<p>o ingress associa um subdomínio tal com um service x e manda toda requisição q vc faz no subdominio pro service, você até associa um service default em caso de 404 no deployment do ingress</p>

<p>no ingress resourceannotation no metadata costuma importar, pelo menos no nginx-ingress entao toma cuidado</p>

<p>gateway é tipo um ingress só que tunado e muito mais complexo</p>

<p>no gateway as gateway routes definem quais namespaces podem usar o gateway,</p>

<p>a gatewayclass define um tipo de gateway, e tem o  gateway que é a implementacao do gateway per se</p>

<p>no gateway tem o httproute que é um resource dedicado só pra uma rota subdominio -&gt; service</p>

<h1 id="cluster">cluster</h1>
<h2 id="cluster-installation">cluster installation</h2>
<p>add repo to apt repositories</p>

<p><code class="language-plaintext highlighter-rouge">apt install kubeadm='1.33.0-*' kubelet='1.33.0-*' kubectl='1.33.0-*'</code></p>

<p>no controlplane você dá kubeadm init</p>

<p>no worker você dá kubeadm join</p>

<p>depois você instala uma CNI, tipo o flannel</p>

<h2 id="upgrade-de-cluster">upgrade de cluster</h2>
<p>em cada upgrade de 1.32 -&gt; 1.33 você tem que mudar o repositorio do APT, pra fazer upgrade do kubeadm kubectl e kubelet</p>

<p>em cada node:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt install kubeadm='1.33.0-*' kubelet='1.33.0-*' kubectl='1.33.0-*'
kubeadm upgrade plan 
kubeadm upgrade apply v1.33.0
kubeadm upgrade node

systemctl daemon-reload
systemctl restart kubelet
</code></pre></div></div>

<h2 id="kubeconfig">kubeconfig</h2>
<p>k config use-context research</p>

<p>a environment variable  KUBECONFIG pode ser usada pra especificar o diretorio da kubeconfig tbm</p>

<p>k get pods –as my-context pra usar outro contexto programaticamente</p>

<h1 id="plugins-and-exstensions">plugins and exstensions</h1>
<h2 id="custom-resource-definitions">custom resource definitions</h2>
<p>custom resource definitions sao bem faceis de entender</p>

<p>vc define um plural e um grupo (que é  o que fica na api version la em cima)</p>

<h2 id="helm">helm</h2>
<p>comandos de repos</p>

<p>helm search hub</p>

<p>helm repo add</p>

<p>helm install releasename repo/chart</p>

<p>helm upgrade releasename repo/chart –version 2.0.0</p>

<p>helm get manifest releasename</p>

<p>helm rollback releasename</p>

<h2 id="kustomize">kustomize:</h2>
<p>touch ./kustomization.yaml &amp;&amp; k apply -k .</p>

<p>o nome é kustomize pq vc pode pegar yamls prontos e dar override em valores deles num lugar central com mta facilidade, usando vários kustomize.yaml, um em cada folder</p>

<p>kustomize tem configs como dar overwrite em tudo com uma commonLabel, commonAnnotation, commonNamespace, e prefixos de nomes em comum tambem</p>

<p>no kustomize você exclui/inclui recursos separando eles em diretorios e referenciando eles no kustomize.yaml</p>

<p>kustomize tem os tipos de patch. change patch, $patch: delete e JSON 6902 patch</p>

<p>change patch exemplo: images: name: newName: pra trocar o nome da img, newTag pra trocar a tag</p>

<p>$patch: delete consegue deletar containeres de um pod</p>

<p>patch JSON 6902 permite trocar qualquer config de qualquer recurso</p>

<p>k patch é um comando default do kubernetes que edita recursos com um json</p>

<p>kustomize tem o conceito de bases e overlays</p>

<p>bases você importa</p>

<p>overlays são como dev/prod/staging, e tem patches e components</p>]]></content><author><name></name></author><summary type="html"><![CDATA[intro isso é um dump do que eu aprendi e anotei estudando kubernetes pra CKA.]]></summary></entry><entry><title type="html">My Grandma’s 90’s Cookbook</title><link href="https://tonio-m.github.io/blog/2024/12/27/my-grandma's-90's-cookbook.html" rel="alternate" type="text/html" title="My Grandma’s 90’s Cookbook" /><published>2024-12-27T00:00:00+00:00</published><updated>2024-12-27T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2024/12/27/my-grandma&apos;s-90&apos;s-cookbook</id><content type="html" xml:base="https://tonio-m.github.io/blog/2024/12/27/my-grandma&apos;s-90&apos;s-cookbook.html"><![CDATA[<p><img src="/blog/assets/images/IMG_0027.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0028.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0029.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0030.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0031.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0032.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0033.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0034.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0035.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0036.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0037.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0038.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0039.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0040.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0041.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0042.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0043.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0044.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0045.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0046.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0047.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0048.jpeg" alt="" />
<img src="/blog/assets/images/IMG_0049.jpeg" alt="" /></p>

<p>During the holidays my grandma showed me this old book of recipes.</p>

<p>It’s in portuguese and really worn out with oil stains (I suppose from using it while cooking).</p>

<p>Some of the recipes have interesting names, like Torta Besta (“Dumb Pie”),
Beringelas “Tchan” (“Zing!” Eggplants), and Bolo D’água (Water Cake).</p>

<p>It also showed me how important and personal writing can be for people, and made me want to preserve it, so I decided to save it here.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">🏠 Comprar Imoveis</title><link href="https://tonio-m.github.io/blog/2024/11/22/comprar-imoveis.html" rel="alternate" type="text/html" title="🏠 Comprar Imoveis" /><published>2024-11-22T00:00:00+00:00</published><updated>2024-11-22T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2024/11/22/%F0%9F%8F%A0-comprar-imoveis</id><content type="html" xml:base="https://tonio-m.github.io/blog/2024/11/22/comprar-imoveis.html"><![CDATA[<p><img src="https://github.com/user-attachments/assets/eb58ab12-ed7f-4ddb-af5f-41eb7df775f7" alt="Art_of_Alariko_1" /></p>
<blockquote>
  <p>imagem por @alariko</p>
</blockquote>

<p>Existe uma regra prática no mercado imobiliário: o aluguel de um imóvel geralmente corresponde a 0,3% do seu valor total, podendo chegar a 0,5% em áreas mais valorizadas. Vamos usar essa informação como base para a análise.</p>

<p>Imagine um apartamento com aluguel de R$ 5.000. Usando a regra do 0,5%, podemos calcular que seu valor seria aproximadamente R$ 1 milhão.</p>

<p>Muitos consultores sugerem que você pode comprar um imóvel se conseguir pagar um financiamento equivalente ao valor do aluguel. Mas vamos fazer as contas:</p>

<ul>
  <li>Valor do imóvel: R$ 1 milhão</li>
  <li>Parcela mensal: R$ 5.000</li>
  <li>Resultado: 200 parcelas = 16,6 anos</li>
</ul>

<p>Isso me parece problemático, porque:</p>

<ol>
  <li>Pouquissimas pessoas ficam 16 anos no mesmo imóvel hoje em dia.</li>
  <li>Após esse período, o imóvel estará com quase 20 anos de uso. (e dada a adaptação urbanística de cidades como São Paulo, é bem provável que ele não valorize tanto assim)</li>
  <li>Mesmo com uma entrada de 20% (R$ 200 mil), ainda seriam necessários 13 anos de financiamento</li>
</ol>

<p>E esse número de parcelas está diretamente relacionado à porcentagem do aluguel (0,5%):</p>
<ul>
  <li>100% ÷ 0,5% = 200 parcelas (16,6 anos)
Este cálculo se mantém independentemente do valor!</li>
</ul>

<p>Dado isso, não faz tanto sentido assim alugar um imovel se você busca um “upgrade” em qualidade de vida (o que corresponderia a um aluguel maior que o atual).</p>

<p>A compra de um imóvel só realmente faz sentido financeiramente em algumas situações específicas:</p>

<p>Quando o aluguel representa uma parcela muito pequena da sua renda mensal, ou seja, apartamentos muito baratos ou pessoas muito ricas buscando renda passiva.
Ou em operações de especulação imobiliária.</p>

<p>Logo a gente percebe que comprar um imóvel em grandes centros urbanos é só pra quem realmente tem muito dinheiro. O “sonho” da casa própria financiada é uma sacada emocional pra te vender uma furada.</p>

<p>Agora, cidades do interior e propriedades rurais já merecem outra análise, e, provavelmente fazem dão um melhor negócio.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[imagem por @alariko Existe uma regra prática no mercado imobiliário: o aluguel de um imóvel geralmente corresponde a 0,3% do seu valor total, podendo chegar a 0,5% em áreas mais valorizadas. Vamos usar essa informação como base para a análise.]]></summary></entry><entry><title type="html">🥣 Cumbuquismo</title><link href="https://tonio-m.github.io/blog/2024/10/30/cumbuquismo.html" rel="alternate" type="text/html" title="🥣 Cumbuquismo" /><published>2024-10-30T00:00:00+00:00</published><updated>2024-10-30T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2024/10/30/%F0%9F%A5%A3-cumbuquismo</id><content type="html" xml:base="https://tonio-m.github.io/blog/2024/10/30/cumbuquismo.html"><![CDATA[<p><img src="https://github.com/user-attachments/assets/c3bfee62-2ed8-4321-8866-e5dad4af0f43" alt="image" /></p>

<blockquote>
  <p>Eu sou adepto do <em>cumbuquismo</em>.
Todos os dias eu reservo uma hora (12h-13h) pra cozinhar, lavar louça e comer.
Como eu cozinho pra semana toda, nem sempre leva uma hora inteira.</p>

  <p>Se eu vejo que não tem arroz, eu faço arroz pra semana toda.
Se eu quero comer frango, eu frito 1kg de frango de uma vez.
Então em algumas vezes levo 40 minutos pra fazer o almoço, as vezes 5, e vai conforme a necessidade.
Se falta uma proteína, faço um ovo cozido por 8 minutos, se faltam legumes, faço couve crocante na air fryer por 5 minutos.</p>

  <p>O <em>cumbuquismo</em> não é purista, eu por exemplo, comecei comendo marmita congelada.
Com o tempo cheguei a dividir, metade da marmita congelada pro almoço e metade pra janta, e o resto da comida vou incrementando com o que cozinho.
Muitas vezes, tem tantos “incrementos” que eu nem preciso da marmita congelada, e como só o que cozinhei.</p>
</blockquote>

<p>Isso aqui é bem sério.</p>

<p>Me acompanha por um segundo pra entender o raciocínio.</p>

<p>Olha para o mundo a sua volta, ele é absolutamente dominado de <em>pratismo</em>.
Tudo é servido em pratos rasos e gigantes, tudo leva um tempo absurdo pra cozinhar.
Fazer feijão todos os dias, fazer arroz todos os dias, uma tonelada de panelas.
Mães e avós passando o dia cozinhando e lavando louça. Restaurante PF, restaurante à quilo.
Talvez o costume seja tão grande de almoçar em grupo que tenhamos perdido nossa individualidade.</p>

<p>Com essa perda, vieram instituições pratistas aceitáveis, como o Self-Service e o PF. Quando a gente menos percebeu, essas instituições pratistas puxaram o nosso tapete.
A gente caiu no IFood, Griletto, Parmê, China in Box. Que são instituições demoníacas, é só você olhar a proporção de arroz pra proteína que eles colocam na comida.</p>

<p>Uma cadeia produtiva que era <code class="language-plaintext highlighter-rouge">custo operacional -&gt; consumidor</code>, virou <code class="language-plaintext highlighter-rouge">custo operacional -&gt; franquiado -&gt; aplicativo -&gt; entregador -&gt; consumidor</code>.
Como essa cadeia produtiva é absolutamente insustentavel, o preço pago vai ser na comida. 
O tapete vai ser puxado novamente e vamos cair nos burritos e hambúrgueres.</p>

<p>A alimentação precisa de um retorno ao essencial, achar a individualidade e cortar essa cadeia produtiva.
Aqui está uma filosofia minimalista e anti-pratista, pros tempos de hoje.</p>

<p>Princípios Cumbuquistas:</p>
<ul>
  <li>A cumbuca é o instrumento de libertação do <em>pratismo</em></li>
  <li>A meditação ativa de lavar louça enquanto as coisas estão cozinhando é importante</li>
  <li>O fogão é por essência pratista e seu uso deve ser limitado, a air fryer e a panela de arroz são extensões da nossa vontade</li>
  <li>O tempo é sagrado: 1h diária bem alocada te economizará meses</li>
  <li>A parcimônia é virtude, faça até onde conseguir, é melhor pecar pela falta do que pelo excesso.</li>
  <li>A panela guardada direto na geladeira é a morada natural do alimento, tupperwares aumentam a louça</li>
  <li>A desconstrução constante da nossa essência pratista deve ser observada</li>
  <li>A água fervente cozinha qualquer coisa. A manteiga frita qualquer coisa</li>
  <li>O mais importante: registre o seu almoço, tire uma foto, mande pros amigos, use isso como uma oportunidade de socializar, espalhe a palavra</li>
</ul>

<p><img src="https://github.com/user-attachments/assets/7403bdda-56a9-4268-9ba5-7fef4bbeafa4" alt="C04E565A-2847-4116-9AB9-60E8E352C08F_1_102_o" /></p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Our Interpretation Of Effort</title><link href="https://tonio-m.github.io/blog/2019/01/20/our-interpretation-of-effort.html" rel="alternate" type="text/html" title="Our Interpretation Of Effort" /><published>2019-01-20T00:00:00+00:00</published><updated>2019-01-20T00:00:00+00:00</updated><id>https://tonio-m.github.io/blog/2019/01/20/our-interpretation-of-effort</id><content type="html" xml:base="https://tonio-m.github.io/blog/2019/01/20/our-interpretation-of-effort.html"><![CDATA[<blockquote>
  <p>Why we leave stuff for later, and how we build habits.</p>
</blockquote>

<p><img src="https://miro.medium.com/v2/resize:fit:1400/format:webp/1*YsknxIsE7mQtquvrz40f7A.jpeg" alt="@deuveir" /></p>
<blockquote>
  <p>image by @deuveir</p>
</blockquote>

<blockquote>
  <p>DISCLAIMER: I wrote this when I was 17, a lot has changed on my opinions since. For the sake of record-keeping, I have uploaded it here on my blog. Enjoy the read.</p>
</blockquote>

<p>In my inevitable drive to criticize the actions of my social peers and family, I have noticed a pattern in their behaviour, a tendency to minimize pain and effort in exchange for comfort. It is present in everyone of my social circle, some of those in a disproportionate scale, diminishing their quality of life in return for some lazy slumber. Like a person who rarely dusts their house for the sake of laziness, and starts having severe allergies because of it.</p>

<p>Of course that, by the lack of thinking, they are somewhat blinded to the consequences of it, and start irrationally taking every opportunity to put aside their duties. This is equivalent to seeing preferential actions — those the consequences of not doing it are worse than the burden of doing it — as something bad and avoidable, instead of something beneficial like it really is — therefore the irrational characteristic of it.</p>

<p>So, if this tendency for slacking off creeps into our behavior, and is such a virus that keeps us from doing stuff, how can we learn to accept the effort instead of avoiding it, and start doing it constantly?</p>

<p>Well, it turns out you can’t do that.</p>

<h1 id="the-meaning-of-effort">The Meaning of Effort</h1>

<p>Effort is, by the definition of the word, something that can only be done once in a while, something “out of the ordinary”. If you take effort every single time while doing things, it stops looking like effort to you, and it becomes ordinary routine. Like a runner that runs at his highest capacity every day, he in fact isn’t putting in any effort. What happened is that, by the sole factor of doing it every day, it has become -or rather <strong>is</strong>- a habit to him.</p>

<p>This mistakable correlation of “becoming” to “being” is what really throws us into confusion. Because, if he were just a sedentary guy — if he decided to waste all his energy in trying to run every day- it is highly improbable that he would keep doing it, and be where he is today. It didn’t “become” a habit for him, rather it “is” a habit for him.</p>

<p>But then how did he actually become this good at it? Well, the role of effort in building habits is approachable in many, widely different, ways of thinking, some of those being evolutionary biology, the economy of the human action, beyond many others. Not to speak of the watered down, condensed versions of these knowledge presented in self help books, that actually make a lot of money doing it.</p>

<p>I could take a very long time explaining each one of these concepts in detail, but, supposing that someone else is going to read it, I think it’s always less disastrous for people to find out their own way of doing things, instead of applying my not-at-all-wise words.</p>

<p>Nevertheless, I recommend you browse the list below and actually take a run at some of these books, with some skepticism towards the self help cliches. And please remember that, ultimately, success and failure at doing something are concepts that depend on your own interpretation of your action. The only thing truly objective at play is an attempt at doing something, an action being made, and without it, you can’t either succeed or fail.</p>

<h2 id="recommendations">Recommendations:</h2>

<blockquote>
  <p>Human Action — Ludwig von Mises</p>

  <p>Praxeology: Who Needs It — Roderick T. Long</p>

  <p>The Power of Habit — Charles Duhigg</p>

  <p>Behave: The Biology of Humans at Our Best and Worst — Robert Sapowski</p>

  <p>How to Fail at Almost Everything and Still Win Big — Scott Adams</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[Why we leave stuff for later, and how we build habits.]]></summary></entry></feed>