티스토리 뷰
도커(Docker)와 쿠버네티스(Kubernetes)를 활용한 컨테이너(Container)관리_정리3 (dockerfile, docker-compose, kubernetes)
atthis 2025. 4. 26. 18:21docker rmi $(docker images | egrep -wv 'nginx|httpd|mysql|redis|alpine|ubuntu|centos' | awk '{print $3}')
(도커 특정 이미지를 제외 한 이미지 삭제)
이미지 용량 최대한 적게 만들기 (관리 가능하도록, 용량이 0인 scratch 는 관리 불가)
vi dockerfile
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y gcc
COPY src/hello.c /tmp
WORKDIR /tmp
RUN gcc -o hello-world hello.c
CMD ["/tmp/hello-world"]
vi hello.c
#include <stdio.h>
int main()
{
printf("Hello Docker container \n");
return 0;
}
gcc -o hello hello.c
docker build -t hello.ubuntu .

vi dockerfile
FROM ubuntu:22.04 AS build-image
RUN apt-get update
RUN apt-get install -y gcc
COPY src/hello.c /tmp
WORKDIR /tmp
RUN gcc -o hello-world hello.c
CMD ["/tmp/hello-world"]
FROM ubuntu:22.04 AS runtime-image
#COPY --from=httpd /usr/local/apache2/htdocs/index.html /var/tmp
COPY --from=build-image /tmp/hello-world .
CMD ["./hello-world"]
docker build -t hello:multi_stage .

(용량이 훨씬 적음)
파이썬 랜덤함수 출력하기
vi dockerfile
FROM python:3
WORKDIR /usr/src/app
# label key="value"
LABEL title="lotto654 program"
LABEL maintainer="kwak"
LABEL version="1.0"
LABEL description="This docker image just for test"
COPY src/test_lotto.py ./lotto.py
CMD ["python","./lotto.py"]
cat ./src/test_lotto.py
import random
result = []
while len(result) < 6:
num = random.randint(1, 45) # 1~45 사이의 숫자중 임의의 숫자 생성
if num not in result: # 중복 숫자 뽑기 방지
result.append(num)
print(result) # 무작위 생성된 6개의 숫자 출력
docker build -t lotto654:1.0 .
docker run lotto654:1.0

도커 업로드 외부 이미지 사용 방법
docker login -u [사용자ID]
(도커 허브 아이디로 로그인)
docker tag lotto654:1.0 [사용자ID]/lotto654:1.0
docker push [사용자ID] /lotto654:1.0
(사용자 ID 로 push 해야 권한 문제가 없음)


다른 서버에서 검색 가능

기존 container 모두 정지 후 지우기
docker stop $(docker ps -q) ; docker rm $(docker ps -qa)
기존 이미지 지우기
docker rmi $(docker images -q) --force
도커 컴포즈 (docker-compose)
yml,yaml 파일에서는 탭 금지 !
스페이스바를 활용할 것
들여쓰기는 두칸, 콜론 다음은 한칸
fruits:
- Apple # 하이픈 (list)는 종속되기 때문에 띄어쓰기 안해도 됨
- Orange
- Mango
martin:
name: Martin' Developer # 딕셔너리
job: dveoper
skill: elite
vi docker-compose.yaml
networks: #네트워크 추가
webapps: # 라벨
driver: bridge #브릿지 모드
ipam:
config:
- subnet: 172.30.0.0/17
services:
myapache: # 컨테이너 이름 ( 실제 이름은 directory이름-myapache-1 )
image: httpd:2.4 #이미지
ports: # 포트포워딩
- "9000:80"
networks: # 네트워크 설정
webapps:
ipv4_address: 172.30.0.10
depends_on: # myapache container 실행하기전에 mydb 컨테이너를 먼저 실행
mydb:
condition: "service_healthy" #디펜던시 설정되어 있는 컨테이너가 unhealthy 상태이면 그다음 container 가 실행이 되지 않음
mydb:
image: mysql:latest
ports:
- "9001:3306"
networks:
webapps:
ipv4_address: 172.30.0.11
environment:
- MYSQL_ROOT_PASSWORD=mypass
healthcheck:
test: ["CMD","mysqladmin","ping","-u","root","-pmypass","-h","localhost"]
interval: 5s # 5초 마다 실행
timeout: 5s # 5초 동안 응답 없음 체크
retries: 2 # 두번 실행
start_period: 5s # 5초 기다렸다가 test 실행
docker compose up # -f [파일명].yaml 은 파일명이 docker-compose 로 되어있어 생략 가능, -d 백그라운드 옵션은 나중에 사용
쿠버네티스 (Kubernetes)
* kubernetes 1.31
아래는 쿠버네티스 1.31 버전이며 centos9s 운영체제 기반의 설치 파일입니다.
vagrant 이미지를 사용합니다.
wget http://containerlab24.com/k8s_install/k8s-1.31.tar -Outfile k8s-1.31.tar
ms windows 에 적당한 디렉토리를 하나 생성후 그 디렉토리에서 다운로드 받고
powershell 에서 tar -xf k8s-1.31.tar ---> Vagrant up 하면 설치완료가 됩니다
* kubernetes 버전은 항상 최신버전을 설치하도록 되어있습니다.
(대략 설치완료까지 10 ~ 15 분정도 시간소요됩니다)
*. 기존에 vagrant image 로 설치된 kubernetes 를 삭제하고 다시 설치하는 경우에는
아래처럼 vagrant 명령어를 사용하여 vm 을 깨끗이 삭제후 설치해야 새로 설치시 이름충돌이나
ip 충돌을 방지할수 있습니다.
*. 기존에 vagrant image 로 설치된 kubernetes 를 삭제하고 다시 설치하는 경우에는
아래처럼 vagrant 명령어를 사용하여 vm 을 깨끗이 삭제후 설치해야 새로 설치시 이름충돌이나
ip 충돌을 방지할수 있습니다.
--------------------------------------------------------------------
* 설치된 Vagrant vm image 삭제
Vagrantfile 이 있는 디렉토리안에서
vagrant halt ; vagrant 가상머신 종료
vagrant status ; vagrant vm 상태 확인
vagrant destroy ; vagrant vm image 삭제
rm .vagrant ; vm 생성될때 만들어진 .vagrant 디렉토리 삭제
--------------------------------------------------------------------
--- kubespray 설치를 위한 가상머신 준비 ---
mkdir kubespray ; cd kubespray
wget http://containerlab24.com/kubespray/Vagrantfile -Outfile Vagrantfile
wget http://containerlab24.com/kubespray/add_hosts.sh -Outfile add_hosts.sh
k8s install with kubespray
--- minikube v1.31(kubernetes v1.27) install based ubuntu 22.04 ---
minikube 참고사항
powershell 에서 임의의 디렉토리를 하나 생성후 그 디렉토리로 이동해서
wget http://containerlab24.com/minikube/Vagrantfile -Outfile Vagrantfile
* 아래는 리눅스로 login 해서 파일을 다운로드 받고 실행해야 합니다.
wget http://containerlab24.com/minikube/minikube_install.sh (minikube start --driver=docker 로 실행됩니다)
chmod u+x minikube_install.sh
./minikube_install.sh ; 5분정도의 시간이 소요됩니다.
아래는 minikube start --driver=none 으로 실행하기 위한 스크립트 파일입니다.
(참고로 아래의 스크립는 minikube start --driver=docker 로도 실행가능)
wget http://containerlab24.com/minikube/minikube_install_driver_none.sh
kubernetes pdf
nfs storage volume 테스트를 위한 vm 생성
powershell 에서 mkdir nfs , cd nfs 그리고 아래의 파일을 다운로드
wget http://containerlab24.com/nfs_vm/nfs_vm.tar -Outfile nfs_vm.tar
tar -xf nfs_vm.tar 파일을 풀고 Vagrant 파일에서 ip address 를 kubernetes cluster ip 대역과
같은 대역으로 수정 한다음 Vagrant up
--------------------
- reclaim 정책
Retain : pvc 삭제 => pv 상태 released, 데이터는 보존됨
pvc 실행을 하면 pv 가 binding 되지 않는다.
pv 를 다시 사용하려면 수동으로 다시 시작해야 한다.
Recycle : pvc 삭제 => pv는 그대로 있으며 available 상태가 된다.
데이터는 삭제됨.
Delete : pvc 삭제 => pv가 삭제된다. 데이터는 그대로 있음
* host_path 인경우 reclaim 정책이 delete 인경우 /tmp 디렉토리에서만
적용된다.
아래와 같은 메시지가 출력되면
Oct 26 09:41:23 control-n1 kernel: watchdog: BUG: soft lockup - CPU#0 stuck for 30s! [containerd-shim:1497]
Oct 26 09:41:23 control-n1 kernel: watchdog: BUG: soft lockup - CPU#1 stuck for 30s! [containerd-shim:1916]
cat /proc/sys/kernel/watchdog_thresh => 이값이 default 로 10으로 되어 있음.
이 값을 아래처럼 올려주면 cpu stuck 현상이 해결되는것 같습니다.
echo "kernel.watchdog_thresh = 30" >> /etc/sysctl.conf
sysctl -p ; 고친파일내용 적용
*. 기타 참고 pdf *
k8s_kubespray_install
Vagrantfile 로 쿠버네티스 클러스트 설치를 위한 ansible control-node 와
master, worker1, worker2 가 생성되고 나면
설치를 위해서 ansible control-node 에서 아래의 작업을 실행하면 됩니다.
kubespray 설치안내 및 소스파일(github) =>
https://github.com/kubernetes-sigs/kubespray
설정은 ansible control node 에서 화살표가 가리키는 manage-node 에
설치를 하기 위한 설정입니다.
k8s cluster(ansible managed-nodes)
ansible control-node ------------> master
------------> worker1
------------> worker2
* worker 수는 얼마든지 10대 이상으로도 구성할수 있습니다.
* master node 도 여러대로 구성할수 있습니다.
* ansible control-node는 ssh 프로토콜을 통해서 ansible-playbook 에 작성되어 있는
play 를 ansible managed-node 에 전달해서 명령어를 실행합니다.
mnaged-node 에서는 ansible play 가 vagrant 계정의 sudo 권한으로 실행됩니다.
이때 vagrant 계정의 인증암호를 요구받지 않도록 하기위해서 managed-node 의 vagrant 계정으로
공개키 업로드는 필수입니다.
k8s_install(kubespray) 을 위한 클러스트 노드 최소사양
--- check needed
Minimum system requirements for kubespray
Master Nodes: 1500 MB RAM, 2 CPU and 20 GB free disk space
Worker Nodes: 1024 MB, 2 CPU, 20 GB free disk space
Ansible Node: 1024 MB, 1CPU and 20 GB disk space
Internet connectivity on each node
Regular with sudo admin rights
Ansible Node 에서 아래의명령어 실행
vagrant@control:~$ sudo apt update
vagrant@control:~$ sudo apt install git python3 python3-pip -y
vagrant@control:~$ git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray/
vagrant@control:~/kubespray$ pip install -r requirements.txt
=> ansible 과 jinja2 템플릿등이 설치됩니다.
아래처럼 ansible 이 설치되어 있는 경로를 찾고 PATH 에 포함되어 있는지 확인.
$ sudo find / -name ansible
* 명령어 앞에 프롬프트가 '$' 만 표시되어 있는 경우 현재 디렉토리 위치는 어떤디렉토리라도 상관없습니다.
$ echo $PATH ; ansible 파일의 경로가 PATH 변수에 포함되어 있지 않으면
아래처럼 ansible 파일 경로를 PATH 환경뼌수에 추가
$ export PATH=$PATH:/home/vagrant/.local/bin (source ~/.profile 명령을 실행해도 된다)
ansible manage node(ansible로 관리할 관리대상장비)를 ansible server가 암호를 요구하지 않는 비대화식으로
명령을 전달하기 위해서는공개키를 생성후 ansible managed-node 에 업로드 하여여 한다.
ansible control-server에 /etc/hosts 파일에 아래 내용추가(managed-node 주소를 등로)
vagrant@control:~/kubespray$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# -- 이 라인 아래부터 추가한 내용
192.168.11.10 master
192.168.11.20 worker1
192.168.11.30 worker2
$ ssh-kegen ; ssh 공개키-개인키 생성(RSA 기반)
$ ssh-copy-id ip address(master node) ; ex) ssh-copy-id 192.168.11.10
$ ssh-copy-id ip address(worker1) ; ex) ssh-copy-id 192.168.11.20
$ ssh-copy-id ip address(worker2) ; ex) ssh-copy-id 192.168.11.30
* managed-node 에서 방화벽 서비스(ubuntu는 ufw)를 중단하고 해야 방화벽 서비스를 중단하는것은
(* ufw 나 firewalld 를 중단해도 iptables 는 계속 사용됩니다.)
ansible playbook 에 설정되어 있으므로 직접 처리할 필요는 없습니다.
vagrant@control:~/kubespray$ cat contrib/os-services/roles/prepare/tasks/main.yml ; 이파일에 방화벽서비스 해제가 설정되어 있음.
ansible-playbook 으로 managed-node 를 제어하기위해서는 inventory 파일이 필수입니다.
inventory 는 managed-node 의 주소이며(ip address 나 domain name, hostname 이 가능합니다)
아래처럼 inventory sample 파일이 있는 디렉토리를 이름을 변경하여 복사합니다.
vagrant@control:~/kubespray$ cp -rfp inventory/sample/ inventory/mycluster/
inventory/ 안에 있는 inventory.ini 파일을 수정해서 사용해도 되지만
공식 github 주소에에 아래처럼 inventory 파일을 yaml 파일로 생성하여 실행을 하는것으로
설명이 되어있습니다.
inventory playbook 파일 생성방법
*. ansible playbook 이란 한개이상의 ansible play 가 저장되어 있는 파일을 말합니다.
ansible play는 managed-node 에서 실행이 되어야 할 하나의 task(작업)를 의미합니다.
vagrant@control:~/kubespray$ pip3 install -r contrib/inventory_builder/requirements.txt
$ declare -a IPS=(192.168.11.10 192.168.11.20 192.168.11.30)
=> IPS 를 배열변수로 선언하고 managed-node의 ip 주소로 초기화 합니다.
* 각각 master node, worker node 들의 ip address 를 확인후에 사용하고 있는 실제 주소를 괄호안에 적어야 합니다.
(Vagrantfile 로 vm 을 생성했으면 Vagrantfile을 보면 알수 있습니다. 리눅스안에서는 두번째 랜카드(eth1) 의
ip address 입니다)
vagrant@control:~/kubespray$ CONFIG_FILE=inventory/mycluster/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
=> CONFIG_FILE 변수를 생성이 될 inventory 경로로 초기화한다음 python3 으로 IPS 배열의 원소값으로
CONFIG_FILE 변수의 경로를 생성합니다.
명령어 실행결과로서 아래처럼 파일이 생성됩니다.
vagrant@control:~/kubespray$ cat inventory/mycluster/hosts.yml
all:
hosts:
node1:
ansible_host: 192.168.11.10
ip: 192.168.11.10
access_ip: 192.168.11.10
node2:
ansible_host: 192.168.11.20
ip: 192.168.11.20
access_ip: 192.168.11.20
node3:
ansible_host: 192.168.11.30
ip: 192.168.11.30
access_ip: 192.168.11.30
children:
kube_control_plane:
hosts:
node1:
node2:
kube_node:
hosts:
node1:
node2:
node3:
etcd:
hosts:
node1:
node2:
node3:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
이렇게 생성된것을 그대로 사용해도 되지만 vagrant 설치할때 사용했던 이름으로 변경하는것이
호스트 식별을 위해서 좋을것 같습니다.
아래는 수정된 내용
* 파일 편집시 들여쓰기할때 tab 을 사용하면 에러가 발생합니다.
tab키 대신에 스페이스바로 띄어쓰기를 사용해야 합니다.
all:
hosts:
master:
ansible_host: 192.168.11.10
ip: 192.168.11.10
access_ip: 192.168.11.10
worker1:
ansible_host: 192.168.11.20
ip: 192.168.11.20
access_ip: 192.168.11.20
worker2:
ansible_host: 192.168.11.30
ip: 192.168.11.30
access_ip: 192.168.11.30
children:
kube_control_plane:
hosts:
master:
kube_node:
hosts:
master:
worker1:
worker2:
etcd:
hosts:
master:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
*. children 에 설정되 있는 각 title은 한개이상의 host 가 포함되어 있는 host 그룹을 의미합니다.
위에 설정은 kube_control_plane 은 master 이며 kubernetes node 는 master, worker1, worker2 세대로
구성하며 etcd 는 master 에 설치
k8s_cluster 는kube_contrl_plane 그룹과 kube_node 그룹으로 구성
* kubernetes CNI 는 현재버전에서는 기본이 calico 로 설정되어 있는데 flannel 등 다른것으로 변경도 가능합니다.
*. master, worker1 등 node name 은 원하는 이름으로 변경해도 됩니다.
그리고 아래처럼 playbook 파일을 수정해야 합니다.
아래는 main.yml 파일에 설정되어 있는 nf_conntrack_ipv4 를 nf_conntrack 으로 수정하는 내용.
vagrant@control:~/kubespray$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' extra_playbooks/roles/kubernetes/node/tasks/main.yml
vagrant@control:~/kubespray$ sed -i 's/nf_conntrack_ipv4/nf_conntrack/' roles/kubernetes/node/tasks/main.yml
vagrant@control:~/kubespray$ ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml
* 설치완료까지 20분에서 ~ 30분정도 소요되는것 같습니다.
설치 완료되면 kubernetes master node 로 접속한다음
vagrant@control:~/kubespray$ ssh 192.168.11.10
Last login: Mon Sep 25 07:28:41 2023 from 192.168.11.1
vagrant@master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 8m15s v1.28.2
worker1 Ready 7m25s v1.28.2
worker2 Ready 7m30s v1.28.2
vagrant@worker1:~$
vagrant@master:~$ sudo kubectl get pods -n kube-system
vagrant@master:~$ sudo kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5fb8ccdcd6-qbn6p 1/1 Running 0 3m46s
calico-node-7jkvt 1/1 Running 0 4m3s
calico-node-bs5gt 1/1 Running 0 4m3s
calico-node-w8dj6 1/1 Running 0 4m3s
coredns-67cb94d654-bdkx7 1/1 Running 0 3m38s
coredns-67cb94d654-mntzm 1/1 Running 0 3m35s
dns-autoscaler-7b6c6d8b5b-6vqzp 1/1 Running 0 3m36s
kube-apiserver-master 1/1 Running 1 5m12s
kube-controller-manager-master 1/1 Running 2 5m12s
kube-proxy-gsjtm 1/1 Running 0 4m24s
kube-proxy-kgv8b 1/1 Running 0 4m23s
kube-proxy-pt4dk 1/1 Running 0 4m23s
kube-scheduler-master 1/1 Running 1 5m12s
nginx-proxy-worker1 1/1 Running 0 4m19s
nginx-proxy-worker2 1/1 Running 0 4m30s
nodelocaldns-ckkjk 1/1 Running 0 3m36s
nodelocaldns-fmbsx 1/1 Running 0 3m36s
nodelocaldns-xj6qc 1/1 Running 0 3m36s
* 명령어 실행결과의 상태가 정상인것을 알수있습니다.
* 설치후 kubernetes 리소스가 올바르게 실행되기까지 약간 시간이 걸릴수도 있으므로
Running 상태가 아니면 조금 기다렸다가 다시 확인해보기 바랍니다.
* k8s cluster 를 깨긋하게 삭제하고 새로 설치할때는
powershell 에서
- vagrant destroy -f k8s-master k8s-worker1 k8s-worker2
- vagrant up k8s-master k8s-worker1 k8s-worker2
- 그 다음 ansible-control node 에서 rm /home/vagrant/.ssh/known_hosts 를 삭제하고
ssh-copy-id 명령어로 공개키를 다시 업로드 해야 합니다.
- 그리고 다시 kubernetes cluster 설치
------------------------------------------------------------------------------------
* vagrant image 를 삭제하지 않고 kubernetes cluster 를 새로 설치하려면
vagrant@control:~/kubespray$ $ ansible-playbook -i inventory/mycluster/hosts.yml reset.yml
이렇게 삭제후 새로 설치해도 됩니다.
* 삭제할때 조금 진행이 되다가 아래처럼 대화식으로 진행되는 부분에서 'yes' 를 입력하라고 합니다.
PLAY [Reset cluster] *****************************************************************************************************
Monday 25 September 2023 10:09:52 +0000 (0:00:00.637) 0:00:11.547 ******
[Reset Confirmation]
Are you sure you want to reset cluster state? Type 'yes' to reset your cluster.:
playbook 으로 설치된것만 제거되기 때문에 공개키는 새로 업로드할 필요가 없습니다.
삭제후 ansible-control node 에서 수정해야 하거나 추가해야될 작업이 있으면 그 작업을 완료한다음
vagrant@control:~/kubespray$ ansible-playbook -i inventory/mycluster/hosts.yml --become --become-user=root cluster.yml
reset.yml 파일로 삭제후 다시 설치한다음 확인해보니 잘 동작합니다
vagrant@worker1:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 3h6m v1.28.2
worker1 Ready 3h5m v1.28.2
worker2 Ready 3h5m v1.28.2
* 간혹 설치시 disk 가 100% full 이 되어서 설치안될수도 있으니 설치안되면 컴퓨터 리소스를
확인해보세요.
*. Vagrantfile 로 클러스트설치를 위한 가상머신을 생성할때 add_hosts.sh 파일은 ansible-control-node 에만
필요합니다. 그래서 Vagrantfile에서 ansible-control-node 에만 add_hosts.sh 가 배포되게 Vagrant 설정에서
필요없는 부분을 삭제하였습니다.
하지만 기존의 Vagrantfile을 그대로 사용해도 문제는 없습니다.
* sudo 를 사용하지 않고 일반계정으로 kubectl 명령어를 사용하려면
아래와 같이 쿠버네티스 인증서 파일을 복사해서 사용하면 됩니다.
인증서 파일은 root 만 access 할수 있으므로 sudo 를 사용해서 복사하고
복사가 완료되면 소유주를 자신의 것으로 변경해야 합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown vagrant:vagrant /home/vagrant/.kube/config
kubernetes manifest 파일을 작성할때 nano 편집기를 사용한다면
cd $HOME
wget http://twoseven.kr/docker/docker/.nanorc 를 받으면 편리하게
파일을 작성할수 있습니다.
vim 편집기를 사용한다면
$HOME/.vimrc 파일을 아래처럼 작성하면 됩니다.
echo "autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab autoindent" > $HOME/.vimrc
minikube 참고사항
minikube start --driver=docker 로 실행하는 경우
minikube 가 docker container 로 실행되게 됩니다.
kubernetes container runtime 도 minikube 안에서 실행됩니다.
minikube 안에 cri-dockerd,crictl 등kubernetes 에 필요한 패키지들이
포함되어 있습니다.
그래서 host 에는 kuberntees contaier runtime 을 설치할필요가 없습니다.
* CNI 는 calico, flannel 등 다른것으로 변경할수 있으며 minikube 실행할때
CNI 를 생략하면 default CNI(docker bridge nework)를 사용하게 됩니다.
설치후 확인
vagrant@minikube:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 5h57m v1.27.4
vagrant@minikube:~$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5d78c9869d-lm652 1/1 Running 0 5h57m
etcd-minikube 1/1 Running 0 5h57m
kube-apiserver-minikube 1/1 Running 0 5h57m
kube-controller-manager-minikube 1/1 Running 0 5h57m
kube-proxy-qp42v 1/1 Running 0 5h57m
kube-scheduler-minikube 1/1 Running 0 5h57m
storage-provisioner 1/1 Running 1 (5h57m ago) 5h57m
vagrant@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17c6d84ffd gcr.io/k8s-minikube/kicbase:v0.0.40 "/usr/local/bin/entr…" 6 hours ago Up 6 hours 127.0.0.1:32777->22/tcp, 127.0.0.1:32776->2376/tcp, 127.0.0.1:32775->5000/tcp, 127.0.0.1:32774->8443/tcp, 127.0.0.1:32773->32443/tcp minikube
vagrant@minikube:~$
vagrant@minikube:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b0c9f7e348dc bridge bridge local
71d6df7903e3 host host local
3069a035fc76 minikube bridge local
79bfb4d9166d none null local
vagrant@minikube:~$
docker ps 로 확인하면
vagrant@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c17c6d84ffd gcr.io/k8s-minikube/kicbase:v0.0.40 "/usr/local/bin/entr…" 3 hours ago Up 3 hours 127.0.0.1:32777->22/tcp, 127.0.0.1:32776->2376/tcp, 127.0.0.1:32775->5000/tcp, 127.0.0.1:32774->8443/tcp, 127.0.0.1:32773->32443/tcp minikube
vagrant@minikube:~$
* minikube ssh -n minikube 명령어로 minikube container 로 접속할수 있습니다.
접속은 minikube ssh -n minikube 로 접속할수 있습니다.
(또는 minikube 가 docker container 로 실행 되고 있으므로
docker exec -it minikube /bin/bash 로 접속해도 됩니다)
접속해서 docker ps 로 확인해보면 쿠버네티스 관련 컨테이너가 실행중인것을
확인할 수 있습니다.
iptables 설정도 minikube container 안에 설정됩니다.
(sudo iptables -t nat -L -n 으로 확인)
minikube container 가 외부와 격리된 환경으로 실행이 되므로
아래와 같이 접속할 수 없습니다.
*. 아래처럼 테스트할 mainfest 파일은 http://containerlab24.com/docker/example/apache.tar 파일에 포함되어 있습니다.
wget 으로 내려받아서 실행하면 아래처럼 출력됩니다.
vagrant@minikube:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 3h15m
myweb-service NodePort 10.96.178.57 8001:30358/TCP 3h9m
vagrant@minikube:~$ curl http://10.244.0.3
curl: (28) Failed to connect to 10.244.0.3 port 80 after 129480 ms: Connection timed out
vagrant@minikube:~$ curl http://10.96.178.57:8001
curl: (28) Failed to connect to 10.96.178.57 port 8001 after 129887 ms: Connection timed out
vagrant@minikube:~$
vagrant@minikube:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
b0c9f7e348dc bridge bridge local
71d6df7903e3 host host local
3069a035fc76 minikube bridge local
79bfb4d9166d none null local
vagrant@minikube:~$
vagrant@minikube:~$ docker container inspect minikube |grep -i "ipaddress"
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "192.168.49.2",
vagrant@minikube:~$
아래처럼 접속하면 됩니다.
vagrant@minikube:~$ curl http://192.168.49.2:30358 (위에 출력을보면 nodeport 번호입니다)
It works!
vagrant@minikube:~$
* nodeport 로 설정하더라도 호스트밖에서는 접속을 할수 없습니다.
* 호스트밖에서 nodeport 로 접속을 할려면 --driver=dockr 대신 다른 driver type 을 사용해야 합니다.
* minikube tunnel 명령을 사용하면 host 에서 service object의 cluster ip 주소로 접속가능합니다.
(ex. curl http://192.96.178.57:8001)
#########################################################################################################
minkube start --driver=none 으로 실행하는 경우
현재의호스트에서 kubernetes 가 설치됩니다.
그러므로 호스트에서 pod ip 및 cluster ip address 로 컨테이너에 접속할수 있습니다.
nodePort 를 사용하면 외부에서 접속가능합니다.
설치후 확인
vagrant@minikube:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 5m11s v1.27.4
vagrant@minikube:~$ kubectl get ns
NAME STATUS AGE
default Active 5m30s
kube-node-lease Active 5m30s
kube-public Active 5m30s
kube-system Active 5m30s
vagrant@minikube:~$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5d78c9869d-84ghg 1/1 Running 0 5m29s
etcd-minikube 1/1 Running 0 5m41s
kube-apiserver-minikube 1/1 Running 0 5m43s
kube-controller-manager-minikube 1/1 Running 0 5m41s
kube-proxy-5ncxm 1/1 Running 0 5m29s
kube-scheduler-minikube 1/1 Running 0 5m43s
storage-provisioner 1/1 Running 0 5m41s
vagrant@minikube:~$
vagrant@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
888a2faafedb gcr.io/k8s-minikube/storage-provisioner "/storage-provisioner" 6 minutes ago Up 6 minutes k8s_storage-provisioner_storage-provisioner_kube-system_8434f034-ee3e-4463-ac84-635b45a6b2f5_0
2f7f2d91d881 ead0a4a53df8 "/coredns -conf /etc…" 6 minutes ago Up 6 minutes k8s_coredns_coredns-5d78c9869d-84ghg_kube-system_d27f1c7b-4db4-42ba-b956-8cd92b7ee524_0
9d7bf15d29e6 registry.k8s.io/pause:3.9 "/pause" 6 minutes ago Up 6 minutes k8s_POD_coredns-5d78c9869d-84ghg_kube-system_d27f1c7b-4db4-42ba-b956-8cd92b7ee524_0
... 이하생략
$ vagrant@minikube:~$ kubectl run apache --image=httpd:2.4
pod/apache created
vagrant@minikube:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
apache 1/1 Running 0 28s 10.244.0.3 minikube
vagrant@minikube:~$
vagrant@minikube:~$ curl http://10.244.0.3
It works!
vagrant@minikube:~$
* service type 을 NodePort 로 설정해서 pod 로 접속하면 호스트 외부에서도 접속가능합니다.
(minikube start --driver=none 이면 호스트 외부에서 nodeport 로 접속불가)
=========================================================================================================
minikube 를 새로 실행할때는 minikube delete 후 다시 실행하면 됩니다.
minikube delete 는 실행중인 pod 까지 삭제합니다.
다시 실행할때 minikube start --driver=docker 로도 실행가능합니다.
* (minikube_install.sh 파일은 --driver=none 으로만 실행해야 하고,
--driver=none 을 생략해도 --driver=docker 입니다.)
* host 를 rebooting 하면 minikube 를 다시 실행해야 합니다.
vagrant 로 k8s 설치
아래 tar 파일 C:\Users\weekend04\kubernetes 아래에서 xf
vagrant 로 k8s 을 설치하기 위해 파일 수정


powershell 관리자에서
해당 경로에서
vagrant up

kubectl run apache --image httpd
kubectl get pods
kubectl get pods -o wide

(worker1) 에서 실행되고 있는 상태
'certificate > cka' 카테고리의 다른 글
| 도커(Docker)와 쿠버네티스(Kubernetes)를 활용한 컨테이너(Container)관리_정리5(kubernetes) (1) | 2025.05.17 |
|---|---|
| 도커(Docker)와 쿠버네티스(Kubernetes)를 활용한 컨테이너(Container)관리_정리4(kubernetes) (6) | 2025.05.10 |
| 도커(Docker)와 쿠버네티스(Kubernetes)를 활용한 컨테이너(Container)관리_정리2 (network, build) (1) | 2025.04.19 |
| 도커(Docker)와 쿠버네티스(Kubernetes)를 활용한 컨테이너(Container)관리_정리1 (0) | 2025.04.12 |
| [Kubernetes] 쿠버네티스 개념 및 크기단위 (1) | 2024.11.01 |
