<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcello Alexandre</title>
    <description>The latest articles on DEV Community by Marcello Alexandre (@marcelloale).</description>
    <link>https://dev.to/marcelloale</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F961501%2Fbef4418e-9718-4d4c-905d-b73d3fe41e39.png</url>
      <title>DEV Community: Marcello Alexandre</title>
      <link>https://dev.to/marcelloale</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcelloale"/>
    <language>en</language>
    <item>
      <title>Configurando Kind Cluster com Cilium e sem kube-proxy: Um Guia Prático</title>
      <dc:creator>Marcello Alexandre</dc:creator>
      <pubDate>Mon, 13 Jan 2025 12:56:49 +0000</pubDate>
      <link>https://dev.to/marcelloale/configurando-kind-cluster-com-cilium-e-sem-kube-proxy-um-guia-pratico-45a3</link>
      <guid>https://dev.to/marcelloale/configurando-kind-cluster-com-cilium-e-sem-kube-proxy-um-guia-pratico-45a3</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este tutorial é uma tradução e atualização do post original "&lt;a href="https://medium.com/@charled.breteche/kind-cluster-with-cilium-and-no-kube-proxy-c6f4d84b5a9d" rel="noopener noreferrer"&gt;Kind cluster with Cilium and no kube-proxy&lt;/a&gt;" de Charles-Edouard Brétéché. Ele foi adaptado para funcionar com algumas mudanças mais recentes na configuração. Gostaria de agradecer a Charles-Edouard Brétéché por seu excelente trabalho e por compartilhar seus conhecimentos.&lt;br&gt;
&lt;em&gt;I would like to thank Charles-Edouard Brétéché for his excellent work and for sharing his knowledge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Configurar um cluster Kubernetes com Kind (Kubernetes em Docker) é uma escolha popular para desenvolvimento e testes locais. O Kind cria um cluster Kubernetes executando contêineres Docker como nós. Neste tutorial, vamos configurar um cluster Kind com Cilium como a CNI (Interface de Rede de Contêineres) e sem kube-proxy.&lt;/p&gt;
&lt;h2&gt;
  
  
  Visão Geral do Kind
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://github.com/kubernetes-sigs/kind" rel="noopener noreferrer"&gt;Kind&lt;/a&gt; é uma maneira simples e eficaz de executar clusters Kubernetes locais compostos por vários nós.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kind é uma ferramenta para executar clusters Kubernetes locais usando contêineres Docker como "nós". O Kind foi projetado principalmente para testar o próprio Kubernetes, mas também pode ser usado para desenvolvimento local ou CI (Integração Contínua).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O Kind vem com um CNI (Container Network Interface) padrão chamado kindnet. Este CNI simples cuida das noções básicas de rede, mas não suporta recursos avançados como &lt;a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/" rel="noopener noreferrer"&gt;NetworkPolicy&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Visão Geral do Cilium
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cilium.io/" rel="noopener noreferrer"&gt;Cilium&lt;/a&gt; é uma CNI moderna e avançada para Kubernetes, implementada sobre o &lt;a href="https://ebpf.io/" rel="noopener noreferrer"&gt;eBPF&lt;/a&gt;, que foca em desempenho, segurança e observabilidade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cilium é um software de código aberto para fornecer, proteger e observar a conectividade de rede entre cargas de trabalho em contêineres — nativo da nuvem e alimentado pela revolucionária tecnologia do Kernel, eBPF.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://docs.cilium.io/en/v1.9/concepts/kubernetes/policy/#networkpolicy-state" rel="noopener noreferrer"&gt;NetworkPolicy&lt;/a&gt; padrão, bem como as mais avançadas &lt;a href="https://docs.cilium.io/en/v1.9/concepts/kubernetes/policy/#ciliumnetworkpolicy" rel="noopener noreferrer"&gt;CiliumNetworkPolicy&lt;/a&gt; e &lt;a href="https://docs.cilium.io/en/v1.9/concepts/kubernetes/policy/#ciliumclusterwidenetworkpolicy" rel="noopener noreferrer"&gt;CiliumClusterwideNetworkPolicy&lt;/a&gt;, são suportadas. Ele oferece capacidades de múltiplos clusters, permite a observação das atividades de rede e muito mais.&lt;/p&gt;
&lt;h2&gt;
  
  
  Combinando Kind e Cilium
&lt;/h2&gt;

&lt;p&gt;Felizmente, o Kind pode ser configurado para usar outra CNI além do kindnet. Neste artigo, vamos passar pelos passos necessários para usar o &lt;strong&gt;Cilium CNI em clusters alimentados pelo Kind&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma característica do Cilium é que ele pode &lt;strong&gt;substituir completamente o kube-proxy&lt;/strong&gt;. Com a configuração correta, os clusters do Kind podem ser configurados para usar a Cilium CNI e funcionar com o &lt;code&gt;kube-proxy&lt;/code&gt; desativado.&lt;/p&gt;

&lt;p&gt;Executar um cluster desse tipo localmente ajuda a configurar um ambiente local mais próximo de um cluster de produção real. Isso nos permite testar coisas que não poderiam ser testadas com o kindnet.&lt;/p&gt;


&lt;h2&gt;
  
  
  Um cluster sem CNI e com kube-proxy desativado
&lt;/h2&gt;

&lt;p&gt;Ao criar um cluster Kind, é possível fornecer uma especificação do cluster com a configuração do cluster. A seção de rede permite configurar a CNI padrão do cluster e outros componentes do cluster.&lt;/p&gt;

&lt;p&gt;Executar o comando abaixo irá iniciar um cluster sem kindnet e não instalará o kube-proxy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observação&lt;/strong&gt;: Por experiência própria, pode ocorrer um erro ao tentar criar esse cluster se você não tiver uma máquina tão potente ou com pouco recurso disponível. É recomendado diminuir a quantidade de workers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind create cluster --config - &amp;lt;&amp;lt;EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true   # não instala kindnet
  kubeProxyMode: none       # não executa kube-proxy
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claro, esse cluster não será utilizável. Os nós permanecerão no estado &lt;code&gt;NotReady&lt;/code&gt; até que uma CNI seja instalada. Você pode verificar o status dos nodes executando o comando &lt;code&gt;kubectl get nodes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                 STATUS     ROLES                  AGE   VERSION
kind-control-plane   NotReady   control-plane,master   57s   v1.27.3
kind-worker          NotReady   &amp;lt;none&amp;gt;                 21s   v1.27.3
kind-worker2         NotReady   &amp;lt;none&amp;gt;                 21s   v1.27.3
kind-worker3         NotReady   &amp;lt;none&amp;gt;                 21s   v1.27.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Instalar Cilium
&lt;/h2&gt;

&lt;p&gt;Instalar o Cilium no cluster criado anteriormente deve ajudar a tornar o cluster utilizável. No entanto, não será tão simples.&lt;/p&gt;

&lt;p&gt;Como o &lt;code&gt;kube-proxy&lt;/code&gt; não está em execução, não é possível se comunicar com o API server usando o Kubernetes service dentro do cluster.&lt;/p&gt;

&lt;p&gt;Observação: Caso não funcionem a instalação, é sempre bom verificar a &lt;a href="https://docs.cilium.io/en/stable/installation/kind/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; do Cilium.&lt;/p&gt;

&lt;p&gt;Por enquanto, vamos instalar o Cilium e ver onde as coisas falham. O Cilium pode ser instalado com Helm e junto a uma configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --values - &amp;lt;&amp;lt;EOF
kubeProxyReplacement: true
hostServices:
  enabled: false
externalIPs:
  enabled: true
nodePort:
  enabled: true
hostPort:
  enabled: true
image:
  pullPolicy: IfNotPresent
ipam:
  mode: kubernetes
hubble:
  enabled: true
  relay:
    enabled: true
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste ponto, o Cilium deve começar a ser instalado no cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAMESPACE            NAME                                         READY   STATUS              RESTARTS   AGE
kube-system          cilium-6szjr                                 0/1     Running             0          7s
kube-system          cilium-operator-6fb8dbd88c-2p4mv             1/1     Running             0          7s
kube-system          cilium-operator-6fb8dbd88c-mdrg9             1/1     Running             0          7s
kube-system          cilium-sw9d5                                 0/1     Running             0          7s
kube-system          cilium-zxgfx                                 0/1     Running             0          7s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Infelizmente, os pods do cilium-operator e dos agents do Cilium nunca se tornarão &lt;code&gt;Ready&lt;/code&gt; e &lt;strong&gt;reiniciarão continuamente&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kube-system          cilium-operator-6fb8dbd88c-2p4mv             0/1     Error               4          6m43s
kube-system          cilium-operator-6fb8dbd88c-2p4mv             0/1     CrashLoopBackOff    4          6m50s
kube-system          cilium-6szjr                                 0/1     Error               1          2m10s
kube-system          cilium-zxgfx                                 0/1     Error               1          2m10s
kube-system          cilium-sw9d5                                 0/1     Error               1          2m10s
kube-system          cilium-6szjr                                 0/1     CrashLoopBackOff    1          2m12s
kube-system          cilium-zxgfx                                 0/1     CrashLoopBackOff    1          2m12s
kube-system          cilium-sw9d5                                 0/1     CrashLoopBackOff    1          2m12s
kube-system          cilium-operator-6fb8dbd88c-mdrg9             1/1     Running             3          6m59s
kube-system          cilium-dqknq                                 0/1     Error               1          2m10s
kube-system          cilium-dqknq                                 0/1     CrashLoopBackOff    1          2m12s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analisar os logs do operador ou dos agentes explicará o que está acontecendo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;level=info msg="Cilium Operator 1.11.1 76d34db 2022-01-18T15:52:51-08:00 go version go1.17.6 linux/amd64" subsys=cilium-operator-generic
level=info msg="Establishing connection to apiserver" host="https://10.96.0.1:443" subsys=k8s
level=info msg="Starting apiserver on address 127.0.0.1:9234" subsys=cilium-operator-api
level=info msg="Establishing connection to apiserver" host="https://10.96.0.1:443" subsys=k8s
level=error msg="Unable to contact k8s api-server" error="Get \"https://10.96.0.1:443/api/v1/namespaces/kube-system\": dial tcp 10.96.0.1:443: connect: connection refused" ipAddr="https://10.96.0.1:443" subsys=k8s
level=fatal msg="Unable to connect to Kubernetes apiserver" error="unable to create k8s client: unable to create k8s client: Get \"https://10.96.0.1:443/api/v1/namespaces/kube-system\": dial tcp 10.96.0.1:443: connect: connection refused" subsys=cilium-operator-generic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O operador e os agentes não conseguem se comunicar com o node control plane do Kubernetes. Isso ocorre porque o &lt;code&gt;kube-proxy&lt;/code&gt; não está instalado no cluster e, portanto, o Kubernetes service dentro do cluster não pode ser alcançado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configurar o endpoint do Kubernetes service para Cilium
&lt;/h2&gt;

&lt;p&gt;Para resolver o problema anterior em que os pods do Cilium não conseguem se conectar ao API server do Kubernetes, precisamos configurar o API server do cluster para ouvir em um endereço IP que possa ser acessado pelos pods do Cilium.&lt;/p&gt;

&lt;p&gt;O Kind executa os nodes do cluster em contêineres Docker em uma rede dedicada. Os contêineres em execução na rede do kind podem resolver os endereços IP de outros contêineres pelo nome.&lt;/p&gt;

&lt;p&gt;Se observarmos os contêineres Docker iniciados pelo Kind com o comando &lt;code&gt;docker ps&lt;/code&gt;, deveríamos ver algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   IMAGE                  NAMES
b4badebf3db8   kindest/node:v1.27.3   kind-worker3
195cfd2b59e7   kindest/node:v1.27.3   kind-worker
81de0b8dbf18   kindest/node:v1.27.3   kind-control-plane
9f4b82ee120b   kindest/node:v1.27.3   kind-worker2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O contêiner &lt;code&gt;kind-control-plane&lt;/code&gt; é nosso nó mestre do Kubernetes e executa o API server (na porta 6443). Enquanto estivermos nos contêineres em execução na rede do kind, o nome &lt;code&gt;kind-control-plane&lt;/code&gt; deve ser resolvível. Podemos usá-lo para configurar o endpoint do API server do Kubernetes usado pelos pods do Cilium:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --values - &amp;lt;&amp;lt;EOF
kubeProxyReplacement: true
k8sServiceHost: kind-control-plane # node mestre na rede do kind
k8sServicePort: 6443               # porta do API server
hostServices:
  enabled: false
externalIPs:
  enabled: true
nodePort:
  enabled: true
hostPort:
  enabled: true
image:
  pullPolicy: IfNotPresent
ipam:
  mode: kubernetes
hubble:
  enabled: true
  relay:
    enabled: true
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após algum tempo, os pods do Cilium e os nodes do cluster devem se tornar &lt;code&gt;Ready&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instalar um ingress controller
&lt;/h2&gt;

&lt;p&gt;Neste ponto, o cluster deve estar em execução, utilizando &lt;strong&gt;Cilium CNI&lt;/strong&gt;, sem &lt;code&gt;kube-proxy&lt;/code&gt;, e tudo deve funcionar conforme o esperado.&lt;/p&gt;

&lt;p&gt;Para obter algo útil dele, agora devemos instalar um &lt;strong&gt;ingress controller&lt;/strong&gt; e o &lt;strong&gt;Cilium Hubble UI&lt;/strong&gt; para visualizar a rede no cluster.&lt;/p&gt;

&lt;p&gt;Vamos instalar o &lt;code&gt;ingress-nginx&lt;/code&gt; e usar o &lt;a href="https://nip.io/" rel="noopener noreferrer"&gt;nip.io&lt;/a&gt; para acessar o Hubble UI em execução dentro do cluster.&lt;/p&gt;

&lt;p&gt;Isso requer configurar a especificação do cluster kind para &lt;strong&gt;expor portas adicionais do host&lt;/strong&gt; e permitir que nosso ingress controller receba tráfego:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kind delete cluster &amp;amp;&amp;amp; kind create cluster --config - &amp;lt;&amp;lt;EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  disableDefaultCNI: true
  kubeProxyMode: none
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    listenAddress: 127.0.0.1
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    listenAddress: 127.0.0.1
    protocol: TCP
- role: worker
- role: worker
- role: worker
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode conferir a nova label atraves de &lt;code&gt;kubectl get nodes --show-labels=true&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                 STATUS   ROLES           AGE   VERSION   LABELS
kind-control-plane   Ready    control-plane   13h   v1.27.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress-ready=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=kind-control-plane,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
kind-worker          Ready    &amp;lt;none&amp;gt;          13h   v1.27.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kind-worker,kubernetes.io/os=linux
kind-worker2         Ready    &amp;lt;none&amp;gt;          13h   v1.27.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kind-worker2,kubernetes.io/os=linux
kind-worker3         Ready    &amp;lt;none&amp;gt;          13h   v1.27.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kind-worker3,kubernetes.io/os=linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instale o Cilium com o Hubble UI habilitado e acessível em ingress hubble-ui.127.0.0.1.nip.io:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm upgrade --install --namespace kube-system --repo https://helm.cilium.io cilium cilium --values - &amp;lt;&amp;lt;EOF
kubeProxyReplacement: true
k8sServiceHost: kind-control-plane
k8sServicePort: 6443
hostServices:
  enabled: false
externalIPs:
  enabled: true
nodePort:
  enabled: true
hostPort:
  enabled: true
image:
  pullPolicy: IfNotPresent
ipam:
  mode: kubernetes
hubble:
  enabled: true
  relay:
    enabled: true
  ui:
    enabled: true
    ingress:
      enabled: true
      annotations:
        kubernetes.io/ingress.class: nginx
      hosts:
        - hubble-ui.127.0.0.1.nip.io
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, instale o ingress controller &lt;code&gt;ingress-nginx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/kind/deploy.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observação: Talvez seja necessário alterar as tolerations para garantir que o ingress controller seja agendado corretamente nos nós do cluster. Você pode fazer isso adicionando a seguinte configuração ao seu pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl edit deploy -n ingress-nginx ingress-nginx-controller 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane 
          operator: Equal 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após algum tempo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os pods do Cilium devem ficar &lt;code&gt;Ready&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;O  ingress controller &lt;code&gt;ingress-nginx&lt;/code&gt; deve ser escalonado no cluster&lt;/li&gt;
&lt;li&gt;O Hubble UI deve ser acessível em &lt;a href="http://hubble-ui.127.0.0.1.nip.io" rel="noopener noreferrer"&gt;http://hubble-ui.127.0.0.1.nip.io&lt;/a&gt; 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2vma96g0myjzgfj130.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2vma96g0myjzgfj130.png" alt="Image description" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cilium</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
