Storage 참고: https://kubernetes.io/docs/concepts/storage/volumes/
작업 클러스터 : k8s
다음 조건에 맞춰서 nginx 웹서버 pod가 생성한 로그파일을 받아서 STDOUT으로 출력하는 busybox 컨테이너를 운영하시오.
Pod Name: weblog
Web container:
- Image: nginx:1.17
- Volume mount : /var/log/nginx
- Readwrite
Log container:
- Image: busybox
- args: /bin/sh, -c, "tail -n+1 -f /data/access.log"
- Volume mount : /data
- readonly
emptyDir 볼륨을 통한 데이터 공유
kubectl config use-context k8s
kubectl run weblog --image=nginx:1.17 --dry-run=client -o yaml > weblog.yaml
vi weblog.yaml
kubectl apply -f weblog.yaml
kubectl get pv
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: weblog
name: weblog
spec:
containers:
- image: nginx:1.17
name: weblog
volumeMounts:
- mountPath: /var/log/nginx
name: weblog
- image: busybox
name: log
args: [/bin/sh, -c, 'tail -n+1 -f /data/access.log']
volumeMounts:
- mountPath: /data
name: weblog
readOnly: true
volumes:
- name: weblog
emptyDir: {}
1./data/cka/fluentd.yaml 파일을 만들어 새로은 Pod 생성하세요. (신규생성 Pod Name : fluentd, image : fluentd, namespace : default)
2. 위 조건을 참고하여 다음 조건에 맞게 볼륨마운트를 설정하시오.
1) Worker node의 도커 컨테이너 디렉토리 /var/lib/docker/containers 동일 디렉토리로 pod에 마운트 하시오.
2) Worker node의 /var/log 디렉토리를 fluentd Pod에 동일이름의 디렉토리 마운트하시오.
참고: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
작업 클러스터 : hk8s
pv001라는 이름으로 size 1Gi, access mode ReadWriteMany를 사용하여 persistent volume을
생성합니다.
volume type은 hostPath이고 위치는 /tmp/app-config입니다.
kubectl config use-context hk8s
vi pv001.yaml
kubectl apply -f pv001.yaml
kubectl get pv
kubectl describe pv pv001
- kubectl config use-context k8s
- 다음의 조건에 맞는 새로운 PersistentVolumeClaim 생성하시오.
Name: pv-volume
Class: app-hostpath-sc
Capacity: 10Mi- 앞서 생성한 pv-volume PersistentVolumeClaim을 mount하는 Pod를 생성하시오.
Name: web-server-pod
Image: nginx
Mount path: /usr/share/nginx/html
Volume에서 ReadWriteMany 액세스 권한을 가지도록 구성합니다.
kubectl describe pod
명령어로 확인
kubectl config use-context k8s
vi pvc.yaml
kubectl get node
kubectl apply -f pvc.yaml
kubectl get pvc,pv
vi pvc-pod.yaml
kubectl apply -f pvc-pod.yaml
kubectl describe pod web-server-pod
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
storageClassName: app-hostpath-sc
apiVersion: v1
kind: Pod
metadata:
name: web-server-pod
spec:
volumes:
- name: weblog
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: web-server-pod
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: weblog
kube-proxy 정상적인지
Docker 데몬이 정상적인지
Kubelet 데몬이 정상적인지
coreDNS 정상적인지
참고 사항: https://kubernetes.io/docs/reference/kubectl/cheatsheet/
app Log 모니터링
kubectl logs PODNAME -c CONTAINER_NAME
Pod가 사용하는 CPU나 Memory 리소스 정보 보기
Node가 사용하는 CPU나 Memory 리소스 정보 보기
kubectl config use-context hk8s
Pod custom-app의 로그 모니터링 후 'file not found' 오류가 있는 로그 라인 추출(Extract)해서
/var/CKA2022/custom-app-log 파일에 저장하시오.
kubectl config use-context k8s
클러스터에 구성된 모든 PV를 capacity별로 sort하여 /var/CKA2022/my-pv-list 파일에 저장하시오.
PV 출력 결과를 sort하기 위해 kubectl 명령만 사용하고, 그 외 리눅스 명령은 적용하지 마시오.
kubectl config use-context hk8s
kubeclt top pods -l name=overloaded-cpu --sort-by=cpu
echo '`가장 높은 점유율을 가진 pod의 이름`' > /var/CKA2023/custom-app-log
kubectl config use-context hk8s
hk8s-worker2 라는 이름의 worker node가 현재 NotReady 상태에 있습니다. 이 상태의 원인을 조사하고 hk8s-worker2 노드를 Ready
상태로 전환하여 영구적으로 유지되도록 운영하시오.
영구적
으로 유지해야하므로 start
가 아닌, enable --now
를 사용해야 함.
kubectl config use-context hk8s
ssh hk8s-worker2
sudo systemctl status kubelet
sudo systemctl enalbe --now kubelet
exit
kubectl config use-context hk8s
Worker Node 동작 문제 해결
hk8s-worker2 라는 이름의 worker node가 현재 NotReady 상태에 있습니다. 이 상태의 원인을 조사하고hk8s-worker2 노드를
Ready 상태로 전환하여 영구적으로 유지되도록 운영하시오.
주의 사항: upgrade는 반드시 Master Node에서 작업해야함.
cluster upgrade 참고: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
순서:
1. 업그레이드 - kubeadm upgrade
2. 버전 확인 - kubeadm version
3. plan - kubeadm upgrade plan
4.
작업 클러스터 : hk8s
마스터 노드의 모든 Kubernetes control plane및 node 구성 요소를 버전 1.27.1 버전으로 업그레이드합니다.
master 노드를 업그레이드하기 전에 drain 하고 업그레이드 후에 uncordon해야 합니다.
"주의사항" 반드시 Master Node에서 root권한을 가지고 작업을 실행해야 한다.
tip: upgrade 관련 명령어 실행시 vi 편집기로 파일을 생성하여 작업하는 것이 좋음.
# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-uncordon> --ignore-daemonsets
# replace x in 1.27.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && apt-get update && apt-get install -y kubelet=1.27.x-00 kubectl=1.27.x-00 && apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# replace <node-to-uncordon> with the name of your node
kubectl uncordon <node-to-uncordon>
# Find the latest 1.27 version in the list.
# It should look like 1.27.x-00, where x is the latest patch.
apt update
apt-cache madison kubeadm
apt-mark unhold kubeadm && apt-get update && apt-get install -y kubeadm=1.27.1-00 && apt-mark hold kubeadm
kubeadm version
kubeadm upgrade plan
sudo kubeadm upgrade apply v1.27.1 -y
kubeadm upgrade node
kubeadm upgrade apply
# replace <node-to-drain> with the name of your node you are draining
kubectl drain hk8s-worker1 --ignore-daemonsets
# replace x in 1.27.x-00 with the latest patch version
apt-mark unhold kubelet kubectl && apt-get update && apt-get install -y kubelet=1.27.1-00 kubectl=1.27.1-00 && apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
# replace <node-to-uncordon> with the name of your node
kubectl uncordon hk8s-worker1
kubectl get nodes
-> drain
, cordon
작업 클러스터 : k8s
k8s-worker2 노드를 스케줄링 불가능하게 설정하고, 해당 노드에서 실행 중인 모든 Pod을 다른
node로 reschedule 하세요.
drain
: node를 schedule 불가능하게 만들고, 해당 node에 있는 pod들을 다른 node로 reschedule.
cordon
: node를 schedule 불가능하게 만듦.
uncordon
: drain 및 cordon로 인해 schedule 불가능하게 된 node를 다시 schedule 가능하도록 만듦.
kubectl config use-context k8s
kubectl drain k8s-worker2 --ignore-daemonsets --force --delete-emptydir-data
kubectl get nodes
-> uncordon
사용
kubectl uncordon k8s-worker2