Lightning Lab - 1
Introduction
Lightning Lab - 1 문제 풀어보자.
Summary
export samp="--dry-run=client -o yaml"
export now="--force --grace-period 0"
$samp, $now붙은건 이 명령어로 약어만든거니까 주의
Kubectl Reference Docs
kubernetes.io
# 1
클러스터 업그레이드 하란다.
클러스터 업그레이드는
1. controlplane - kubeadm, kubelet, kubectl세개 업그레이드
2. worker node - kubelet, kubectl 두개 업그레이드
해주면 된다.
그리고
Upgrading kubeadm clusters
This page explains how to upgrade a Kubernetes cluster created with kubeadm from version 1.30.x to version 1.31.x, and from version 1.31.x to 1.31.y (where y > x). Skipping MINOR versions when upgrading is unsupported. For more details, please visit Versio
kubernetes.io
공식문서 링크임.
1. drain부터 하자
drain조건이 있을텐데 여기 문제에선 둘다하라는거같음.
이걸로 업그레이드전에 drain해주면 된다.
controlplane drain후 스케줄링 안되는상태를 확인할수 있음.
2. kube adm부터 업그레이드 하자.
이 명령어 치라고 함. 시험환경은 ubuntu os니까 우분투로 하면댐.
sudo apt update
sudo apt-cache madison kubeadm
gpg키 에러남.. 왜이러는지 모르겠는데 예전에 할떄는 잘됐는데 이상하다.
그래서 포스팅에선 그냥 하는 방법만 기억나는대로 적겠음.
암튼 이거치고나서
공문 저 커맨드 쳐주면 되는데 저기서 버전을 수정해야 한다. 원하는 버전이 1.31.0이니까..
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.31.x-*' && \
sudo apt-mark hold kubeadm
저기 1.31.x를 수정해주면댐.
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.31.0-*' && \
sudo apt-mark hold kubeadm
그럼 아마 1.31.0이 안될텐데
vi /etc/apt/sources.list.d/kubernetes.list
저기서 1.30을 1.31로 바꾸고 다시
sudo apt update
sudo apt-cache madison kubeadm
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.31.0-*' && \
sudo apt-mark hold kubeadm
이 커맨드 치면 업그레이드 잘 될거임.
참고로 kode kloud는 apt 패키지를 버전을 위에처럼 설정해줘야하는데 실제 시험에서는 설정안해줘도 바로 apt update로 진행 잘된다.
그리고
kubeadm version
kube adm을 보면 버전이 원하는 버전으로 잘 됐을거임. (사진은 안되서 그냥 예시만 보여준거임.)
만약 잘못된 버전으로 업그레이드 헀다면 다시 캐시삭제하고 버전설정해서 업데이트하자.
sudo kubeadm upgrade plan
암튼 다음으로 이거로 upgrade plan을 확인하면
이렇게 리소스들의 현재버전 타겟버전 확인가능할거임. 여기가 1.31머시기로 떠있으면댐.
sudo kubeadm upgrade apply v1.31.x
이걸로 버전 최종적으로 확인해서 업그레이드.
시간이 좀 걸릴거다.
3. kubelet과 kubectl업그레이드
만약 워커노드라면 controlplane으로 돌아와서 워커노드 drain을 하고 시작하샘.
공문에서 좀더 내리면 이거있음.
sudo apt-mark unhold kubelet kubectl && \
sudo apt-get update && sudo apt-get install -y kubelet='1.31.x-*' kubectl='1.31.x-*' && \
sudo apt-mark hold kubelet kubectl
얘도 원하는 버전으로 x를 바꿔서 업그레이드 해주면 된다.
sudo systemctl daemon-reload
sudo systemctl restart kubelet
데몬 재시작해주샘. 그럼 다한거다.
만약 문제에서 control plane을 업그레이드하라고 하면 1,2둘 다 실행해줘야 하고 만약 워커노드를 업그레이드하라면 kubelet, kubectl만 업그레이드 해주면 된다. (ssh로 접속해야함)
업그레이드가 끝나면
uncordon해주면 댐.
- 검토
kubectl version
kubeadm version
kubelet --version
kubectl describe pod -n kube-system|grep -i image
- 실제시험에선?
내가 본 시험에선 controlplane노드만 업그레이드 하면 됐었다. 위에서도 썼지만 직접 apt에서 가져올 버전 수정하는 과정은 없이 바로 진행됐다. 포스팅시에 왜 갑자기 레지스트리가 안되는지 ㅡㅡ
# 2 안풀어도댐!
admin머시기 ns에 있는 deployment를 저 양식대로 쓰라는데.. 아마 원하는 리소스 뽑아서 정보저장하는건데 난 처음풀떄 직접 일일히 다 적음.
안풀어도됨.
# 3 안풀어도댐!
config파일 trouble shooting 문제
몰라
# 4
롤링업데이트 문제
kubectl create deployment nginx-deploy --image nginx:1.16 --replicas 1
먼저 만들라는 deployment를 확
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx-deploy
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deploy
spec:
containers:
- image: nginx:1.16
name: nginx
resources: {}
status: {}
~
잘 만들어짐
kubectl set image deployment/nginx-deploy nginx=nginx:1.17
이미지 업데이트
잘됐다
참고로 set image커맨드가 자동완성이 안되는데
Kubectl Reference Docs
kubernetes.io
kubectl reference에서 set image로 검색하면 잘 나옴.
난 뭐 거의 외워감..
# 5
deployment가 실행안되고 있는데 트러블 슈팅하라고 함.
솔찍히 이거 배운개념 다 들어가서 풀수 있는 문제인데 이런 유형은 안나옴. 난 풀어봄.
간단하게 말하면 pv, pvc가 bound안되어있는 상태임. 이거 수정해서 bound되게 해주면 된다.
먼저 저 deployment가 관리하는 pod상태부터 보면
kubectl describe pod -n alpha alpha-mysql-78f449b485-xj22n
mysqp-alpha-pvc라는 pvc가 없다는데?
둘다 확인해보니 일단 저 pv갖다쓰려는 pvc이름이 alpha-claim임. mysql-alpha-pvc로 바꿔줘야겠고.. 스토리지 클래스도 안맞음.
kubectl edit pvc -n alpha alpha-claim
edit으로 확인하니까 요구하는 storage도 pv가 1Gi짜린데 2기가 요구하고 있음 ㅋㅋ
어쎄스 모드도 안맞고.
걍 새로 만들자.
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Persistent Volumes
This document describes persistent volumes in Kubernetes. Familiarity with volumes, StorageClasses and VolumeAttributesClasses is suggested. Introduction Managing storage is a distinct problem from managing compute instances. The PersistentVolume subsystem
kubernetes.io
persistent volume 공식문서
저거를 맞게 수정해주자.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-alpha-pvc
namespace: alpha
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 1Gi
storageClassName: slow
bound가 잘 됐다. 이제 볼륨이 잘 동작한다는 얘기.
이제 pod를 확인해보면 컨테이너가 잘 동작함.
# 6
etcd 백업 문제.
mock exam 2의 1번문제랑 완전 똑같다. 때문에 풀이 안쓸거임.
# 7
secret 문제임.
조건에 해당하는 pod를 만들어보면
kubectl run secret-1401 -n admin1401 --image busybox $samp --command -- sleep 4800 > 7.yaml
먼저 yaml만 따주고
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: secret-1401
name: secret-1401
namespace: admin1401
spec:
containers:
- command:
- sleep
- "4800"
image: busybox
name: secret-admin
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
저기 컨테이너 이름을 지워줘야함. 커맨드만으론 이름이 secret-1401로 지어니까.
그리고 secret volume이랑 mount해줘야함.
https://kubernetes.io/docs/concepts/configuration/secret/
Secrets
A Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key. Such information might otherwise be put in a Pod specification or in a container image. Using a Secret means that you don't need to include confiden
kubernetes.io
공식문서에서 pod쪽 보면
요거있음.
문제에서 주어진 secret도 저렇게 만들어져있음.
적절히 조합해서 pod yaml을 수정해주면
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: secret-1401
name: secret-1401
namespace: admin1401
spec:
containers:
- command:
- sleep
- "4800"
image: busybox
name: secret-admin
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
volumes:
- name: secret-volume
secret:
secretName: dotfile-secret
저 부분 추가. 그냥 공식문서 양식이랑 똑같음 ㅋㅋ
이걸로 apply 해서 만들어주자.
검토해보니 잘 갖다 쓴데
- 실제시험에선?
기억이 잘 안나는데 시크릿을 직접 만들어줬던것같음. 그리고 걍 갖다 쓰는걸로.
이건 이미 만들어진 secret을 파일로 마운트하는거고
secret은 생성할때 literal로 생성하는 방법으로 해야하니 꼭 알고가자. yaml로 하면 인코딩떄문에 문제생김.