일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- aws cloud
- docker
- tftp
- AWS
- aws iam
- NAT
- Ebs
- AWS 자격증
- linux
- GNS3
- vyos
- KUBECTL
- aws saa
- ALB
- vmware
- Kubernetes
- Troubleshooting
- aws cloud school
- 네트워크
- load balancer
- aws SAA-c03
- 쿠버네티스
- SAA-C03
- DNS
- EC2 인스턴스
- aws cloud shcool 8
- FTP
- Firewall
- IAM
- EC2
- Today
- Total
나의 공부기록
[Kubernetes] 01. Kubernetes & Pod & Control Plane 주요 컴포넌트 본문
Kubernetes(쿠버네티스)
- 컨테이너 오케스트레이션 툴
kubeadm을 통한온프레미스 클러스터 구성
k8s 템플릿 생성
1. 환경 설정
- IP : 211.183.3.250/24

2. Docker 설치
- 이미지 빌드를 하기 위한 도구로 사용하기 위함(컨테이너 런타임은 아님)
- 도커 재시작 스케줄링
2-1. Docker 설치
root@master-250410:~# curl -fsSL https://get.docker.com -o get-docker.sh
root@master-250410:~# chmod +x get-docker.sh
root@master-250410:~# ./get-docker.sh
# Executing docker install script, commit: 4c94a56999e10efcf48c5b8e3f6afea464f9108e
+ sh -c apt-get -qq update >/dev/null
2-2. Docker0 인터페이스 자동 재시작 스크립트
root@master-250410:~# sudo tee /root/check_ip_and_restart_docker.sh<<EOF
> #!/bin/bash
>
> if ! ip add | grep -q 172.17; then
> systemctl restart docker
> fi
> EOF
#!/bin/bash
if ! ip add | grep -q 172.17; then
systemctl restart docker
fi
root@master-250410:~# chmod 777 /root/check_ip_and_restart_docker.sh
root@master-250410:~# crontab -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 2
crontab: installing new crontab
* * * * * /root/check_ip_and_restart_docker.sh
3. 디스크 확장
3-1. 디스크 추가

3-2. 디스크 확장 설정
root@master-250410:~# vgextend ubuntu-vg /dev/sdb
Physical volume "/dev/sdb" successfully created.
Volume group "ubuntu-vg" successfully extended
root@master-250410:~# lvextend -l +100%FREE -n /dev/mapper/ubuntu--vg-ubuntu--lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from 10.00 GiB (2560 extents) to <58.22 GiB (14904 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
root@master-250410:~# resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 8
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 15261696 (4k) blocks long.
root@master-250410:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 389M 1.5M 388M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 58G 4.4G 51G 8% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/loop0 62M 62M 0 100% /snap/core20/1611
/dev/sda2 1.8G 111M 1.5G 7% /boot
/dev/loop1 47M 47M 0 100% /snap/snapd/16292
/dev/loop2 68M 68M 0 100% /snap/lxd/22753
tmpfs 389M 0 389M 0% /run/user/0
[ 기본 서식 ]
vgextend ubuntu-vg /dev/sdb
lvextend -l +100%FREE -n /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
4. yaml 수정도구
root@master-250410:~# vi ~/.vimrc
" Enable file type detection
filetype on
" Enable syntax highlighting
syntax on
" Enable auto-indentation for YAML files
autocmd FileType yaml setlocal autoindent smartindent expandtab shiftwidth=2 tabstop=2
autocmd FileType yml setlocal autoindent smartindent expandtab shiftwidth=2 tabstop=2
5. Kubernetes-template 생성


공통 설정 - Master/Worker1/Worker2
1. k8s-tem에서 복사 - worker1/worker2
- worker1 : 211.183.3.110/24
- worker2 : 211.183.3.120/24
- hostname 변경
- cluster를 구성할 때, hostname이 동일하면 인식을 하지 못하는 문제가 발생할 수 있기 때문에, 필수로 변경해줘야 함
root@worker2-250410:~# hostnamectl set-hostname worker2-250410
2. Cluster 공통 설정
2-1. 네트워크 설정
- 방화벽 상태 : inactive 확인
➡️ 만약 방화벽이 켜져있다면 ufw disable 명령어 실행


2-2. 네트워크 관련 모듈 로딩
root@worker2-250410:~# modprobe overlay
root@worker2-250410:~# modprobe br_netfilter
2-3. containerd 트래픽 제어 파일 생성
- 쿠버네티스와 컨테이너의 네트워크 트래픽 제어하기 위한 파일 생성
root@worker2-250410:~# tee /etc/sysctl.d/kubernetes.conf<<EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> net.ipv4.ip_forward = 1
> EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
root@worker2-250410:~# tee /etc/modules-load.d/containerd.conf <<EOF
> overlay
> br_netfilter
> EOF
overlay
br_netfilter
# 파일 설정 적용
root@master-250410:~# sysctl --system
[ 원본 서식 ]
- 쿠버네티스 제어 파일
tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
- containerd 제어 파일
tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
2-4. 가상메모리 중지 및 비활성화
- 쿠버네티스 클러스터는 가상메모리가 활성화되어 있으면 클러스터가 구성이 안됨
➡️ 성능 문제와 예측 불가능한 동작을 초래할 수 있기 때문 👉 swap 비활성화
root@master-250410:~# swapoff -a
- 클러스터가 재시작됐을 때, Swap이 비활성화 상태어야 하기 때문에, 주석처리

- swap 메모리가 0인지 확인

✅ 직접 들어가서 수정하지 않고 sed로 변경해도 됨
- 간혹 안될 경우, 메모장에 복사 후 ➡️ 사용
sed -i '/^\/swap.img/s/^/#/' /etc/fstab
3. CRI(Container Runtime Interface) 설치 - containerd

- CRI : 컨테이너 런타임과 쿠버네티스의 kubelet 사이의 상호작용을 정의하는 표준 인터페이스
- 쿠버네티스가 컨테이너 런타임을 독립적으로 작동할 수 있게 해 주며, 다양한 컨테이너 런타임을 사용할 수 있도록 지원
- CRI 구성요소
- Container Runtime : 실제로 컨테이너를 생성하고 관리하는 소프트웨어
- Kubelet : 각 노드에서 실행되는 관리 에이전트로, 쿠버네티스 클러스터 내에서 컨테이너를 시작하고 관리한느 역할
- 컨테이너 규격이 동일하기 때문에, containerd가 아닌 다른 툴을 사용해도 문제 없음
- 쿠버네티스 클러스터를 구성하기 위해 containerd를 사용
- 쿠버네티스의 기본 실행 단위인 Pod도 결국 컨테이너로 구성되어 있으며, 이 컨테이너를 실행하고 삭제하기 위해서는 docker나 containerd, CRI-O같은 컨테이너를 구현해줄 도구가 필요
➡️ 도구 = 컨테이너 런타임
3-1. gpg key 다운로드
- gpg key : 내가 설치할 패키지의 무결성을 검증하기 위한 키
root@master-250410:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
# 원본 서식
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
3-2. 내 레포지토리에 목록 추가
root@master-250410:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 원본 서식
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
3-3. 레포지토리 업데이트 ➡️ 목록 갱신
root@worker2-250410:~# apt-get update -y
3-4. CRI 설치 - containerd
root@master-250410:~# apt-get install -y containerd.io
Reading package lists... Done
Building dependency tree
Reading state information... Done
containerd.io is already the newest version (1.7.27-1).
0 upgraded, 0 newly installed, 0 to remove and 91 not upgraded.
# 원본 서식
apt-get install -y containerd.io
3-5. containerd 설정 파일 생성
root@master-250410:~# mkdir -p /etc/containerd
# 원본 서식
mkdir -p /etc/containerd
3-6. 기본 설정을 포함한 설정 파일 생성
root@master-250410:~# containerd config default>/etc/containerd/config.toml
root@master-250410:~# cat /etc/containerd/config.toml
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2
[cgroup]
path = ""
...
# 원본 서식
containerd config default>/etc/containerd/config.toml
3-7. containerd 재부팅 & 활성화
root@master-250410:~# systemctl restart containerd
root@master-250410:~# systemctl enable containerd
4. 쿠버네티스 v1.30 설치(kubectl, kubelet, kubeadm)
- kubectl : k8s 클러스터에 REST API 요청(https로 api요청)하기 위한 명령어
- 이 명령어와 인증/인가 파일만 있다면 어디서든 내 클러스터에 요청할 수 있음
- kubelet : 노드 관리자
- kubeadm : kubectl이 클러스터에 요청을 하기 위한 명령어라면, kubeadmin은 클러스터 자체를 구성하고 관리하는 도구
- 쿠버네티스 설치 방법
Installing kubeadm
This page shows how to install the kubeadm toolbox. For information on how to create a cluster with kubeadm once you have performed this installation process, see the Creating a cluster with kubeadm page. This installation guide is for Kubernetes v1.32. If
kubernetes.io
4-1. 필요 패키지 설치
root@master-250410:~# apt-get install -y apt-transport-https ca-certificates curl
# 원본 서식
apt-get install -y apt-transport-https ca-certificates curl
4-2. 경로 생성
root@worker2-250410:~# mkdir -p /etc/apt/keyrings
4-3. gpg key 생성
root@master-250410:~# curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 원본 서식
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
4-4. 레포지토리 목록 추가
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
4-5. 레포지토리 목록 업데이트
root@master-250410:~# apt-get update -y
4-6. 패키지 설치
root@master-250410:~# apt-get install -y kubelet kubeadm kubectl
root@master-250410:~# apt-mark hold kubelet kubeadm kubectl
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
4-7. kubelet 재부팅 & 활성화
root@master-250410:~# systemctl restart kubelet
root@master-250410:~# systemctl enable kubelet
Master Node 구성
1. 클러스터 설치를 위한 이미지 pulling
- initailize하면 알아서 이미지를 pulling가 되는데, 혹시 몰라서 이미지 pulling을 진행함
root@master-250410:~# kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock --kubernetes-version v1.30.3
# 원본 서식
kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock --kubernetes-version v1.30.3


2. 클러스터 초기화 & control plane 구성
# --ignore-preflight-errors=all : 에러 생기면 무시
# --pod-network-cidr=10.244.0.0/16 : 나중에 네트워크 애드온의 대역과 맞춰줘야함.
# ➡️ 10.244.0.0/16 : flannel이라는 네트워크 애드온의 대역
# --upload-certs : 인증/인가하기 위한 파일을 자동으로 배포할 수 있게 해주는 옵션
root@master-250410:~# kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --kubernetes-version=v1.30.3 --cri-socket unix:///run/containerd/containerd.sock --ignore-preflight-errors=all
...
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 211.183.3.100:6443 --token i2rll7.gwnqwglsfwf23u8h \
--discovery-token-ca-cert-hash sha256:081a8007c25952f1b01829b3bb622890661a3a33ff3b7b8988e0505baaa5f6be
# 원본 서식
kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --kubernetes-version=v1.30.3 --cri-socket unix:///run/containerd/containerd.sock --ignore-preflight-errors=all
- config 파일 설정
- mkdir -p $HOME/.kube : config 파일 구성 ➡️ /root/.kube 폴더 생성
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ➡️ config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config ➡️ 소유권을 자신으로 변경

- kubectl이라는 명령어를 치면, ~/.kube/config 파일에 있는 정보를 토대로 클러스터에 API 요청을 함
➡️ ~/.kube/config 파일에는 클러스터의 주소 + 인증/인가에 대한 정보가 포함되어 있음 - kubectl 명령을 치려면 결국 kubectl 명령어 설치는 물론 config 파일도 구성을 해줘야 함

✅ 클러스터 초기화 실패

3. token.txt 파일 생성
- 클러스터 초기화할 때, 나온 토큰을 복붙
➡️ 나중에 워커노드가 말썽을 일으키면 초기화 해야하는데, 토큰을 다시 보기 힘들기 때문에 저장 - 해당 내용을 워커노드에 실행 ➡️ 클러스터에 워커 노드를 추가하는 명령어
root@master-250410:~# vi token.txt
kubeadm join 211.183.3.100:6443 --token i2rll7.gwnqwglsfwf23u8h --discovery-token-ca-cert-hash sha256:081a8007c25952f1b01829b3bb622890661a3a33ff3b7b8988e0505baaa5f6be --cri-socket unix:///run/containerd/containerd.sock
- 성공 화면 - worker1/worker2

✅ 실패하면 아래의 명령어를 통해 클러스터 리셋
kubeadm reset --cri-socket unix:///run/containerd/containerd.sock
4. 클러스터 구성 확인 - 비정상
root@master-250410:~# kubectl get nodes
- 오류 ➡️ config 파일 설정해줘야 함

4-1. 인가/인증 파일 생성
- 클러스터가 변경되면 config 파일도 다시 설정해줘야 함❗
- 외부에서 control plane에 요청할 때, 필수로 인가/인증 파일이 존재해야 함
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- config 파일은 설정이 되었지만, 네트워크 애드온 미설치가 되어 node끼리 통신 ❌

✅ CNI(Container Network Interface)
- 네트워크 애드온의 종류 = calico, flannel 등 ...
- 이런 애드온들을 CNI라고 부름
📌네트워크 애드온(Network Addon)
- Kubernetes에서 기본적으로 Pod끼리 통신(수평 트래픽 = overlay Network)이 가능해야 하고, 외부와 통신(수직 트래픽)할 수 있어야 함
➡️ 하지만, Kubernetes 자체는 네트워크를 직접 제공하지 않음
👉 네트워크 기능을 외부 애드온으로 설치해서 사용하는 구조 = 네트워크 애드온(Network Addon) - CNI 필요 이유
- Kubernetes는 "플러그인 기반"으로 동작
➡️코어기능은 최소로 두고, 네트워크/스토리지 등은 CNI 같은 표준 인터페이스에 맞는 플러그인을 붙이는 구조
- Kubernetes는 "플러그인 기반"으로 동작
5. CNI 설치
5-1. 매니페스트에 있는 바램을 클러스터에 반영
- 매니페스트(Manifest) 파일(=명세표) ➡️ 원하는 상태(Desired State)가 정의되어 있는 파일
# 파일(-f)에 담긴 나의 바램(yml파일)을 내 클러스터에 반영(apply) 시키고 싶음
root@master-250410:~# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# 원본 서식
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
5-2. 매니페스트 파일 다운로드
- 나중에 네트워크에 문제가 발생했을 때, 재설치해야 하기 때문에
➡️ 파일 다운로드 & 보관

6. 클러스터 구성 확인 - STATUS = Ready : 정상

✅ kubeadm에서 pod 네트워크를 정한 이유
root@master-250410:~# vi kube-flannel.yml

➕ 네트워크 대역 선택할 때, 주의사항

- node의 대역과 Pod 대역이 겹치면 안됨
➡️ 동일한 IP를 가지고 있으면, 어떤 곳과 통신해야할지 알 수 없기 때문에, 대역 설정을 할 때, 주의해야 함❗
7. pod 생성 확인
- 각 pod가 잘 만들어진 것을 확인 가능
- 각 pod 끼리 통신이 안될 경우, READY가 1/1(정상)인지 확인
➡️ 0/1(비정상)
# -n : namespace
root@master-250410:~# kubectl get pod -n kube-system

🌟쿠버네티스 컴포넌트 & 주요 개념
1️⃣ Control Plane의 주요 컴포넌트
- kube-api-server : 내/외부의 모든 요청을 받는 서버
- controller나 scheduler의 주시 대상
- 인증/인가 정보 포함
- ➡️ 호텔 지배인
- kube-scheduler : 생성될 리소스(객체)들을 어떤 노드에 배치할지 결정(스케줄링)
- ➡️ 호텔 로비 직원
- kube-controller : 원하는 상태, 바램(Desired state)에 현재 상태(Statue)가 수렴하도록 계속 모니터링
- 문제가 생기면 고치거나 리소스(pod 등...)를 재생성
- 다양한 컨트롤러들이 존재
- ➡️ 하우스키퍼
- etcd(에시디) : 클러스터 및 모든 리소스에 대한 정보를 key:value 형태로 저장하는 데이터베이스
- ➡️ 장부
2️⃣ 노드에 존재하는 컴포넌트
- kubelet : 노드 관리자
- 실질적으로 각 노드에 리소스를 관리
- proxy : 노드 안/밖을 넘나드는 수직적 트래픽을 관리
3️⃣ 네트워크 애드온(CNI, Container Network Interface)
- 네트워크에 관련된 coredns와 kube-proxy를 위해 필요한 부가 기능
Kubernete Pod 명령어
1. test-pod라는 이름을 갖는 pod 띄우기
root@master-250410:~# kubectl run test-pod --image public.ecr.aws/nginx/nginx:alpine
2. pod 정보 조회
# pod 정보 조회(get)
root@master-250410:~# kubectl get pod

3. pod 실시간 모니터링


pod 모니터링 방법
- 때에 따라서 방법1 또는 방법 2가 적용되지 않을 수 있음
# 1️⃣ kubectl get pod --watch
root@master-250410:~# kubectl get pod --watch
NAME READY STATUS RESTARTS AGE
test-pod 1/1 Running 0 96s
# 2️⃣ watch kubectl get pod
root@master-250410:~# watch kubectl get pod
4. pod 삭제
root@master-250410:~# kubectl delete pod test-pod
pod "test-pod" deleted
5. 배치된 노드 IP 확인
# 아웃풋(-o)를 자세하게(wide) 보고 싶음
root@master-250410:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 1/1 Running 0 105s 10.244.1.5 worker2-250410clear <none> <none>
✅ 클러스터 정상 여부도 확인 가능

- 오버레이네트워크가 구성되어 있고, 노드들이 pod 네트워크를 알고 있기 때문에
➡️ master노드에서 worker1 노드에 있는 pod와 통신이 가능 - kubectl get pod -n kube-system을 쳤을 때, 0/1이런 pod들이 존재한다면 클러스터가 비정상일 확률이 높고, 위와 같은 방법으로도 클러스터의 정상여부를 확인 가능
👉 클러스터를 켜야 하면 일단 kubectl get pod -n kube-system을 확인하는 것이 좋음
6. pod를 완전 자세히 묘사
6-1. pod 자세히 묘사
root@master-250410:~# kubectl describe pod test-pod
- pod의 처리 흐름도 확인 가능

6-2. 존재하지 않는 이미지로 pod 생성
root@master-250410:~# kubectl run bad-pod --image=<아무거나 작성>
pod/bad-pod created
- 비정상 pod 생성 확인

- 왜 pod가 비정상인지 확인 가능

7. 매니페스트 파일로 pod 생성
7-1. 매니페스트 파일 생성
# --dry-run=client : 서버에 전달을 하지 않고, 리허설을 해보겠다(진짜로 생성되는 것은 아님 = 가짜)
# -o yaml : yaml 형태로 출력해서
# > test-pod.yml 이라는 매니페스트(명세표) 파일로 리다이렉션을 해서 만들겠다.
root@master-250410:~# kubectl run test-pod --image public.ecr.aws/nginx/nginx:alpine --dry-run=client -o yaml > test-pod.yml
- 실행 결과 = 매니페스트 파일 생성

7-2. 매니페스트 파일 수정

- status는 매니페스트에는 존재하지 않고, etcd 같은 곳에 존재함
➡️ status는 현재 상태이므로 매니페스트가 아닌 etcd에 저장됨
✅ 매니패스트 파일의 필수 항목
- 매니페스트 파일은 직접 생성하지 않고 서식을 가져다가 수정해서 사용
➡️ 필수 구성 : apiVersion / kind / metadata / spec

7-3. 매니페스트 파일 반영
- test-pod.yml 파일(-f)에 담겨있는 나의 바램이 클러스터에 반영(apply)됐으면 좋겠음
root@master-250410:~# kubectl apply -f test-pod.yml
pod/test-pod created
7-4. 매니페스트로 생성한 pod 삭제
- docker compose up/down 비슷한 개념
root@master-250410:~# kubectl delete -f test-pod.yml
pod "test-pod" deleted
8. Pod 전체 삭제
root@master-250410:~# kubectl delete pod --all
✅ 노드가 비정상일 때
- Pod 생성
root@master-250410:~# kubectl run test1 --image=public.ecr.aws/docker/library/nginx:alpine
pod/test1 created
root@master-250410:~# kubectl run test2 --image=public.ecr.aws/docker/library/nginx:alpine
pod/test2 created
- 비정상인 것을 확인

- kube-system 확인 ➡️ 정상인줄 알았는데, 노드가 비정상임

- kubectl에 있는 비정상인 pod 모두 삭제
root@master-250410:~# kubectl delete pod --all -n kube-system
pod "coredns-55cb58b774-p5kjt" deleted
pod "coredns-55cb58b774-qknl2" deleted
pod "etcd-master-250410" deleted
pod "kube-apiserver-master-250410" deleted
pod "kube-controller-manager-master-250410" deleted
pod "kube-proxy-c7kvg" deleted
pod "kube-proxy-gtxzw" deleted
pod "kube-proxy-qm6kx" deleted
pod "kube-scheduler-master-250410" deleted
- 재부팅 후, 정상으로 변경됨


9. api-resources 확인 명령어
root@master-250410:~# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
componentstatuses cs v1 false ComponentStatus
configmaps cm v1 true ConfigMap
endpoints ep v1 true Endpoints
events ev v1 true Event
limitranges limits v1 true LimitRange
namespaces ns v1 false Namespace
nodes no v1 false Node
persistentvolumeclaims pvc v1 true PersistentVolumeClaim
persistentvolumes pv v1 false PersistentVolume
pods po v1 true Pod
podtemplates v1
실습 - 01
문제
worker1 노드에서 kubectl로 master노드의 api-server에 요청 가능한 상태를 만들어보세요.
➡️ worker1에 config 설정해줘야 함
요청이 가능하다면,
1. cli명령으로 ECR갤러리의 httpd:latest 이미지로 구성된 pod를 한번 띄워보세요.
➡️ kubectl run <pod명> --image <link>
2. --dry-run으로 ECR갤러리의 httpd:latest 이미지로 구성된 pod를 생성하기 위한
매니페스트 파일(my-httpd.yml)을 만들어보세요.
➡️ kubectl run test-pod --image public.ecr.aws/docker/library/httpd:latest --dry-run=client -o yaml > my-httpd.yml
3. my-httpd.yml파일을 적절하게 수정하여 pod의 이름이 test인 파드를 만들어보세요.
➡️ vi my-httpd.yml 파일의 containers의 name을 test로 수정
풀이
1. worker1에 설정 파일 추가
1-1. .kube 디렉토리 생성
root@worker1-250410:~# mkdir -p $HOME/.kube
1-2. admin.conf 설정 파일 복사 : control plane(master) ➡️ data plane(worker1)로 복사
root@master-250410:~# scp /etc/kubernetes/admin.conf root@211.183.3.110:$HOME/.kube/config
The authenticity of host '211.183.3.110 (211.183.3.110)' can't be established.
ECDSA key fingerprint is SHA256:PET8+KxGSbVSIEyM/ODNy3YojStEguu/yITlpLlLBN0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '211.183.3.110' (ECDSA) to the list of known hosts.
root@211.183.3.110's password:
admin.conf 100% 5653 4.2MB/s 00:00
1-3. admin.conf 파일 권한 부여
root@worker1-250410:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
2. ECR 갤러리의 httpd:latest 이미지로 pod 만들기
root@worker1-250410:~# kubectl run test-pod --image public.ecr.aws/docker/library/httpd:latest
pod/test-pod created

3. 매니페스트 파일 생성
3-1. 매니페스트 파일 생성
root@worker1-250410:~# kubectl run test-pod --image public.ecr.aws/docker/library/httpd:latest --dry-run=client -o yaml > my-httpd.yml
root@worker1-250410:~# ls
check_ip_and_restart_docker.sh get-docker.sh my-httpd.yml snap
root@worker1-250410:~# cat my-httpd.yml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: test-pod
name: test-pod
spec:
containers:
- image: public.ecr.aws/docker/library/httpd:latest
name: test-pod
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

3-2. 매니페스트 파일 수정 - pod의 이름 test로 수정
root@worker1-250410:~# vi my-httpd.yml
apiVersion: v1
kind: Pod
metadata:
name: test # pod명
spec:
containers:
- image: public.ecr.aws/docker/library/httpd:latest
name: test # pod 안의 container 명이기 때문에 중복되어도 상관❌

4. 매니페스트 파일 적용 - pod 생성
root@worker1-250410:~# kubectl apply -f my-httpd.yml
pod/test-pod created

'CS > Kubernetes' 카테고리의 다른 글
[Kubernetes] 07. 자율과제 - Dynamic Provisioner (0) | 2025.04.17 |
---|---|
[Kubernetes] 06. RBAC, Dynamic Provisioner (0) | 2025.04.16 |
[Kubernetes] 04. Resource - PV(Persistent Volume), StorageClass, ConfigMap, Secret (0) | 2025.04.15 |
[Kubernetes] 03. LoadBalancer & Ingress (1) | 2025.04.14 |
[Kubernetes] 02. Manifest File & ReplicaSet, Deployment, Namespace, Service, NodePort (0) | 2025.04.14 |