Skip to main content

Kubernetes(k8s)

Minikube

  • Minimum 4GB ram.
  • Its restart (stop/start) process will not save your deployed resources (Pod, Deployment, Service, ConfigMap, etc) by default.
# Minikube
# Ubuntu 24.04

sudo apt install -y curl wget apt-transport-https

## Download And Install Minikube Binary
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
sudo usermod -aG docker $USER && newgrp docker # or logout/in again

gnome-session-quit --no-prompt # Desktop logout

## Test
docker run hello-world
minikube version

## kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/
kubectl version -o yaml

## minikube
minikube start --driver=docker
## Start minikube with customize resources
minikube start --addons=ingress --cpus=2 --cni=flannel --install-addons=true --kubernetes-version=stable --memory=4g

minikube status

kubectl cluster-info
kubectl get nodes

## Managing Minikube Addons
minikube addons list
minikube dashboard enable # or minikube addons enable dashboard

mkdir k8s; cd k8s

Practice

Nginx

tee nginx-deployment.yaml > /dev/null <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF

tee nginx-service.yaml > /dev/null <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
EOF

tee nginx-ingress.yaml > /dev/null <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /nginx
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
EOF

minikube addons enable ingress
kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml
kubectl get pods
kubectl get svc
kubectl get ingress
minikube ip
# Deploy nginx based deployment
kubectl create deployment my-app --image=nginx

# Verify deployment status
kubectl get deployments.apps my-app
kubectl get pods

## Expose the deployment
kubectl expose deployment my-app --name=my-app-svc --type=NodePort --port=80
kubectl get svc my-app-svc

kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec": {"type": "LoadBalancer"}}'
minikube tunnel

## Get service url
URL=$(minikube service my-app-svc --url)
curl $URL

minikube stop
minikube config set cpus 4
minikube config set memory 8192
minikube delete
minikube start

# Other

sudo minikube start --driver=none

## Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.32.0 requires conntrack to be installed in root's path
sudo apt-get install -y conntrack
sudo ln -s /usr/sbin/conntrack conntrack /usr/bin/conntrack

## Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.32.0 requires crictl to be installed in root's path
CRICTL_VERSION="v1.33.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$CRICTL_VERSION/crictl-$CRICTL_VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$CRICTL_VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$CRICTL_VERSION-linux-amd64.tar.gz

## Please install cri-dockerd
curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.17/cri-dockerd_0.3.17.3-0.debian-bookworm_amd64.deb; sudo dpkg -i cri-dockerd_0.3.17.3-0.debian-bookworm_amd64.deb

## Please install containernetworking-plugins
sudo apt install -y containernetworking-plugins
wget https://github.com/containernetworking/plugins/releases/download/v1.6.2/cni-plugins-linux-amd64-v1.6.2.tgz
sudo mkdir -p /opt/cni/bin
sudo tar -C /opt/cni/bin -xzvf cni-plugins-linux-amd64-v1.6.2.tgz
sudo mkdir -p /etc/cni/net.d

# Microservice for fetching the latest posts of Medium.
kubectl create deployment medium-api \
--image=evenchange4/micro-medium-api:latest \
--port=3000
kubectl get deployments # default
kubectl get pods -o wide

kubectl expose deployment medium-api --type=LoadBalancer
kubectl get service
minikube service medium-api

kubectl scale deployment/medium-api --replicas=2
kubectl get pods -o wide

kubectl get deployment medium-api -o yaml

# Ack
template:
spec:
containers:
- name: micro-medium-api

kubectl set image deployments/medium-api \
micro-medium-api=evenchange4/micro-medium-api:2.1.0
kubectl rollout status deployments/medium-api
# Logs
kubectl logs --follow deployments/medium-api
# Execute Commands
kubectl exec deployments/medium-api -it -- ls

# Kill
kubectl delete service medium-api
kubectl delete deployment medium-api
minikube stop

# Oh-my-zsh Autocompletion Plugin
sudo apt install -y zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
vi ~/.zshrc
# plugins=(git) to plugins=(git kubectl)

kubectl get services medium-api -o yaml > ./service.yaml
kubectl create -f ./service.yaml

kubectl get deployments --all-namespaces

kubectl delete deployments medium-api
kubectl delete pod medium-api

# Helm v3

wget https://get.helm.sh/helm-v3.17.0-linux-amd64.tar.gz
tar -xvf helm-v3.17.0-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin
helm version
helm init

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install my-wordpress-new bitnami/wordpress
kubectl get svc --namespace default -w my-wordpress
kubectl get services

helm install my-release \
--set wordpressUsername=admin \
bitnami/wordpress

helm install \
my-release \
-f values.yaml \
stable/wordpress

helm create mcs-lite-chart
cd mcs-lite-chart
helm install --dry-run --debug . my-mcs-lite-chart
helm install mcs-lite-chart .

helm ls
helm upgrade mcs-lite-app .
helm rollback mcs-lite-app 1
helm install ./charts/mcs-lite-chart-0.1.0.tgz

Akamai Linode Kubernetes Cluster(LKE)

dockerfile

FROM openjdk:21
COPY springbact-node.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

service.yaml

apiVersion: v1
kind: Service
metadata:
name: spring-demo-service
spec:
selector:
app: spring-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-demo
spec:
replicas: 3
selector:
matchLabels:
app: spring-demo
template:
metadata:
labels:
app: spring-demo
spec:
containers:
- name: spring-demo
image: rojarsmith/spring-k8s-demo
ports:
- containerPort: 8080
docker build -t rojarsmith/spring-k8s-demo .
docker login
docker push rojarsmith/spring-k8s-demo

$env:KUBECONFIG = "D:\k8s\cluster-1-kubeconfig.yaml"

kubectl get nodes
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get svc spring-demo-service

http://172.232.179.115/node

kubectl get pods -o wide
kubectl logs spring-demo-6c5bd786fb-q87jt
kubectl rollout restart deployment spring-demo
kubectl delete pod spring-demo-f944c8d4d-62kfp

kubectl get deployment spring-demo -o yaml | grep replicas
kubectl get deployment spring-demo -o yaml
kubectl get pods | grep Error | awk '{print $1}' | xargs kubectl delete pod