# Kubernetes Tutorial ## setup [reference](https://hackmd.io/@gdsc-ntcu/k8s) ### k8s installation (all nodes) ```bash! # uninstall k8s sudo systemctl stop kubelet sudo kubeadm reset sudo apt-get purge kubeadm kubectl kubelet kubernetes-cni kube* sudo apt-get autoremove sudo rm -rf $HOME/.kube sudo rm -rf /etc/cni/net.d sudo iptables --flush # install k8s (v1.31) sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gpg curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl sudo systemctl enable --now kubelet ``` ### container runtime installation (all nodes) ```bash! # uninstall docker sudo systemctl stop docker sudo systemctl stop containerd sudo systemctl stop docker.socket sudo apt-get purge -y docker.io sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras dpkg -l | grep -i docker # see your installed packages # install docker # sudo apt-get install -y docker.io sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # containerd setup sudo mkdir /etc/containerd sudo sh -c "containerd config default > /etc/containerd/config.toml" sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml sudo systemctl restart containerd sudo systemctl restart kubelet sudo docker info | grep -i cgroup # ensure docker use systemd cgroup driver ``` ### machine setup (all nodes) ```bash! # machine setup sudo swapoff -a sudo nano /etc/fstab # any lines contain "swap" sudo hostnamectl set-hostname <name> # set hostname on all nodes sudo nano /etc/hosts # set dns on all nodes (192.168.50.119 master, ...) # kernel module cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # kernel parameter cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system ``` ### cluster initialization ```bash! # pull image on master node sudo kubeadm config images pull # master node initialization sudo kubeadm init \ --apiserver-advertise-address=192.168.50.119 \ --pod-network-cidr=10.244.0.0/16 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # cni (calico) ### modify calico.yaml first ### search "Auto-detect the BGP IP address. ### at the same level, insert: ### - name: IP_AUTODETECTION_METHOD ### value: "interface=can-reach=8.8.8.8" curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml -O kubectl apply -f calico.yaml # worker node initialization <provided kubeadm join command> # check cluster status kubectl get nodes # check joined worker nodes kubectl get pods --all-namespaces # confirm the cluster is running kubeadm token create --print-join-command # if you forgot the command ``` ## K8s Installation Problem - calico and coredns pods keep pending - solution 1: ```bash sudo mkdir -p /etc/containerd/ containerd config default | sudo tee /etc/containerd/config.toml ``` Add `SystemdCgroup = true` in `config.toml`, and then restart the containerd ```bash sudo systemctl daemon-reload sudo systemctl restart containerd ``` - solution 2: ``` // before cluster initialization sudo systemctl restart containerd ``` [reference](https://github.com/labring/sealos/issues/834) - a node's "calico-node-xxxxx" and "kube-proxy-xxxxx" keep crashLoopBackOff - check the dns resolution of that node - may need to add `8.8.8.8` or `8.8.4.4` - can ping www.google.com ## Some Useful Command ``` kubectl create deployment <dp-name> --image=<image location> kubectl expose deployment/<dp-name> --type="NodePort" --port <port> kubectl exec -ti <pod name> -- bash kubectl delete pods --field-selector status.phase=Failed kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' kubectl cluster-info dump | grep -m 1 cluster-cidr ``` ## Basic Tutorial From kubernetes interactive tutorial ### Create a kubernetes cluster ``` minikube version minikube start kubectl version kubectl cluster-info kubectl get nodes ``` ### Deploy an App ``` kubectl version kubectl get nodes kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 kubectl get deployments echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; kubectl proxy curl http://localhost:8001/version export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/ ``` ### Explore your App ``` kubectl get pods kubectl describe pods echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; kubectl proxy export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/ kubectl logs $POD_NAME kubectl exec $POD_NAME -- env kubectl exec -ti $POD_NAME -- bash cat server.js curl localhost:8080 exit ``` ### Expose your app publicly ``` kubectl get pods kubectl get services kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080 kubectl get services kubectl describe services/kubernetes-bootcamp export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT curl $(minikube ip):$NODE_PORT kubectl describe deployment kubectl get pods -l app=kubernetes-bootcamp kubectl get services -l app=kubernetes-bootcamp export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME kubectl label pods $POD_NAME version=v1 kubectl describe pods $POD_NAME kubectl get pods -l version=v1 kubectl delete service -l app=kubernetes-bootcamp kubectl get services curl $(minikube ip):$NODE_PORT kubectl exec -ti $POD_NAME -- curl localhost:8080 ``` ### Scale up Your App ``` kubectl get deployments kubectl get rs kubectl scale deployments/kubernetes-bootcamp --replicas=4 kubectl get deployments kubectl get pods -o wide kubectl describe deployments/kubernetes-bootcamp kubectl describe services/kubernetes-bootcamp export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT curl $(minikube ip):$NODE_PORT kubectl scale deployments/kubernetes-bootcamp --replicas=2 kubectl get deployments kubectl get pods -o wide ``` ### Updating Your App ``` kubectl get deployments kubectl get pods kubectl describe pods kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 kubectl get pods kubectl describe services/kubernetes-bootcamp export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT curl $(minikube ip):$NODE_PORT kubectl rollout status deployments/kubernetes-bootcamp kubectl describe pods kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10 kubectl get deployments kubectl get pods kubectl describe pods kubectl rollout undo deployments/kubernetes-bootcamp kubectl get pods kubectl describe pods ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up