안녕하세요. 저는 클라우드 및 애자일·협업 전문 기업 오픈소스컨설팅의 이건웅이라고 합니다. 우리 회사는 클라우드, 데브옵스(DevOps), 컨테이너 아키텍처 등 인프라 관련 최신 기술 전문성을 보유, 이를 토대로 오픈스택 및 쿠버네티스 커뮤니티 오픈소스 패키지인 ‘플레이스 클라우드(Playce Cloud)’를 개발 및 공급하고 있습니다.

우리 팀은 지속적으로 CNCF의 공개 버전을 이용하여 크고 작은 사이트들에 설계, 구축 및 유지보수 업무를 진행 하고 있는데요. 이때 생기는 알찬 노하우를 공유하고자 합니다. 많은 분들이 오픈소스를 쉽게 접할 수는 있지만 실제 환경에 적용해서 사용하기에는 많은 시행 착오와 경험이 필요한데요. 누군가가 구현 가능하고 바로 사용 가능한 아키텍처를 보여준다면 너무 좋겠죠. 그래서 준비 했습니다.

구현 가능하고 적절한 사용이 가능한 Kubernetes 구축과 운영 포인트를 저와 같이 확인해 주시면 감사하겠습니다.


개요

Kubernetes를 사용하기 위해서는 우리에게 테스트용 서버가 필요합니다. 그리고 이 서버는 1기 혹은 2기 이상이 필요로 하게 됩니다.

Kubernetes의 간단한 확인을 위해서는 MicroK8s, K3s등으로도 확인이 가능하고, 개인 단말기 컴퓨터에 Docker를 설치하면, 옵션으로 Kubernetes를 경험 할 수 있습니다. 그러나 우리는 엔지니어이고, 실제 환경과 최대한 동일한 환경에서 경험하고 기술을 확인 할 필요가 있습니다.

만약 2개이상의 Site 혹은 다른 버전의 Kubernetes를 운영하고 있다면, 테스트를 위한 많은 사이트 Demo환경을 구축 할 필요가 있습니다. 그리고 최신버전의 테스트와 필요한 LAB을 구성하기 위해서는 필요에 따라서 가상서버를 구축하고 삭제하는 작업이 지속적으로 필요하게 됩니다.

Kubernetes의 구성에는 다량의 서버가 필요하고, 필요시 간단한 네트워크 구성까지 할 수 있어야 하므로 기준 서버를 구성하여 빠르고 쉽게 테스트 환경을 구축하는 능력을 길러야 하겠습니다.


목표

모두 각자의 방식이 있겠지만, 오늘은 libvirt를 활용한 방법을 설명하고, 작게는 1기의 랩탑에서 크게는 불용 처리된 서버를 이용한 다수의 VM을 사용하여 테스트 환경을 구축해 보겠습니다.

이때 기준서버를 생성하고, 복제 작업을 통해 서버 환경을 구성하는 방법과 명령어의 변형을 통해 원하는 구성으로 1기씩 구성하는 방법을 이용하여, VM을 구축 할 수 있도록 하겠습니다.


Host Server의 설정

Host Server 구성 확인

최근 CentOS의 개발 중단으로 인해 CentOS와 유사한 Rocky Linux를 사용하는 곳이 조금씩 늘고 있습니다만, 아직은 Ubuntu의 사용이 조금더 편한것 같습니다. 많은 사이트에서 주로 Ubuntu기반의 Kubernetes설치 요청이 있고, 꾸준히 발전해온 Ubuntu를 Host Server로 이용해 보도록 하겠습니다.

구성은 2가지로 개인용 단말 컴퓨팅 장비를 이용한 구성과 DL380 Gen8을 이용한 구성이 되겠습니다.
이 두가지 구성은 OS설치부터 사용까지 다른 부분은 없습니다. 다만 개인용 장비는 휴대가 가능하거나, 개인이 준비할때 자금적인 문제에서 조금 자유롭습니다. 소음과 전기세 문제는 조금 다른 문제이지만, 서버를 이용하게 될 경우 CPU의 수량이나 RAM의 사용에서 아주 큰 차이가 있겠습니다.

위의 그림은 개인장비로 구성 할 경우의 예시입니다. 노트북 단말기의 경우 고려 할 수 있는 성능의 최대치를 상정해보았습니다. 물론 NIC또한 USB인터페이스를 통한 추가 LAN카드도 필요하겠네요. 하지만 충분히 구성가능하고, 최소한의 Kubernetes환경의 구축이 가능하겠습니다. ( 1기의 노트북 단말기로 필요한 Node수량만큼 VM 구성 가능하지만, 성능이 많이 부족합니다. 최소 2기정도는 되어야 Add-on등이 구축 가능합니다. )

다른 대안으로 DL380 Gen8 ( 구형 서버 )를 이용한 방법입니다. 구형이지만, RAM이 160GB나 됩니다.
상당히 여유롭게 VM 구축도 가능하고, 수량도 많이 배정이 가능한 것을 알 수 있습니다. 하지만 이동과 팬 소음, 그리고 부피등이 극복이 가능한 환경이라면 매우쾌적한 환경이라고 볼 수 있겠습니다.

그렇다면, Host Server의 기본적인 구성을 해보도록 하겠습니다. OS는 Ubuntu 22.04.3 입니다. ( Host OS 의 구성은 USB 혹은 CD-Rom을 이용해 미리 구성해 주셔야 합니다. 필요한 옵션은 따로 없으며, 네트워크로 접속 가능한 상태를 만들어 주시면 되겠습니다. )

추가로, 우리가 목표로 했던 명령어를 통한 VM생성과 기준 서버를 선 구성 후, 복사하여 구축하는 방법을 사용 할 예정인데요. 2기의 노트북단말기에서는 명령어를 통한 VM 1기씩 구축, 그리고 구형 서버에서는 기준 서버를 선 구성 후, 복사하여 구축하는 방식으로 해보겠습니다.

기본 네트워크 대역정보는 Router를 통한 10.1.0.0/16네트워크와 L2스위치를 통한 10.0.0.0/24네트워크를 구축하여 사용하겠습니다.

Host OS의 네트워크를 제외한 VM 들의 네트워크 환경은 다음과 같습니다.

위의 두 서버의 네트워크 구성 내용은 비슷하지만, 실제로는 별도의 네트워크에 구성되어 있습니다. 노트북 단말기와 서버는 사용하는 IP Address는 같지만, 다른 네트워크에서 구축되어 있어 서로 연동 되지는 않습니다. 참고해주세요.

Host Server Network 설정

Host 서버의 OS구성까지가 되어 있다면, Bridge Network를 설정 해 보겠습니다.

노트북 단말기 1번을 먼저 진행하겠습니다.
그럼, 사용해야 될 NIC을 먼저 찾아봐야겠죠? “ip a” 명령어로 확인해 본다면, enx로 시작하는 NIC이 보이네요.
( 사전에 물리 구성을 하면서, “enx00e04c68318f”는 External Network로 “enx88366cf74ee8″는 Internal Network로 네트워크 스위치에 구성을 해 두었습니다. )

## netplan 설정 확인 
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
#     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
#     inet 127.0.0.1/8 scope host lo
#        valid_lft forever preferred_lft forever
#     inet6 ::1/128 scope host
#        valid_lft forever preferred_lft forever
# 2: enx00e04c68318f: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel  UP group default qlen 1000
#     link/ether ea:80:d8:a3:bd:c1 brd ff:ff:ff:ff:ff:ff permaddr 00:e0:4c:68:31:8f
# 3: enx88366cf74ee8: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel  state UP group default qlen 1000
#     link/ether e2:f5:21:a9:e3:3d brd ff:ff:ff:ff:ff:ff permaddr 88:36:6c:f7:4e:e8
# 4: wlp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
#     link/ether b0:7d:64:f2:02:97 brd ff:ff:ff:ff:ff:ff

사전에 정의한 NIC을 찾으셨나요? 이제 해당 NIC에 설정을 넣어보도록 하겠습니다. Netplan을 사용해서 Bridge Network를 구성하겠습니다.

## Netplan Internal Network 설정
tee > 01.Internal_Network.yaml << EOF
# NIC Solt 0 Port 0 == enx00e04c68318f == Ext
# NIC Solt 1 Port 0 == enx88366cf74ee8 == Int
network:
    renderer: networkd
    version: 2
    ethernets:
        enx88366cf74ee8: {}
    bridges:
        br1:
            interfaces: [enx88366cf74ee8]
            addresses: [10.0.0.100/24]
EOF

## Netplan Internal Network 적용
netplan apply 

## Netplan External Network 설정
tee > 02.External_Network.yaml << EOF
# NIC Solt 0 Port 0 == enx00e04c68318f == Ext
# NIC Solt 1 Port 0 == enx88366cf74ee8 == Int
network:
    renderer: networkd
    version: 2
    ethernets:
        enx00e04c68318f: {}
    bridges:
        br0:
            interfaces: [enx00e04c68318f]
            addresses: [10.1.0.100/16]
            routes:
            - to: 0.0.0.0/0
              via: 10.1.1.254
            nameservers:
              addresses: [8.8.8.8]
EOF


## Netplan External Network 적용
netplan apply 

## Network 확인 
ip -4 -o a
# 1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
# 7: br0    inet 10.1.0.100/16 brd 10.1.255.255 scope global br0\       valid_lft forever preferred_lft forever

# 8: br1    inet 10.0.0.100/24 brd 10.0.0.255 scope global br1\       valid_lft forever preferred_lft forever

노트북 단말기의 1기의 Netplan 설정이 끝났네요. 이제 Bridge Network를 이용해서, VM 서버들이 Host Server와 동일한 네트워크를 사용 할 수 있게 되었습니다.

네트워크가 정상인지 확인도 할 겸, libvirt를 설치 해보도록 하겠습니다.

## apt update
apt update

## libvirt 설치 

apt install -y qemu-kvm libvirt-daemon-system virtinst bridge-utils libvirt-clients net-tools

apt를 통하여 정상적으로 libvrit가 구성되었다면 1번 노트북 단말기는 VM을 생성 할 준비가 되었습니다. 2번 노트북 단말기의 설정을 동일하게 진행해 보겠습니다.

1번 노트북 단말기와 동일하게 사용해야 될 NIC을 먼저 찾아 보겠습니다. “ip a” 명령어로 확인해 본다면, eno와 enx로 시작하는 NIC이 보이네요.
( 사전에 물리 구성을 하면서, “enx00e04c3605f4″는 External Network로 “eno1″는 Internal Network로 네트워크 스위치에 구성을 해 두었습니다. )

## netplan 설정 확인 
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
#     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
#     inet 127.0.0.1/8 scope host lo
#        valid_lft forever preferred_lft forever
#     inet6 ::1/128 scope host
#        valid_lft forever preferred_lft forever
# 2: eno1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel  state UP group default qlen 1000
#     link/ether 5e:2a:43:06:db:7b brd ff:ff:ff:ff:ff:ff permaddr b0:25:aa:3a:f5:fe
    altname enp2s0
# 3: enx00e04c3605f4: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc fq_codel  state UP group default qlen 1000
#     link/ether d6:fb:67:d4:a5:a9 brd ff:ff:ff:ff:ff:ff permaddr 00:e0:4c:36:05:f4
# 4: wlp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
#     link/ether 6c:6a:77:5f:d0:25 brd ff:ff:ff:ff:ff:ff

Netplan을 사용해서 Bridge Network를 구성하겠습니다.

## Netplan Internal Network 설정
tee > 01.Internal_Network.yaml << EOF
# NIC Solt 0 Port 0 == enx00e04c3605f4 == Ext
# NIC Solt 1 Port 0 == eno1 == Int
network:
    renderer: networkd
    version: 2
    ethernets:
        eno1: {}
    bridges:
        br1:
            interfaces: [eno1]
            addresses: [10.0.0.200/24]
EOF

## Netplan Internal Network 적용
netplan apply 

## Netplan External Network 설정
tee > 02.External_Network.yaml << EOF
# NIC Solt 0 Port 0 == enx00e04c3605f4 == Ext
# NIC Solt 1 Port 0 == eno1 == Int
network:
    renderer: networkd
    version: 2
    ethernets:
        enx00e04c3605f4: {}
    bridges:
        br0:
            interfaces: [enx00e04c3605f4]
            addresses: [10.1.0.200/16]
            routes:
            - to: 0.0.0.0/0
              via: 10.1.1.254
            nameservers:
              addresses: [8.8.8.8]
EOF

## Netplan External Network 적용
netplan apply 

## Network 확인 
ip -4 -o a
# 1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
# 7: br0    inet 10.1.0.200/16 brd 10.1.255.255 scope global br0\       valid_lft forever preferred_lft forever

# 8: br1    inet 10.0.0.200/24 brd 10.0.0.255 scope global br1\       valid_lft forever preferred_lft forever

노트북 단말기들의 Netplan 설정이 끝났네요.
libvirt도 설치도 바로 해보도록 하겠습니다.

## apt update
apt update

## libvirt 설치 

apt install -y qemu-kvm libvirt-daemon-system virtinst bridge-utils libvirt-clients net-tools

이제 서버를 구성해야 하는데요. 노트북 단말기와 동일합니다. NIC부터 찾아보겠습니다.
( 사전에 물리 구성을 하면서, “enp3s0f0″는 External Network로 “enp4s0f1″는 Internal Network로 네트워크 스위치에 구성을 해 두었습니다. )

## netplan 설정 확인 
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
#     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
#     inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
#     inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
# 2: enp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br1 state UP group default qlen 1000
#     link/ether 1c:c1:de:1a:39:e6 brd ff:ff:ff:ff:ff:ff
# 3: enp3s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
#     link/ether 1c:c1:de:1a:39:e8 brd ff:ff:ff:ff:ff:ff
#     inet6 fe80::1ec1:deff:fe1a:39e8/64 scope link
#        valid_lft forever preferred_lft forever
# 4: enp4s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
#     link/ether 1c:c1:de:1a:39:ea brd ff:ff:ff:ff:ff:ff
# 5: enp4s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br0 state UP group default qlen 1000
#     link/ether 1c:c1:de:1a:39:ec brd ff:ff:ff:ff:ff:ff

Netplan을 사용해서 Bridge Network를 구성하겠습니다.

## Netplan Internal Network 설정
tee > 01.Internal_Network.yaml << EOF
# NIC Solt 0 Port 0 == enp3s0f0 == Ext
# NIC Solt 0 Port 1 ==
# NIC Solt 1 Port 0 == 
# NIC Solt 1 Port 1 == enp4s0f1 == Int
network:
  renderer: networkd
  ethernets:
    enp3s0f0: {}
    enp4s0f1: {}
  bridges:
    br1:
      addresses:
      - 10.1.0.100/16
      routes:
      - to: 0.0.0.0/0
        via: 10.1.1.254
      nameservers:
        addresses:
        - 8.8.8.8
      interfaces: [enp3s0f0]
    br0:
      addresses:
      - 10.0.0.100/24
      interfaces: [enp4s0f1]
  version: 2
EOF


## Netplan External Network 적용
netplan apply 

## Network 확인 
ip -4 -o a
# 1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
# 7: br0    inet 10.1.0.100/16 brd 10.1.255.255 scope global br0\       valid_lft forever preferred_lft forever

# 8: br1    inet 10.0.0.100/24 brd 10.0.0.255 scope global br1\       valid_lft forever preferred_lft forever

서버까지 Netplan 설정이 끝났습니다. 이제 모든 VM서버들이 Bridge Network를 이용해서 Host Server와 동일한 네트워크를 사용 할 수 있게 되었습니다.

서버에도 libvirt를 설치 해보도록 하겠습니다.

## apt update
apt update

## libvirt 설치 

apt install -y qemu-kvm libvirt-daemon-system virtinst bridge-utils libvirt-clients net-tools

VM 서버 생성 ( 공통 작업 )

VM 서버를 구성하기 위해서는 모든 Host Server에 OS Cloud Image가 필요하고, OS 구축 시 사용하게 될 metadata의 경로와 VM서버가 구성 된 후, 사용하게 될 서버 이미지 경로가 필요하게 됩니다. 한개의 경로로 구성하셔도 되지만, 서비스 별로 구축이 필요하다면, 디렉토리로 구분해 주는 것도 좋은 방법이라고 생각됩니다.

## 예상 Directory 구조
tree /VM 
# /VM
# ├── image
# ├── playcecloud

# └── script

기본 경로인 /VM에 image와 playcecloud, 그리고 script를 생성하여 진행 하도록 하겠습니다.

## Directory 생성

mkdir -p /VM/playcecloud  /VM/image  /VM/script

디렉토리를 생성하였다면, 기준이 될 OS가 필요하겠죠?
Cloud OS를 다운로드 하도록 하겠습니다.

## Cloud Image 다운로드
cd /VM/image
wget http://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

OS Image는 Ubuntu 22.04를 기준으로 다운로드 하시면되겠습니다. ( 만약 24.0X버전을 사용하신다면, 추가로 다운로드 하시어 사용하시면 됩니다. )

이제 libvirt에서 사용할 가상 네트워크 설정을 할 텐데요. NIC – Bridge Network – libvirt Network – VM 순으로 이어지는 네트워크 구조에서 libvirt Network 부분입니다.

libvirt가 구축되면서 기본으로 구성되어 있는 상태부터 확인해 보겠습니다.

## Host Server 동일

virsh list 
#  Id   Name              State
# ---------------------------------

virsh net-list
#  Name             State    Autostart   Persistent
# ---------------------------------------------------
#  default          active   yes         yes

virsh list로 확인 할 수 있는 정보는 VM 생성 정보입니다. virsh net-list로 활인 할 수 있는 정보는 libvirt Network 정보 입니다. VM 서버는 구축된 것이 없지만, libvirt Network 는 default로 1개가 구성되어 있습니다.

default는 NAT를 사용하기 때문에 우리가 사용하는 환경에는 알맞지 않습니다. 삭제하고 Bridge Network 를 새로 구성하겠습니다.

## libvirt Network ( default 삭제 )
virsh net-destroy default
virsh net-undefine default

## libvirt Network 설정 생성
tee > /VM/script/br0.xml << EOF
<network>
    <name>br0</name>
    <forward mode='bridge'/>
    <bridge name='br0'/>
</network>
EOF
tee > /VM/script/br1.xml << EOF
<network>
    <name>br0</name>
    <forward mode='bridge'/>
    <bridge name='br1'/>
</network>
EOF

## libvirt Network 적용
virsh net-define /VM/script/br0.xml
virsh net-autostart br0
virsh net-start br0

virsh net-define /VM/script/br1.xml
virsh net-autostart br1
virsh net-start br1

## libvirt Network 생성 확인
virsh net-list
#  Name             State    Autostart   Persistent
# ---------------------------------------------------
#  br0              active   yes         yes
#  br1              active   yes         yes

libvrit Network 까지 생성이 완료 되었습니다.
이제 VM을 생성해 보겠습니다.

VM 서버 생성 ( 명령어를 통한 VM 1기씩 생성 )

저는 VM 서버를 생성하기 위해서는 2가지 방법을 제시하고 있는데요. 각 각의 방법이 장 단점이 있기 때문입니다.
명령어를 통해 VM 서버를 생성한다면, 모두 다른 설정을 한개씩 적용해서 서버별 특징을 별도로 구성 할 수 있게되고, 기준서버를 생성하여 사용하게 될경우 동일 서버를 빠르고 쉽게 만들 수 있기 때문입니다.

그럼 노트북 단말기에서 3기의 VM을 생성해보겠습니다.
만들게 될 VM 서버는 deploy, control-plane01, worker01 입니다. 그리고 성능은 deploy: 2Core 6G RAM 1TB Storage, control-plane01: 2Core 6GB RAM 50GB Storage, Worker01: 4Core 16GB RAM 50GB Storage 입니다. 하지만 노트북 단말기의 경우 1TB가 넘는 Storage를 사용하고 있는 경우가 드물다고 볼 수 있습니다. 외장형 SSD가 있거나 NAS가 있을경우, deploy 서버에 추가로 Attach해야 겠습니다. ( 여기서는 용량이 충분하다는 가정하에 명령어에 적용하겠습니다. NAS를 별도 사용 할 경우, deploy의 성능을 2Core 6G RAM 50GB Storage로 구성하셔도 됩니다. )

## ssh key 생성 
ssh-keygen

## Cloud Image 복사 
qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/deploy.qcow2

qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/control-plane01.qcow2

qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/worker01.qcow2

## Volume 크기 변경
qemu-img resize /VM/playcecloud/deploy.qcow2 1000G
qemu-img resize /VM/playcecloud/control-plane01.qcow2 50G
qemu-img resize /VM/playcecloud/worker01.qcow2 50G

## 메타데이터 생성
export PUB_KEY=$(cat /root/.ssh/id_rsa.pub)
cat > /VM/script/user-data << EOF
#cloud-config
password: password
users:
  - default
  - name: cloud
    gecos: Test User from OSC Inc.
    ssh-authorized-keys:
      - ${PUB_KEY}
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
EOF

## 설치 Image 생성 ( hostname을 고려하여 생성 )
cat > /VM/script/meta-data << EOF
local-hostname: deploy
EOF
genisoimage  -output /VM/playcecloud/deploy.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

cat > /VM/script/meta-data << EOF
local-hostname: control-plane01
EOF
genisoimage  -output /VM/playcecloud/control-plane01.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

cat > /VM/script/meta-data << EOF
local-hostname: worker01
EOF
genisoimage  -output /VM/playcecloud/worker01.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

## VM 생성
virt-install --connect qemu:///system --virt-type kvm --name deploy --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/deploy.qcow2,format=qcow2 --disk /VM/playcecloud/deploy.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name control-plane01 --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/control-plane01.qcow2,format=qcow2 --disk /VM/playcecloud/control-plane01.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name worker01 --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/worker01.qcow2,format=qcow2 --disk /VM/playcecloud/worker01.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

## VM 서버 생성 확인 
virsh list
#  Id   Name             State
# --------------------------------
#  1    controlplane01   running
#  2    worker01         running
#  3    deploy           running

정말 빠르게 서버가 생성이 되었습니다. 하지만 아직 IP Address 가 설정 되지 않았네요.
VM 서버에 접속하여 IP Address를 설정해 보겠습니다.

## IP Address 정보 
# deploy : 10.1.0.11, 10.0.0.11
# control-plane01 : 10.1.0.21, 10.0.0.21
# worker01  : 10.1.0.31, 10.0.0.31

## libvirt console 접속 ( 1기씩 접속하여 설정 합니다. )
virsh console deploy # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.11/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.11/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]



virsh console control-plane01 # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.21/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.21/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker01 # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.31/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.31/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply

^]

노트북 단말기 1기의 설정이 끝났습니다. ssh 접속과 ping 을 통해 정상여부를 확인해주면 되겠습니다. 바로 이어서 다른 노트북 단말기를 설정해 보겠습니다.

두번째 노트북 단말기에서 만들게 될 VM 서버는 control-plane02, control-plane03, worker02 입니다. 그리고 성능은 control-plane02: 2Core 6G RAM 50GB Storage, control-plane03: 2Core 6GB RAM 50GB Storage, Worker02: 4Core 16GB RAM 50GB Storage 입니다.

## ssh key 생성 
ssh-keygen

## Cloud Image 복사 
qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/control-plane02.qcow2

qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/control-plane03.qcow2

qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/worker02.qcow2

## Volume 크기 변경
qemu-img resize /VM/playcecloud/control-plane02.qcow2 1000G
qemu-img resize /VM/playcecloud/control-plane03.qcow2 50G
qemu-img resize /VM/playcecloud/worker02.qcow2 50G

## 메타데이터 생성
export PUB_KEY=$(cat /root/.ssh/id_rsa.pub)
cat > /VM/script/user-data << EOF
#cloud-config
password: password
users:
  - default
  - name: cloud
    gecos: Test User from OSC Inc.
    ssh-authorized-keys:
      - ${PUB_KEY}
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
EOF

## 설치 Image 생성 ( hostname을 고려하여 생성 )
cat > /VM/script/meta-data << EOF
local-hostname: control-plane02
EOF
genisoimage  -output /VM/playcecloud/control-plane02.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

cat > /VM/script/meta-data << EOF
local-hostname: control-plane03
EOF
genisoimage  -output /VM/playcecloud/control-plane03.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

cat > /VM/script/meta-data << EOF
local-hostname: worker02
EOF
genisoimage  -output /VM/playcecloud/worker02.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

## VM 생성
virt-install --connect qemu:///system --virt-type kvm --name control-plane02 --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/control-plane02.qcow2,format=qcow2 --disk /VM/playcecloud/control-plane02.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name control-plane03 --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/control-plane03.qcow2,format=qcow2 --disk /VM/playcecloud/control-plane03.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name worker02 --ram 8192 --vcpus=2 --os-variant ubuntu22.04 --disk path=/VM/playcecloud/worker02.qcow2,format=qcow2 --disk /VM/playcecloud/worker02.iso,device=cdrom --import --network bridge=br0 --network bridge=br1 --noautoconsole

## VM 서버 생성 확인 
virsh list
#  Id   Name             State
# --------------------------------
#  1    controlplane02   running
#  2    controlplane03   running
#  3    worker02         running

정말 빠르게 서버가 생성이 되었습니다. 하지만 아직 IP Address 가 설정 되지 않았네요.
VM 서버에 접속하여 IP Address를 설정해 보겠습니다.

## IP Address 정보 
# control-plane02 : 10.1.0.22, 10.0.0.22
# control-plane03 : 10.1.0.23, 10.0.0.23
# worker02  : 10.1.0.32, 10.0.0.32

## libvirt console 접속 ( 1기씩 접속하여 설정 합니다. )
virsh console control-plane02 # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.22/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.22/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]



virsh console control-plane02 # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.22/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.22/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker01 # cloud / password
sudo su -

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.31/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.31/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply

^]

노트북 단말기의 VM 구축이 끝났습니다.

지금은 총 6개 서버로 설정도 조금씩 다르고, 1기씩 VM 서버를 구축해도 큰 무리가 없었습니다만, 만약 100기 이상의 VM 을 구성하거나, 다중으로 여러 사이트의 환경을 구성할때는 쉽지 않을 것입니다. 그래서 1기의 기준 VM 서버를 만들어 놓고 복사하여 사용 할 수 있는 방법이 있는데요. 지금부터 구성해 보겠습니다.

VM 서버 생성 ( 기준 VM 서버를 통한 VM 생성 )

만들게 될 VM 서버는 deploy, control-plane01, control-plane02, control-plane03, worker01, worker02, worker03, worker04, worker05 입니다. 그리고 성능은 deploy: 2Core 8G RAM 1TB Storage, control-plane01-03: 2Core 8GB RAM 50GB Storage, Worker01-05: 4Core 16GB RAM 50GB Storage 입니다.

## ssh key 생성 
ssh-keygen

## Cloud Image 복사
qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/deploy.qcow2
qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/ubuntu01.qcow2
qemu-img create  -f qcow2 -F qcow2 -b /VM/image/jammy-server-cloudimg-amd64.img /VM/playcecloud/ubuntu02.qcow2

## Volume 크기 변경
qemu-img resize /VM/playcecloud/deploy.qcow2 1000G
qemu-img resize /VM/playcecloud/ubuntu01.qcow2 50G
qemu-img resize /VM/playcecloud/ubuntu02.qcow2 50G


## 메타데이터 생성
export PUB_KEY=$(cat /root/.ssh/id_rsa.pub)
cat > /VM/script/user-data << EOF
#cloud-config
password: password
users:
  - default
  - name: cloud
    gecos: Test User from OSC Inc.
    ssh-authorized-keys:
      - ${PUB_KEY}
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
EOF

## 설치 Image 생성 ( hostname을 고려하여 생성 )
cat > /VM/script/meta-data << EOF
local-hostname: ubuntu00
EOF
genisoimage  -output /VM/playcecloud/deploy.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data
genisoimage  -output /VM/playcecloud/ubuntu01.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data
genisoimage  -output /VM/playcecloud/ubuntu02.iso -volid cidata -joliet -rock /VM/script/user-data /VM/script/meta-data

## 기준 VM 서버 생성
virt-install --connect qemu:///system --virt-type kvm --name deploy --ram 8196 --vcpus=2 --os-type linux --os-variant ubuntu22.04 --disk path=/VM/playcecloud/deploy.qcow2,format=qcow2 --disk /VM/playcecloud/deploy.iso,device=cdrom --import --network bridge=br0  --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name ubuntu01 --ram 8196 --vcpus=2 --os-type linux --os-variant ubuntu22.04 --disk path=/VM/playcecloud/ubuntu01.qcow2,format=qcow2 --disk /VM/playcecloud/ubuntu01.iso,device=cdrom --import --network bridge=br0  --network bridge=br1 --noautoconsole

virt-install --connect qemu:///system --virt-type kvm --name ubuntu02 --ram 16384 --vcpus=4 --os-type linux --os-variant ubuntu22.04 --disk path=/VM/playcecloud/ubuntu02.qcow2,format=qcow2 --disk /VM/playcecloud/ubuntu02.iso,device=cdrom --import --network bridge=br0  --network bridge=br1 --noautoconsole
   
## 가상 기준 서버 생성 확인
virsh list
 Id    Name                           State
----------------------------------------------------
 10    deploy                       running
 11    ubuntu01                       running
 12    ubuntu02                       running

## 기준 서버 정지
virsh shutdown ubuntu01
virsh shutdown ubuntu02

## VM 서버 복사 
virt-clone --original ubuntu01 --name control-plane01 --file /VM/playcecloud/control-plane01.img
virt-clone --original ubuntu01 --name control-plane02 --file /VM/playcecloud/control-plane02.img
virt-clone --original ubuntu01 --name control-plane03 --file /VM/playcecloud/control-plane03.img

virt-clone --original ubuntu02 --name worker01 --file /VM/playcecloud/worker01.img
virt-clone --original ubuntu02 --name worker02 --file /VM/playcecloud/worker02.img
virt-clone --original ubuntu02 --name worker03 --file /VM/playcecloud/worker03.img
virt-clone --original ubuntu02 --name worker04 --file /VM/playcecloud/worker04.img
virt-clone --original ubuntu02 --name worker05 --file /VM/playcecloud/worker05.img

## VM 서버 실행
virsh start control-plane01
virsh start control-plane02
virsh start control-plane03

virsh start worker01
virsh start worker02
virsh start worker03
virsh start worker04

virsh start worker05

복사만으로 서버가 생성이 되었네요. 하지만 아직 IP Address와 hostname이 설정 되지 않았습니다.
VM 서버에 접속하여 IP Address를 설정해 보겠습니다.

## IP Address 정보 
# deploy: 10.1.0.11, 10.0.0.11
# control-plane02 : 10.1.0.21, 10.0.0.21
# control-plane02 : 10.1.0.22, 10.0.0.22
# control-plane03 : 10.1.0.23, 10.0.0.23
# worker01  : 10.1.0.31, 10.0.0.31
# worker02  : 10.1.0.32, 10.0.0.32
# worker03  : 10.1.0.33, 10.0.0.33
# worker04  : 10.1.0.34, 10.0.0.34
# worker05  : 10.1.0.35, 10.0.0.35


## libvirt console 접속 ( 1기씩 접속하여 설정 합니다. )
virsh console deploy # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname deploy

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.11/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.11/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]



virsh console control-plane01 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname control-plane01

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.21/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.21/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console control-plane02 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname control-plane02

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.22/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.22/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console control-plane03 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname control-plane03

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.23/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.23/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker01 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname worker01

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.31/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.31/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker02 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname worker02

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.32/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.32/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker03 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname worker03

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.33/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.33/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker04 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname worker04

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.34/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.34/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply
^]

virsh console worker05 # cloud / password
sudo su -

## hostname 설정
hostnamectl set-hostname worker05

## IP address 설정
export ITF1=`ip -4 -o a | grep -v ' lo' | awk '{print $2}'`
export ITF2=`ip -4 -o a | grep -v ' lo' | awk '{print $3}'`

tee > /etc/netplan/01.network_config.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    ${ITF1}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.1.0.35/16
      routes:
      - to: default
        via: 10.1.1.254
      nameservers:
        addresses: [127.0.0.1]
    ${ITF2}:
      dhcp4: false
      dhcp6: false
      addresses:
      - 10.0.0.35/24
EOF

chmod 600 /etc/netplan/01.network_config.yaml
netplan apply

^]

모든 Host Server의 VM 구축이 끝났습니다.


결론

우리는 항상 테스트를 하고 있고, 특히나 가상환경이 많이 필요하게 되는 클라우드 엔지니어에게는 VM 환경을 구축하는 것은 거의 매일 발생하는 업무 입니다. 지금처럼 libvirt를 이용 할 수도있고, Virtual box를 이용 할 수도 있겠습니다.

더 좋고, 더 대규모 환경의 구성이 가능하다면, OpenStack으로 구축하는 것도 매우 좋을 것입니다.

하지만, 지금처럼 10개 미만의 테스트 환경은 간편하게 명령어 몇 개로 구축하는 방법도 좋지 않을까 합니다. 특히나, VM서버를 원하는대로 만들 수도 있고, 복사해서 대량으로 동일 서버를 만들어 낼수도 있으니 얼마나 좋은지 모르겠습니다.

이제 만들어진 VM 서버를 통해 Playce Kube를 구축하고 사용해 볼 텐데요. 필요할때마다 어렵게 헤메이지 말고 위의 방법으로 쉽게 VM 환경을 만들었으면 좋겠습니다.

Kubernetes란 무엇인가를 시작으로, 고객의 니즈와 서비스 형태를 바탕으로 완성한 쿠버네티스 시스템을 분석하여 블로깅 하고 있습니다.
우리 모두 오픈소스컨설팅의 미션 처럼 기술을 나누고, 모두 함께 성장했으면 좋겠습니다.


참고사이트

kubectl 명령어

Kubernetes Components

쿠버네티스-위키백과

CNCF 홈페이지

Playce Kube github

Hey guys Hi guys I'm Gunwoong, a technical engineer. I'm dreaming of technology development that everyone can use.

Leave a Reply

Your email address will not be published. Required fields are marked *