티스토리 뷰

docker 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 *

cni_metallb.pdf
0.45MB
kubespray.pdf
1.18MB
play-with-kubernetes.pdf
0.99MB
k8s-new.pdf
5.45MB

 

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 

k8s-1.31.tar
0.01MB

vagrant 로 k8s 을 설치하기 위해 파일 수정 

 

powershell 관리자에서 

해당 경로에서 

vagrant up

 

kubectl run apache --image httpd

kubectl get pods

kubectl get pods -o wide

 

(worker1) 에서 실행되고 있는 상태

 

 

댓글