[{"Value":"","Discard":false,"Expires":9999999999}]
La entrada OpenSearch for SREs: The Open-Source Observability Powerhouse on Kubernetes se publicó primero en CloudArch.
]]>In the dynamic world of cloud-native infrastructure, robust observability is not just a nice-to-have; it’s a foundational requirement for any Site Reliability Engineer (SRE). For years, Elasticsearch dominated the landscape for log aggregation and search. However, a significant licensing change by Elastic in early 2021 created a void, prompting AWS to fork the last Apache 2.0 licensed version and launch OpenSearch.
What is OpenSearch? At its core, OpenSearch is a distributed, RESTful search and analytics engine built on Apache Lucene. It’s designed for high-volume data ingestion and rapid querying across massive datasets. Think of it as a specialized database for semi-structured data like logs, metrics, and traces.
Why is its open-source nature important for SREs? The “open” in OpenSearch isn’t just a marketing buzzword; it’s critical for SREs:
For an SRE, OpenSearch provides the backbone for what’s often called the “OSD Stack” (OpenSearch, OpenSearch Dashboards, and Data Prepper/Fluent Bit), empowering proactive monitoring, rapid incident response, and deep operational insights.
To wield OpenSearch effectively, you need to understand its fundamental building blocks:
cluster_manager (formerly “master”) nodes (brains for cluster state), others are data nodes (muscles for storing and searching data), and some can be ingest nodes (for pre-processing data). SREs design clusters with dedicated nodes for stability and scale.application-logs-2026.02.08).The best way to understand OpenSearch is to run it. We’ll set up a mini-stack on Minikube (or any Kubernetes cluster) that mirrors a production setup for logs:
All configurations will be declarative, using Helm charts and Kubernetes Jobs, making it fully automated and version-controllable—true SRE style.
kubectl installed and configuredhelm installedEnsure your Minikube has enough resources for OpenSearch:
minikube start --cpus 4 --memory 8192 --driver dockerhelm repo add opensearch https://opensearch-project.github.io/helm-charts/
helm repo add fluent https://fluent.github.io/helm-charts
helm repo updateWe’ll use a values.yaml file to set up a single-node OpenSearch cluster with a secure admin password and OpenSearch Dashboards.
Save the following as opensearch-values.yaml:
# opensearch-values.yaml
singleNode: true
persistence:
enabled: false # For a lab, we'll keep it stateless. Set to true for production with PVs.
extraEnvs:
- name: OPENSEARCH_INITIAL_ADMIN_PASSWORD
value: YourStrongPassword123! # <<< CHANGE THIS TO A STRONG PASSWORDNow deploy:
helm install my-os opensearch/opensearch -f opensearch-values.yaml
helm install my-dashboards opensearch/opensearch-dashboardsNote: OpenSearch will take a few minutes to start as it initializes its JVM and security plugin. Keep an eye on kubectl get pods -w.
This is our log source:
kubectl create deployment nginx-server --image=nginx
kubectl expose deployment nginx-server --port=80Fluent Bit will scrape Nginx logs and send them to OpenSearch. We’ll use a fluent-bit-values.yaml to handle the configuration declaratively and resolve common SRE headaches (DNS, auth, mapping issues).
Save the following as fluent-bit-values.yaml:
# fluent-bit-values.yaml
config:
service: |
[SERVICE]
Daemon Off
Flush 1
Log_Level info
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
Health_Check On
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
filters: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed
Keep_Log Off
# These help prevent mapping conflicts from inconsistent pod labels
Labels Off
Annotations Off
outputs: |
[OUTPUT]
Name es
Match *
Host my-os-opensearch # This is the Kubernetes Service name for OpenSearch
Port 9200
HTTP_User admin
HTTP_Passwd YourStrongPassword123! # <<< USE THE SAME PASSWORD AS ABOVE
Logstash_Format On
Logstash_Prefix nginx-logs
tls On
tls.verify Off
Suppress_Type_Name On # Crucial for OpenSearch 2.x
Trace_Error On # For better debugging in Fluent Bit logsDeploy Fluent Bit:
helm install fluent-bit fluent/fluent-bit -f fluent-bit-values.yamlIn a Kubernetes ecosystem, logs are ephemeral—when a pod dies, its logs go with it. To prevent this, we need a DaemonSet that acts as a “log vacuum.” We chose Fluent Bit because it’s the lightweight, high-performance cousin of Fluentd. It has a tiny memory footprint (crucial when you’re running it on every node in a cluster) and handles the “Log Pipeline” in three distinct stages:
.log files created by the Kubernetes container engine on the node’s disk.When you look at a Fluent Bit configuration, it’s organized into distinct sections. Each one has a specific job in the “Ingestion Lifecycle.” Understanding these is the key to onboarding any new service into OpenSearch.
[SERVICE] (The Global Brain): This section defines the engine’s behavior. It controls how often data is “flushed” (sent) to the destination, where the internal logs go, and whether to enable a health-check server. For SREs, this is where we tune performance and monitoring for the log shipper itself.[INPUT] (The Collector): This is the “vacuum cleaner.” It tells Fluent Bit where to get data. In Kubernetes, we usually use the tail input to follow the log files generated by the container runtime (CRI/Docker). You can have multiple inputs—one for system logs, one for app logs, and even one for metrics.[FILTER] (The Processor): This is where the magic happens. Filters allow you to modify data in flight.[OUTPUT] (The Destination): This defines the “Exit” for your data. In our case, it’s the es (Elasticsearch/OpenSearch) plugin. This section handles the connection details, authentication, and index naming conventions.This is where the SRE magic happens. We’ll use a Job to apply our ISM policy (7-day retention) and create the nginx-logs-* index pattern in Dashboards, all via API calls.
Save the following as observability-setup-job.yaml:
# observability-setup-job.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: opensearch-sre-setup-script
data:
setup.sh: |
#!/bin/bash
set -euo pipefail
OPENSEARCH_USER="admin"
OPENSEARCH_PASSWORD="YourStrongPassword123!" # <<< USE THE SAME PASSWORD
DASHBOARDS_URL="http://my-dashboards-opensearch-dashboards.default.svc.cluster.local:5601"
OPENSEARCH_URL="https://my-os-opensearch.default.svc.cluster.local:9200"
echo "Waiting for OpenSearch Dashboards to be available..."
until curl -s -u "$OPENSEARCH_USER:$OPENSEARCH_PASSWORD" -k "$DASHBOARDS_URL/api/status" | grep -q "available"; do
sleep 5
done
echo "OpenSearch Dashboards is available."
echo "Creating ISM policy: nginx_retention..."
curl -X PUT "$OPENSEARCH_URL/_plugins/_ism/policies/nginx_retention" \
-u "$OPENSEARCH_USER:$OPENSEARCH_PASSWORD" -k -H "Content-Type: application/json" \
-d '{
"policy": {
"description": "Delete logs after 7 days",
"default_state": "hot",
"states": [
{
"name": "hot",
"actions": [],
"transitions": [
{
"state_name": "delete",
"conditions": { "min_index_age": "7d" }
}
]
},
{
"name": "delete",
"actions": [ { "delete": {} } ],
"transitions": []
}
],
"ism_template": [
{
"index_patterns": ["nginx-logs-*"],
"priority": 100
}
]
}
}'
echo "ISM policy created."
echo "Creating OpenSearch Dashboards Index Pattern: nginx-logs-pattern..."
curl -X POST "$DASHBOARDS_URL/api/saved_objects/index-pattern/nginx-logs-pattern" \
-u "$OPENSEARCH_USER:$OPENSEARCH_PASSWORD" -H "osd-xsrf: true" -H "Content-Type: application/json" \
-d '{
"attributes": {
"title": "nginx-logs-*",
"timeFieldName": "@timestamp"
}
}'
echo "Index pattern created."
---
apiVersion: batch/v1
kind: Job
metadata:
name: opensearch-observability-setup
spec:
template:
spec:
containers:
- name: setup-runner
image: curlimages/curl:latest # A lightweight image with curl and bash
command: ["bash", "/scripts/setup.sh"]
volumeMounts:
- name: setup-script
mountPath: /scripts
volumes:
- name: setup-script
configMap:
name: opensearch-sre-setup-script
defaultMode: 0744 # Make the script executable
restartPolicy: OnFailureApply the setup Job:
kubectl apply -f observability-setup-job.yamlBefore we fire off the job, let’s talk about what’s happening under the hood. We aren’t just pushing config; we are defining the lifecycle and visibility of our data.
nginx-logs-* into one continuous timeline so you can query across multiple days without lifting a finger.To see logs, your Nginx server needs visitors:
kubectl run load-gen --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -qO- http://nginx-server; sleep 2; done"Port-forward Dashboards to your local machine:
kubectl port-forward svc/my-dashboards-opensearch-dashboards 5601:5601Then, open https://localhost:5601 in your browser. Log in with admin and your chosen password. Go to the “Discover” tab, select nginx-logs-* in the dropdown, set your time range (e.g., “Last 15 minutes”), and watch your logs flow in!
By following this automated approach, you’ve built a robust, observable, and easily reproducible log aggregation stack with OpenSearch. You’ve tackled critical SRE challenges like security, data ingestion, and lifecycle management—all as code. This hands-on experience forms a solid foundation for further exploration into metrics, traces, and advanced alerting in your cloud-native environments.
What other OpenSearch challenges will you automate next?
See the whole code at my repository
La entrada OpenSearch for SREs: The Open-Source Observability Powerhouse on Kubernetes se publicó primero en CloudArch.
]]>La entrada Introduction to KEDA: Event-Driven Autoscaling for Kubernetes se publicó primero en CloudArch.
]]>This is where KEDA (Kubernetes Event-Driven Autoscaling) comes in. KEDA is a lightweight, open-source component that integrates with Kubernetes to provide event-driven autoscaling. Unlike traditional Horizontal Pod Autoscalers (HPAs) that only scale based on CPU or memory usage, KEDA can scale your workloads based on external metrics or events, such as:
With KEDA, your applications can react instantly to real-world workloads without over-provisioning resources. It allows you to run microservices cost-effectively while maintaining responsiveness.
In this guide, we’ll build a realistic event-driven microservice that processes jobs from a Redis queue. The scenario mirrors what many production systems face:
By the end of this guide, you will have:
This project is valuable because it lets you experience a real-world autoscaling scenario. Most production systems have unpredictable workloads, and learning how KEDA responds to events gives you a deep understanding of:
Even if your real application is more complex (with multiple queues or different event sources), this example provides a solid foundation to implement production-ready, cost-efficient, and resilient services.
What you’ll learn:
Make sure you have the following locally installed and working on your machine:
If any of those are missing, install them first. For example on Debian/Ubuntu: sudo snap install kubectl –classic (or use your distro’s package manager). I will not assume any particular OS beyond these tools being available.
# Start minikube with 3 nodes (one control-plane + 2 workers), adjust memory/
CPUs if needed
$ minikube start --nodes=3 --driver=docker --memory=4096 --cpus=2
# Verify nodes come up
$ kubectl get nodesNotes: –nodes=3 creates 1 control-plane and 2 worker nodes by default. If you already have the cluster running, skip the minikube start step. Make sure kubectl context points to your minikube cluster: kubectl config current-context .
This command will install Helm for you in your local machine. Please, refer to this other post if you wanna learn more about it.
# Add KEDA Helm repo and update
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
# Install KEDA into namespace 'keda'
helm install keda kedacore/keda --namespace keda --create-namespace
# Wait for KEDA pods to become ready
kubectl -n keda get podsWhy Helm? Helm is the easiest official way to install KEDA and its CRDs. KEDA installs CRDs that are required for ScaledObject and ScaledJob resources.
I’ll explain each file before showing it. All manifests are designed to run in the default namespace for simplicity. You can change namespace fields if you prefer.
# redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7.0-alpine
ports:
- containerPort: 6379
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "250m"
memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
name: redis
labels:
app: redis
spec:
ports:
- port: 6379
targetPort: 6379
protocol: TCP
selector:
app: redis
type: ClusterIP
As we should know already, we are gonna deploy this in our cluster with:
kubectl apply -f redis-deployment.yamlTo be sure the redis service is client, we can test the connectivity with a redis client:
kubectl run -i --tty redis-client --image=redis:7.0-alpine --restart=Never
-- sh
# inside pod shell run: redis-cli -h redis ping
# should reply PONGWe’ll create a tiny Python worker that continuously polls a Redis list (named job-queue ) with BRPOP and “processes” messages (here, just sleep and echo ). Just to replicate some functionality of reading from Redis. The purpouse of this guide is not the logic of the code itself but it’s realibility on production environments.
In real life your worker would do meaningful job processing.
# worker.py
import time
import os
import redis
REDIS_HOST = os.getenv('REDIS_HOST', 'redis')
REDIS_PORT = int(os.getenv('REDIS_PORT', '6379'))
LIST_NAME = os.getenv('LIST_NAME', 'job-queue')
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, decode_responses=True)
print('Worker started, connecting to', REDIS_HOST)
while True:
try:
# BRPOP blocks until an item is available
item = r.brpop(LIST_NAME, timeout=5)
if item:
# item is (list_name, value)
value = item[1]
print('Processing', value)
# simulate processing
time.sleep(2)
print('Done', value)
else:
# nothing to do, sleep to avoid tight loop
time.sleep(1)
except Exception as e:
print('Worker error:', e)
time.sleep(2)# Dockerfile.worker
FROM python:3.11-slim
WORKDIR /app
COPY worker.py .
RUN pip install --no-cache-dir redis
CMD ["python","/app/worker.py"]By default if we create the image, it will be in our local registry and Minikube won’t see it. To solve this problem we can enable an addon called registry which will allow us to create a registry in Minikube.
minikube addons enable registryWe need to do a port-forward to forward the data to the registry:
kubectl port-forward -n kube-system service/registry 5000:80And now, in other terminal to not terminate our tunnel, we need to build and push the image so it can be used within the cluster:
docker build -t keda-worker:latest -f Dockerfile.worker .
docker tag keda-worker:latest localhost:5000/keda-worker:latest
docker push localhost:5000/keda-worker:latestAnd now we need to create the deployment of our service using the brand new image:
# worker-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: keda-worker
labels:
app: keda-worker
spec:
replicas: 0 # start with 0 so we can see KEDA scale up from zero
selector:
matchLabels:
app: keda-worker
template:
metadata:
labels:
app: keda-worker
spec:
containers:
- name: worker
image: localhost:5000/keda-worker:latest
imagePullPolicy: Always
env:
- name: REDIS_HOST
value: "redis"
- name: REDIS_PORT
value: "6379"
- name: LIST_NAME
value: "job-queue"
resources:
requests:
cpu: "50m"
memory: "64Mi"
limits:
cpu: "200m"
memory: "256Mi"Please, pay attention that we stated that we want a total of 0 replicas since the design of this is to only run when Keda allows it, saving us computing time and resources in our cluster.
kubectl apply -f worker-deployment.yamlNow that we have Redis ready to have message and our service ready to start reading those messages when it’s needed, we need to create a ScaledObject which will tell our service when it’s time to work, create instances and do its job.
# scaledobject-redis.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: keda-worker-scaledobject
labels:
app: keda-worker
spec:
scaleTargetRef:
name: keda-worker
pollingInterval: 5 # how often KEDA checks Redis (seconds)
cooldownPeriod: 30 # how long to wait after scale down before next check
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: redis
metadata:
address: "redis.default.svc:6379"
listName: "job-queue"
listLength: "5" # scale target: number of items -> triggers scale
activationListLength: "1" # minimum backlog to activate scaling
Fields explained:
Please, pay special attention at triggers.type since that value is unique for the kind of job we are doing. Keda provides us with an extensive list of different triggers we can use depending on what we want to observe in order to scale our services. You can have a complete list at their official site.
Keda and Redis are on different namespaces on our cluster, when specifying the address make sure you are pointing correctly to Redis. If you don’t use
defaultnamespace as I did, it will be different thanredis.default.svc:6379
kubectl apply -f scaledobject-redis.yamlFinally, we are going to create a cronjob that will just generate some load to replicate a real user, and will just push a message to redis every minute so we can emulate the whole flow automatically and don’t hit any button neither waiting for an user.
# producer-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: job-producer
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: producer
image: redis:7.0-alpine
command: [ "sh", "-c" ]
args:
- |
now=$(date +%s)
echo "Producing job-$now"
redis-cli -h redis rpush job-queue job-$now
sleep 1kubectl apply -f producer-cronjob.yamlFor this purpose I have splited my terminal into 3 sections, so I can see everything at one glance. First I have to sections of the same size: right and left.
On the right size I will be running the logs of the Scaled Object to see how it’s being triggered everytime it sees there is 1 or more messages in the queue
kubectl logs -f -n keda keda-operator-f948b6c4-ln9chAnd then the left side I will have it splitted into two parts again. In the upper part I will be checking how many messages do I have on the list
watch 'kubectl exec -it deploy/redis -- redis-cli llen job-queue'And at the botton I will be watching the number of pods from my deplotments
watch 'kubectl get deploy'
There we will be able to see how every minute the list has a new message, a pod of the worker is being created and the message is deleted. Reading all the logs in the right side.
By this way, we could have a service that only will be running when it’s needed. But also, this can be replicated and configured to just scale up or down services based on some triggers to ensure we are always giving the desired availability and reliability.
kubectl delete -f producer-cronjob.yaml
kubectl delete -f scaledobject-redis.yaml
kubectl delete -f worker-deployment.yaml
kubectl delete -f redis-deployment.yaml
helm uninstall keda -n keda
kubectl delete namespace kedaYou can see and download all the code on GitHub https://github.com/JoaquinJimenezGarcia/LearningKeda
La entrada Introduction to KEDA: Event-Driven Autoscaling for Kubernetes se publicó primero en CloudArch.
]]>La entrada Helm Repositories: Your Gateway to Kubernetes Apps 🗂️⛵ se publicó primero en CloudArch.
]]>If Helm is the Kubernetes version of a package manager, then Helm repos are its treasure chests. And just like any good explorer, you’re going to need to know where to find the maps.

Let’s imagine you’re building a house in Kubernetes. Instead of crafting each brick by hand (writing all those YAMLs), you can order a ready-to-assemble kit. That kit? It’s called a Helm chart. And where do you get it from? A Helm repository.
A Helm repo is basically a collection of Helm charts — pre-packaged Kubernetes applications that are ready for deployment. These charts are stored in an online repository, which you can connect to and browse from your terminal.
Think of it like a Play Store or App Store, but for Kubernetes.
The Helm team maintains a default, stable repo full of widely-used applications: NGINX, MySQL, Prometheus, Grafana, WordPress… you name it. One of the most popular ones is from Bitnami, which packages and maintains a huge collection of up-to-date and secure charts.
But the real beauty is this: you can add any Helm repo to your local setup — official, third-party, or even your own private one.


Adding a Helm repo is as simple as a single command. For example, to add Bitnami’s public repository:
helm repo add bitnami https://charts.bitnami.com/bitnamiThat’s it. You’ve just connected your Helm CLI to a vast world of applications.
Want to make sure everything’s in sync?
helm repo updateThis command refreshes the list of available charts and their latest versions from all the repos you’ve added.
To check which repos you currently have on your machine:
helm repo listIt’ll show you a tidy little table with all your configured repositories. Nice and clean.
helm search 
Once you’ve added a repository — say Bitnami — and updated it, you’re probably thinking: “Cool… but what can I actually install?”
That’s where the magic of searching comes in.
You can use:
helm search repo wordpressAnd Helm will scan through all your added repositories and list any charts that match the name “wordpress”. It’ll even show you the latest version and a short description — kind of like browsing a menu at a restaurant, but for apps in your Kubernetes cluster
.
Want to see everything available from Bitnami? Just do:
helm search repo bitnamiAnd boom — a full buffet of deployable goodness.
This command is especially useful when you’re not quite sure what you’re looking for, or when you’re exploring new tools to add to your stack.


Now comes the fun part. Let’s say you want to install WordPress in your Kubernetes cluster (because why not launch a blog while you’re launching containers?
).
Installing any chart is as easy as using the helm install command following with some parameters:
helm install <name for your app, you choose it> <reponame_chart>Once you’ve added Bitnami’s repo, you can run:
helm install my-wordpress bitnami/wordpressBoom. Helm fetches the chart from the Bitnami repo, installs it into your cluster, and gives you all the necessary info to access it.
You don’t even need to download the chart locally unless you want to customize it (more on that in a future post
).

When you install a chart from a repo, Helm does a few things:
.tgz (tar.gz) package that contains all the YAML templates, values, and configuration.The best part? You didn’t touch a single YAML file.

Getting familiar with Helm repos is a crucial step in mastering Helm — and honestly, it’s where the fun begins. You now have access to hundreds of production-grade Kubernetes apps, just a command away.
But don’t stop here.
Next, we’re going to explore how to customize these charts to suit your environment, your values, and your style (yes, Kubernetes can have style
).
Until then, try playing with a few different charts. Install Redis, launch a full monitoring stack with Prometheus + Grafana, or spin up your own Jenkins CI system — all in just a few keystrokes.
Your cluster will thank you. 
Enjoying the series?
Make sure to follow, subscribe, or share this post with someone who still thinks Helm is just something you wear on a boat. 
#Helm #Kubernetes #DevOps #CloudNative #K8s #InfrastructureAsCode #HelmCharts
La entrada Helm Repositories: Your Gateway to Kubernetes Apps 🗂️⛵ se publicó primero en CloudArch.
]]>La entrada What is Helm? The Kubernetes Package Manager Explained for Beginners 🚀 se publicó primero en CloudArch.
]]>
Welcome to the first post in our Helm series! Whether you’re a DevOps engineer, cloud enthusiast, or just getting started with Kubernetes, you’re about to discover a powerful tool that can make your life way easier: Helm.
In this post, we’ll dive into:
Let’s jump right in!

Imagine managing a complex application in Kubernetes — dozens of YAML files, multiple services, deployments, secrets, configs, and everything in between. It’s like assembling IKEA furniture without the manual.
Helm is here to be your manual.
It’s the package manager for Kubernetes — just like apt is for Ubuntu or yum is for CentOS, but made for the cloud-native world.
With Helm, you can:
In short: Helm makes deploying to Kubernetes faster, simpler, and less error-prone.

Kubernetes is powerful, but managing it manually is like juggling flaming swords. Here are some real headaches Helm helps with:
1. Too many YAML files
Applications often require multiple resources: Deployments, Services, ConfigMaps, Ingresses, etc. Helm bundles them into one chart.
2. Hard-coded values
Editing the same YAML files over and over to change values (like image tags or environment settings)? Helm allows dynamic values with templates and variables.
3. No easy way to upgrade or rollback
With Helm, you can upgrade an app version and roll back instantly if something goes wrong.
4. App reuse across environments
Want the same app in dev, staging, and prod with just different configs? Helm makes it effortless.

Helm isn’t just a nice-to-have — it’s a must-have for scalable, maintainable Kubernetes environments.
Here’s why:
• Saves Time 
Automate and simplify deployments with one-liners.
• Improves Consistency
Avoid human error and deploy the same app across environments with confidence.
• Version Control Friendly
Helm charts can live in Git, making your infrastructure-as-code even more powerful.
• Easily Shareable
Share your charts with teammates or open source them for the community.
• Built-in Rollbacks
One bad deployment? Roll it back like it never happened.

Ready to get started? Installing Helm is quick and painless.
Step 1: Download the Helm Binary
For macOS:
brew install helmFor Linux:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bashFor Windows:
Use Chocolatey or Scoop:
choco install kubernetes-helmStep 2: Verify the Installation
helm versionYou should see something like:
version.BuildInfo{Version:"v3.x.x", GitCommit:"...", ...}Boom — you’re ready to helm your ship! 
In the next post, we’ll break down what a Helm Chart really is, how it’s structured, and how to create your very first one.
If you’re enjoying this series, don’t forget to:
Until next time — keep it cloud-native! 
La entrada What is Helm? The Kubernetes Package Manager Explained for Beginners 🚀 se publicó primero en CloudArch.
]]>La entrada How to deploy your Kubernetes app – Part II se publicó primero en CloudArch.
]]>In this new post we will be seeing how to integrate our first Kubernetes deployment by default and learn the basics to start automating our services and workloads.

Before starting we must have something to deploy. For this lab I have prepared a default deployment that will create 3 pods with a Nginx container in each. You can take a look or using it by this link: https://github.com/JoaquinJimenezGarcia/argocd-deploy-test but in case you want to create your own repo basically it looks like this:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80Now that we have our ArgoCD up and running, we will see that it’s empty. However in the upper left corner we would see a button labeled “New App”. We must click there and a new window will pop up with some info we must complete.

However these are the most important fields we need to fill:
Now we have all these fields ready, we need to click on create app and ArgoCD autimatically will go to our repo, read the yaml files and execute them.
Because this is only a small YAML file, we should see just a few seconds later our app completeley deployed

If we want to double check, we can go to our cluster and examine the pods looking to see if the pod names match with the ones are deployed there:

And as we can see, the results matches, so our app is perfectly deployed.
So as we marked the auto sync, now it will be reading our Git each 3 minutes to detect changes and apply them. So if for example we push a PR changing the replicas from 3 to 5, it would be updated automatically without more human interaction.

La entrada How to deploy your Kubernetes app – Part II se publicó primero en CloudArch.
]]>La entrada How to deploy your Kubernetes app – Part I se publicó primero en CloudArch.
]]>In this first part we will be covering the ArgoCD installation using minikube. However, the exactly same steps can be followed in another Kubernetes environment. In the cloud or on-premises.

Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application state.
You can read more info in their official website
Taking into consideration we already have minikube installed and running with kubectl correctly configured, we just need to create a namespace and deploy a Kubernetes yaml file from the official ArgoCD repository.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlIt’s important to keep the namespace as the one in the examnple because the manifest we are downloading includes references to it such as some for Service Accounts. If we want or we need to change it, we would need to download the repository before applying the manifest and change the references to the namespace.
Since we are gonna be working in the namespace we just created, a good practice would be setting up the defualt namespace to that one to avoid confusion.
kubectl config set-context --current --namespace=argocdRight after that we would be ready to install the argo command line tool to interact with our ArgoCD via the console. We can just download it from https://github.com/argoproj/argo-cd/releases/latest but if you are using Mac, it can be easier to install it using brew.
brew install argocdWe are able to check that ArgoCD is sucessfully deployed by checking the containers in the current namespace.
k get po
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 30m
argocd-applicationset-controller-65bb5ff89-wrfw9 1/1 Running 0 30m
argocd-dex-server-6f898cbd9-4f52l 1/1 Running 0 30m
argocd-notifications-controller-64bc7c9f7-rpfxk 1/1 Running 0 30m
argocd-redis-5df55f45b7-x8snc 1/1 Running 0 30m
argocd-repo-server-74d5f58dc5-96zmf 1/1 Running 0 30m
argocd-server-5b86767ddb-lxjl5 1/1 Running 0 30mBy default ArgoCD is not exposed to an external IP, so if we need to acces it from outside for example to add new apps or to check the status or our current apps, we must create a Load Balancer, an Ingress or do a port-fordwarding.
Since we are working on minikube, with the port-forwarding would be more than enough. But for cloud environments Ingress may be the right fit. We would be covering now only port-forwarding, but in a later part of this serie we would be working on customizating our ArgoCD by adding other clusters to deploy our apps and exposing it under other kind of network Services.
kubectl port-forward svc/argocd-server -n argocd 8080:443After forwarding we would be able to see our Argo in our localhost.

Your credentials were stored in a Secret in your Kubernetes cluster when you were deploying it, but also you can use the argo command-line tool to retrieve the password. The user by default is “admin”.
argocd admin initial-password -n argocdHowever a good practice is always changing the default password of your service, you can do it also using the argocd command-line tool
argocd account update-passwordOnce we have logged in using our credentials, we should see a site like the following.

If you enjoyed reading this first part, stay tune to get to know in the next one how to configure the deployment on ArgoCD of our apps.
Also, if you need to know more about Kubernetes, visit our latest posts.
La entrada How to deploy your Kubernetes app – Part I se publicó primero en CloudArch.
]]>La entrada Solving CKA exercises – Part 4 se publicó primero en CloudArch.
]]>Service Accounts are essential to impersonate and consume resources in our clusters, they can be used by services, applications or even users. We can create roles based on Kubernetes’ permissions and binding those to Service Accounts, so we can get granted those permissions.
We can choose between Roles and ClusterRoles, where the first ones are created in the context of a namespace and the second one are created at Cluster level, so it can be reused across different namespaces and contexts.
Also, when creating the binding to add that role to a Service Account we can choose between RoleBinding and ClusterRoleBinding, where the first one does the binding at context level and the second one at the cluster lever, making it available for all the resources from the cluster specified on the permissions attached to it.
If you like it, don’t forget to see other exercises on KillerCoda and read more posts about Kubernetes.
La entrada Solving CKA exercises – Part 4 se publicó primero en CloudArch.
]]>La entrada Solving CKA exercises – Part 3 se publicó primero en CloudArch.
]]>Solving these CKA exercises you will learn how to store in a safer place logs from pods even if they have multiple containers and to read them to be able to fix a Deployment which is not working.
Don’t forget to visit killercoda to get more exercises like this one and visit our other posts from Kuberentes
La entrada Solving CKA exercises – Part 3 se publicó primero en CloudArch.
]]>La entrada Solving CKA exercises – Part 2 se publicó primero en CloudArch.
]]>La entrada Solving CKA exercises – Part 2 se publicó primero en CloudArch.
]]>La entrada Solving CKA exercises – Part 1 se publicó primero en CloudArch.
]]>In this new series we will be watching video by video different exercises of the CKA exam and we will be solving them together with their explanation to be able to manage Kubernetes without problems!
You can find this exercise and more labs regarding other exams at https://killercoda.com/ but if you want to learn more about cloud computing, visiting our entries about Kubernetes
La entrada Solving CKA exercises – Part 1 se publicó primero en CloudArch.
]]>