[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
하드웨어를 가상화하는 전통적인 하이퍼바이저 가상화 대신 커널을 공유하여 운영체제 수준에서 격리를 진행합니다. 둘 다 사용해 보면 VM 에 비해 확실히 적은 리소스를 사용하며 빠르죠. 기본적으로 커널을 사용하므로 리눅스에 기반을 하고 있고 Namespace 와 cgroups 을 사용합니다.
네임스페이스는 격리 환경 기술입니다. 많은 종류의 네임스페이스가 있고, 여러 종류의 네임스페이스를 조합해서 컨테이너로 사용합니다.
lsns 로 현재 사용중인 모든 네임스페이스를 확인할 수 있습니다.

NPROCS(Number of Processes) 는 namespace 에서 실행되고 있는 프로세스의 개수입니다.
PID 는 해당 네임스페이스를 생성하거나 실행중인 프로세스 ID 입니다.
ls -l /proc/self/ns/ 와 sudo ls -l /proc/1/ns/ 의 값을 비교해보면 상속받았다는 것을 알 수 있습니다. root 에서 lsns 로 살펴보면 PID 1로부터 시작하는 것을 알 수 있습니다.

보면 전용 네임스페이스에서 데몬들이 실행되고 있는데, 최소 권한으로 보안과 안정성을 가질 수 있기에 격리해서 사용합니다.
unshare 커맨드는 사용자가 새로운 네임스페이스에서 지정된 프로그램을 실행할 수 있게 합니다. 위에 나열된 격리할 수 있는 옵션들을 사용하면 해당 네임스페이스로 격리됩니다.
--net, --uts, --ipc, --user, --cgroup, --mount, --pid, --mount-proc, --fork
bash: fork: Cannot allocate memoryunshare 를 이용해서 contaienr 를 만들어 봅니다. bash 와 다른 패키지들을 미리 구성하기 위해 debootstrap 을 사용합니다.
sudo apt-get install -y util-linux debootstrap
mkdir my-container
sudo debootstrap stable ./my-container http://deb.debian.org/debian
sudo unshare --pid --net --uts --ipc --mount --mount-proc --fork chroot ./my-container /bin/bash unshare 로 네임스페이스를 만들고 chroot 로 원하는 폴더를 루트 디렉토리로 만들고, /bin/bash 를 수행합니다.
moint -t tmpfs none /tmpchroot를 포함해 여러 안전장치를 더합니다. unshare 에서 network 격리로 생성한 네임스페이스에는 루프백만 있습니다.
호스트나 외부와 통신하기 위해서는 다른 네트워크 설정이 필요합니다.
브릿지를 이용해서 컨테이너끼리 통신하고 마스킹과 포워딩으로 인터넷에 접속 가능하게 합니다. sudo apt-get install bridge-utils iproute2
veth 쌍을 이용해서 host 와 연결하면 host 와 통신할 수 있습니다.
# 컨테이너 실행 & PID 가져오기
sudo unshare --pid --net --uts --ipc --mount --mount-proc --fork chroot ./my-container /bin/bash
CONTAINER_PID=$(ps aux | grep "[c]hroot ./my-container /bin/bash" | awk '{print $2}' | sort -n | tail -n 1)
# veth 쌍 생성 & 컨테이너 네임스페이스로 이동
sudo ip link add veth-host type veth peer name veth-container
sudo ip link set veth-container netns $CONTAINER_PID
# 호스트 네트워크 설정
sudo ip addr add 10.0.0.1/24 dev veth-host
sudo ip link set veth-host up
# 컨테이너 네트워크 설정
sudo nsenter -t $CONTAINER_PID -n ip addr add 10.0.0.2/24 dev veth-container
sudo nsenter -t $CONTAINER_PID -n ip link set veth-container up
# 루프백 활성화, default 게이트웨이 설정
sudo nsenter -t $CONTAINER_PID -n ip link set lo up
sudo nsenter -t $CONTAINER_PID -n ip route add default via 10.0.0.1이제 ping 10.0.0.1 등으로 호스트와의 통신을 확인할 수 있습니다.
veth를 쌍으로 생성하여 container 가 꺼지면 호스트의 veth 도 삭제됩니다.
호스트와의 통신은 했지만 다른 컨테이너와 그리고 인터넷으로의 통신은 되지 않았습니다.
브릿지를 통해 다른 컨테이너와 통신하고 NAT(MASQUERADE) 으로 인터넷에 접속할 수 있습니다.
sudo ip link add br0 type bridge # br0 라는 브리지 생성
sudo ip addr add 172.17.0.1/16 dev br0 # 브리지에 IP 주소 할당
sudo ip link set br0 up # 브리지 활성
ip addr show br0 # up 상태 확인
brctl show # 브리지 상태 확인
veth 를 각 컨테이너에 생성 후 호스트 veth 를 브릿지에 연결하면 됩니다.
브릿지를 스위치처럼 사용하여 통신을 하게 합니다.
Comments