K8s Cluster Upgrade


# k8s apt repository ๋ฆฌ์ŠคํŠธ ํŒŒ์ผ ์ˆ˜์ •
echo -e "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /" > /etc/apt/sources.list.d/kubernetes.list

# apt ์—…๋ฐ์ดํŠธ ํ›„ kubeadm ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ
apt update
apt-cache madison kubeadm

apt-get install kubeadm=1.32.0-1.1

kubeadm upgrade plan v1.32.0
kubeadm upgrade apply v1.32.0
kubectl get nodes

apt-get install kubelet=1.32.0-1.1
systemctl restart kubelet
kubectl get nodes
# ๋จผ์ € node01 ์— ์‹คํ–‰์ค‘์ธ Pod ์„ drain ํ•˜๊ณ 
kubectl drain node01

# node01 ์œผ๋กœ ์ ‘์†ํ•œ ๋’ค
ssh node01

# k8s apt repository ๋ฆฌ์ŠคํŠธ ํŒŒ์ผ ์ˆ˜์ •
echo -e "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /" > /etc/apt/sources.list.d/kubernetes.list

# apt ์—…๋ฐ์ดํŠธ ํ›„ kubeadm ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ
apt update
apt-cache madison kubeadm

apt-get install kubeadm=1.32.0-1.1

kubeadm upgrade node config --kubelet-version v1.32.0

apt-get install kubelet=1.32.0-1.1
systemctl restart kubelet

exit

kubectl uncordon node01

Extracting JSON information


k get deployments.apps -n=admin2406 -o=json
k get deployments.apps -n=admin2406 -o=custom-columns=DEPLOYMENT:.metadata.name,CONTAINER_IMAGE:.spec.template.spec.containers[0].image,READY_REPLICAS:.status.readyReplicas,NAMESPACE:.metadata.namespace > /opt/admin2406_data

Fix kubeconfig


# kubeconfig ํŒŒ์ผ์„ ํ™•์ธํ•˜๊ณ 
kubectl get pods --kubeconfig /root/CKA/admin.kubeconfig

# ๊ธฐ๋ณธ ์„ค์ •์„ ํ™•์ธํ•œ ๋’ค
cat ~/.kube/config

# ํ‹€๋ฆฐ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ณ 
vi /root/CKA/admin.kubeconfig

# ๋‹ค์‹œ kubeconfig ํŒŒ์ผ์„ ํ™•์ธ
kubectl get pods --kubeconfig /root/CKA/admin.kubeconfig

Rolling Update


kubectl create deployment nginx-deploy --image=nginx:1.16
kubectl set image deployment/nginx-deploy nginx=nginx:1.17

Fix PVC


# Deployment ํ™•์ธ
kubectl get deployment -n alpha alpha-mysql  -o yaml | yq e .spec.template.spec.containers -

# Pod ์—๋Ÿฌ ํ™•์ธ
kubectl get pods -n alpha
kubectl describe pod -n alpha alpha-mysql-xxxxxxxx-xxxxx

# PV ํ™•์ธ
kubectl get pv alpha-pv
# PVC ์ˆ˜์ •
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-alpha-pvc
  namespace: alpha
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: slow

ETCD Backup


# etcd ์Šค๋ƒ…์ƒท ์ƒ์„ฑ
export ETCDCTL_API=3
etcdctl snapshot save /opt/etcd-backup.db \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key
etcdctl snapshot status snapshot.db

Create Pod with Command and Secret Volume


# YAML ํŒŒ์ผ ์ƒ์„ฑ
kubectl run secret-1401 -n admin1401 --image busybox --dry-run=client -o yaml --command -- sleep 4800 > admin.yaml

vi admin.yaml

# ํ•„์š”ํ•œ ๋ถ€๋ถ„ ์ถ”๊ฐ€
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: secret-1401
  name: secret-1401
  namespace: admin1401
spec:
  volumes:
  - name: secret-volume
    secret:
      secretName: dotfile-secret
  containers:
  - command:
    - sleep
    - "4800"
    image: busybox
    name: secret-admin
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: /etc/secret-volume

์œ ํ˜•

  1. ETCD Backup, Restore
  2. Control Plane Upgrade, kubeadm, kubelet, kubectl
  3. Network Policy ๋ฐฐํฌ
  4. Ingress ๋ฐฐํฌ
  5. Deployment ๋ฐฐํฌ
  6. Pod ์— label ํ• ๋‹น ํ›„ ๋ฐฐํฌ
  7. WorkerNode Not Ready to Ready ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  8. Node Selector ๋ฅผ ํ†ตํ•ด ํŠน์ • Node ์— Pod ๋ฐฐํฌ
  9. PVC ์ƒ์„ฑ (PV ์™€ SC ๋Š” ์ฃผ์–ด์ง) + kubectl edit ๋˜๋Š” kubectl patch ๋กœ ์šฉ๋Ÿ‰ ๋ณ€๊ฒฝ
  10. Pod ๋กœ๊ทธ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋‹จ์–ด๊ฐ€ ๋“ค์–ด๊ฐ„ ๋กœ๊ทธ ์ถ”์ถœ

Create Pod with multiple containers (8)

k -n mc-namespace run mc-pod --image=nginx:1-alpine -o=yaml --dry-run=client > mc-pod.yaml

vi mc-pod.yaml
# mc-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  namespace: mc-namespace
  name: mc-pod
spec:
  containers:
  - name: mc-pod-1
    image: nginx:1-alpine
    env:
    - name: NODE_NAME
      valueFrom:
        fieldRef:
          fieldPath: spec.nodeName
  - name: mc-pod-2
    image: busybox:1
    command:
    - "sh"
    - "-c"
    - "while true; do date >> /var/log/shared/date.log; sleep 1; done"
    volumeMounts:
    - name: shared-volume
      mountPath: /var/log/shared
  - name: mc-pod-3
    image: busybox:1
    command:
    - "sh"
    - "-c"
    - "tail -f /var/log/shared/date.log"
    volumeMounts:
    - name: shared-volume
      mountPath: /var/log/shared
  volumes:
  - name: shared-volume
    emptyDir: {}
k -n mc-namespace get pod
k -n mc-namespace logs mc-pod -c mc-pod-3 -f

Install container runtime (7)

~ ssh bob@node01
bob@node01's password:

bob@node01 ~ sudo su

root@node01 /home/bob cd /root

root@node01 ~ ls
cri-docker_0.3.16.3-0.debian.deb

root@node01 ~ dpkg -i ./cri-docker_0.3.16.3-0.debian.deb

root@node01 ~ systemctl enable cri-docker

root@node01 ~ systemctl status cri-docker

root@node01 ~ systemctl is-enabled cri-docker
enabled

Expose pod with Service (8)

controlplane ~ k get pods
NAME        READY   STATUS    RESTARTS   AGE
messaging   1/1     Running   0          4m2s

controlplane ~ k expose pod messaging --port=6379 --name=messaging-service
service/messaging-service exposed

controlplane ~ k get svc
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes          ClusterIP   172.20.0.1     <none>        443/TCP    48m
messaging-service   ClusterIP   172.20.26.32   <none>        6379/TCP   6s

References