2019년 10월 19일 토요일

쿠버네티스 네트워크 정리

본 문서는 쿠버네티스의 공식문서(https://kubernetes.io/docs/concepts/cluster-administration/networking/)의 일부를 번역하고 링크를 정리하여 붙이는 것에서 시작한 문서입니다.
일부 링크는 정상적이지 않거나 통합되지 않아, 원 문서에서 삭제하였습니다.
일부 추가된 부분은 이해를 돕기위한 링크입니다.
* Cluster Network
네트워킹은 쿠버네티스의 중요한 부분이다 하지만 정확한 이해를 위해서는 이해하기 위한 노력이 필요하다.
여기 4개의 주소에 대한 독립적인 문제가 있다.
1. 높은 결합도의 컨테이너간 통신 : 이 문제는 pods와 localhost의 통신으로 해결된다.
2. Pod 간의 통신 : 이것이 이 문서의 주제다.
3. Pod와 서비스 간의 통신 : 이 영역은 서비스를 통해 해결한다.
4. 외부와 서비스간의 통신 : 이 영역도 서비스를 통해 해결한다.
+ 쿠버네티스 네트워크 모델
+ 구버네티스 네트워크 모델을 구현하는 법
쿠버네티스는 기계의 모든것을 응용프로그램 간에 공유한다. 일반적으로 한대의 머신을 두개의 응용플그램이 공유하려면 해당 응용프로그램이 같은 포트를 사용하지 않도록 해야한다. 여러명의 개발자가 사용하는 포트를 적절하게 조절하는 것은 매우 어렵다. 이 문제는 사용자의 영역을 벗어난 클러스터 레벨의 문제이다.
동적포트 할당은 시스템에 많은 문제를 불러온다 - 모든 응용프로그램은 사용하는 포트들을 플래그로 가져가야 하고, API 서버는 동적포트번호를 설정블럭에 집어넣는 방법을 알아야 한다. 서비스는 이들을 어떻게 찾는지 알아야 한다. 쿠버네티스는 다른 방법을 취합니다.
* 쿠버네티스 네트워크 모델
모든 Pod는 각각의 IP를 갖는다. Pod 간의 통신을 위해서 링크를 만들 필요가 없다는 것과 대부분의 경우 컨테이너와 호트스에 대한 연결을 위한 고려를 할 필요가 없다는 것을 의미한다.이렇게하면 포트 할당, 이름 지정, 서비스 검색,로드 밸런싱, 애플리케이션 구성 및 마이그레이션 측면에서 Pod를 VM 또는 물리적 호스트처럼 취급 할 수있는 명시적인 모델이 생성된다.
쿠버네티스는 모든 네트워크 구현에 다음과 같은 기본요구 사항을 적용한다.(의도적 네트워크 세분화 정책 제외)
- 노드에 있는 Pod 들은 모든 노드들과 NAT 없이 통신이 가능하다.
- 노드에 설치되어 있는 Agent()들은 해당 노드에 있는 모든 Pod들과 통신이 가능하다.
주의 : 호스트 노트에서 Pod의 실행을 지원하는 경우(ex :Linux or Mac?)
- 노드의 호스트 네트워크에있는 포드는 NAT없이 모든 노드에 있는 모든 포드와 통신 할 수 있다.
이 모델은 전체적으로 덜 복잡 할뿐만 아니라 Kubernetes가 VM에서 컨테이너로 응용 프로그램을 이행하려고 할때 유효하다. 작업이 이전에 VM에서 실행 된 경우 VM에 IP가 있고 프로젝트의 다른 VM과 통신 할 수 있다. 이것은 동일한 기본 모델이다.
Kubernetes의 IP주소는 Pod영역에 존재한다. - 컨테이너들은 Pod와 Network namespace와 IP address를 공유한다. 이는 동일 Pod에 존재하는 컨테이너들이 localhost를 통해 연결될 수 있음을 의미한다. 이는 컨테이너의 사용 Port에 대해서 Pod가 조율해야 함을 의미한다. 이것은 프로세스에 VM에서 프로세스를 관리하는 것과 다르지 않다. 이 모델을 "IP per pod"라고 부른다.
이에 대한 구현은 사용중인 컨테이너의 내부 동작의 일부이다.
노드 자체에서 포트로 전달되는 포트 (호스트 포트라고 함)를 요청할 수 있지만 이는 적당한(niche) 작업이다. 전달이 구현되는 방법은 컨테이너 런타임에처 처리한다. 포드 자체는 호스트 포트의 존재 여부를 감춘다.
* 쿠버네티스 네트워크 모델의 구현
이 네트워크 모델을 구현할 수있는 여러 가지 방법이 있다. 이 문서는 다양한 방법에 대한 철저한 연구는 아니지만 다양한 기술에 대한 소개가 되기를 희망한다.
다음 네트워킹 옵션은 알파벳순으로 정렬되어 있다. 순서는 우선 순위를 의미하지 않는다.
[ACI]
ACI는 Cisco Application Centric Infrastructure의 줄임말로 세부 내용은 하단의 링크를 통해 확인 할 수 있다.
컨테이너, 가상 머신 및 베어 메탈 서버를 지원하는 통합 오버레이 및 언더 레이 SDN 솔루션을 제공한다. ACI는 ACI를위한 컨테이너 네트워킹 통합을 제공한다.
[Apstra의 AOS]
AOS는 단순한 통합 플랫폼에서 복잡한 데이터 센터 환경을 생성하고 관리하는 인 텐트 기반 네트워킹 (Intent-Based Networking)시스템이다. AOS는 확장 성이 뛰어난 분산 설계를 활용하여 네트워크 중단을 제거하면서 비용을 최소화한다.
IBS에 대한 참조자료.
AOS Reference Design은 현재 레거시 Layer-2 스위칭 문제를 제거하는 Layer-3 연결 호스트를 지원한다. 이 Layer-3 호스트는 Linux 서버 (Debian, Ubuntu, CentOS) 일 수 있으며 맨 위 랙 스위치 (TOR)와 직접 BGP(Border Gateway Protocol) 인접 관계를 만든다. AOS는 라우팅 인접성을 자동화 한 다음 Kubernetes 배포에서 일반적으로 사용되는 RHI (Route Health Injection)에 대한 세밀한 제어를 제공한다.
BGP 관련 참조 자료.
AOS에는 Kubernetes가 애플리케이션 요구 사항에 따라 네트워크 정책을 신속하게 변경할 수있는 풍부한 REST API 엔드 포인트 세트가 있다. 네트워크 설계에 사용 된 AOS 그래프 모델을 워크로드 프로비저닝과 통합하여 프라이빗 및 퍼블릭 클라우드 모두에 대한 종단간 관리 시스템을 향상시킬 수 있다.
AOS는 Cisco, Arista, Dell, Mellanox, HPE 및 Microsoft SONiC, Dell OPX 및 Cumulus Linux와 같은 개방형 네트워크 운영 체제 및 수많은 화이트 박스 시스템을 포함한 제조업체의 일반적인 공급 업체 장비 사용을 지원한다.
자세한 AOS 시스템 동작에 대한 내용은 아래의 링크를 참조하라.
[쿠버네티스를 위한 AWS VPC CNI]
AWS VPC CNI는 Kubernetes 클러스터를위한 통합 AWS Virtual Private Cloud (VPC) 네트워킹을 제공한다. 이 CNI 플러그인은 높은 처리량 및 가용성, 낮은 대기 시간 및 최소 네트워크 지터(대기시간의 변동)를 제공한다. 또한 사용자는 Kubernetes 클러스터 구축을 위해 기존 AWS VPC 네트워킹 및 보안 모범 사례를 적용 할 수 있다. 여기에는 VPC 흐름 로그, VPC 라우팅 정책 및 네트워크 트래픽 격리를 위한 보안 그룹을 사용하는 기능이 포함된다.
이 CNI 플러그인을 사용하면 Kubernetes 포드가 VPC 네트워크에서와 동일한 포드 내부의 IP 주소를 가질 수 있다. CNI는 각 Kubernetes 노드에 노드의 포드에 대해 각 ENI의 보조 IP 범위를 사용하여 AWS Elastic Networking Interfaces (ENI)를 할당한다. CNI에는 빠른 포드 시작 시간을위한 ENI 및 IP 주소의 사전 할당 제어 기능이 포함되어 있으며 최대 2,000 개의 노드로 구성된 대규모 클러스터가 가능하다.
또한 네트워크 정책 시행을 위해 CNI를 Calico와 함께 실행할 수 있다. AWS VPC CNI 프로젝트는 GitHub에 대한 설명서가 포함 된 오픈 소스입니다.
[대용량 스위칭 네트워크에서의 대용량 패브릭(Big Cloud Fabric from Big Switch Networks)]
Big Cloud Fabric은 클라우드 네이티브 네트워킹 아키텍처로, 개인 클라우드 / 온-프레미스 환경에서 Kubernetes를 실행하도록 설계되었다. Big Cloud Fabric은 통합 된 물리적 및 가상 SDN을 사용하여로드 밸런싱, 가시성, 문제 해결, 보안 정책 및 컨테이너 트래픽 모니터링과 같은 고유 한 컨테이너 네트워킹 문제를 해결한다.
Big Cloud Fabric의 가상 포드 다중 테넌트 아키텍처(다중 고객을 완전히 분리하는 모델)를 통해 Kubernetes, RedHat OpenShift, Mesosphere DC / OS 및 Docker Swarm과 같은 컨테이너 오케스트레이션 시스템은 VMware, OpenStack & Nutanix와 같은 VM 오케스트레이션 시스템과 함께 기본적으로 통합된다. 고객은 원하는 수의 클러스터를 안전하게 상호 연결할 수 있으며 필요한 경우 이들간에 테넌트 간 통신이 가능하다.
BCF는 Gartner에 의해 최신 Magic Quadrant에서 선각자로 인식되었다.BCF Kubernetes 온-프레미스 배포 중 하나 (여러 지역에 걸쳐 여러 DC에서 실행되는 Kubernetes, DC / OS 및 VMware 포함)도 여기에서 참조된다.
[Cilium]
Cilium은 애플리케이션 컨테이너간에 네트워크 연결을 제공하고 투명하게 보호하기위한 오픈 소스 소프트웨어이다. Cilium은 L7 / HTTP를 인식하며 네트워크 주소 지정에서 분리 된 ID 기반 보안 모델을 사용하여 L3-L7에서 네트워크 정책을 시행 할 수 있다.
[화웨이의 CNI-Genie]
CNI-Genie는 Kubernetes가 런타임시 Kubernetes 네트워크 모델의 다른 구현에 동시에 액세스 할 수 있도록하는 CNI 플러그인이다. 여기에는 Flannel, Calico, Romana, Weave-net과 같은 CNI 플러그인으로 실행되는 모든 구현이 포함된다.
CNI-Genie는 각기 다른 CNI 플러그인의 포드에 여러 개의 IP 주소를 할당 할 수 있다.
[cni-ipvlan-vpc-k8s]
cni-ipvlan-vpc-k8s에는 Amazon을 사용하여 Amazon Virtual Private Cloud (VPC) 환경에서 Kubernetes를위한 간단한 호스트 로컬 저 지연 시간, 높은 처리량 및 호환 네트워킹 스택을 제공하는 CNI 및 IPAM 플러그인 세트가 포함되어 있다. L2 모드에서 Linux 커널의 IPvlan 드라이버를 사용하여 ENI (Elastic Network Interfaces) 및 AWS 관리 IP를 포드에 바인딩한다.
플러그인은 VPC 내에서 구성하고 배포 할 수 있도록 간단하게 설계되었다. Kubelets는 오버레이 네트워크 관리, BGP 관리, 소스 / 대상 검사 비활성화 또는 VPC 라우팅 테이블을 조정하여 각 호스트에 인스턴스 별 서브넷을 제공하는 등의 권장 복잡성을 요구하지 않고 필요에 따라 IP 사용량을 부팅 한 다음 자체 구성 및 확장한다. VPC 당 50-100 개 항목으로 제한). 즉, cni-ipvlan-vpc-k8s는 AWS 내에서 Kubernetes를 대규모로 배포하는 데 필요한 네트워크 복잡성을 크게 줄인다.
[Contiv]
Contiv는 다양한 사용 사례에 대해 구성 가능한 네트워킹 (BGP를 사용하는 기본 l3, vxlan을 사용하는 오버레이, 클래식 l2 또는 Cisco-SDN / ACI)을 제공합니다. Contiv는 모두 오픈소스이다.
[Contrail / Tungsten Fabric]
Tungsten Fabric을 기반으로하는 Contrail은 진정한 개방형 멀티 클라우드 네트워크 가상화 및 정책 관리 플랫폼이다. Contrail 및 Tungsten Fabric은 Kubernetes, OpenShift, OpenStack 및 Mesos와 같은 다양한 오케스트레이션 시스템과 통합되어 있으며 가상 머신, 컨테이너 / 포드 및 베어 메탈 워크로드에 대해 서로 다른 격리 모드를 제공한다.
[DANM]
DANM은 Kubernetes 클러스터에서 실행되는 통신 워크로드를위한 네트워킹 솔루션이다. 다음과 같은 구성 요소로 구성된다.
- 고급 기능으로 IPVLAN 인터페이스를 프로비저닝 할 수있는 CNI 플러그인
- 여러 클러스터 전체의 불연속 L3 네트워크를 관리하고 요청시 동적, 정적 또는 IP 할당 체계를 제공하지 않는 내장 IPAM 모듈
- 자체 CNI를 통해 또는 SRI-OV 또는 Flannel과 같은 널리 사용되는 CNI 솔루션에 작업을 동시에 위임하여 여러 네트워크 인터페이스를 컨테이너에 연결할 수있는 CNI 메타 플러그인
- 모든 Kubernetes 호스트의 VxLAN 및 VLAN 인터페이스를 중앙에서 관리 할 수있는 Kubernetes 컨트롤러
- Kubernetes의 서비스 기반 서비스 검색 개념을 확장하여 포드의 모든 네트워크 인터페이스에서 작동하는 다른 Kubernetes 컨트롤러
이 도구 세트를 통해 DANM은 여러 개의 분리 된 네트워크 인터페이스를 제공 할 수 있으며 포드에 대해 다른 네트워킹 백엔드 및 고급 IPAM 기능을 사용할 수 있다.
[Flannel]
Flannel은 Kubernetes 요구 사항을 충족하는 매우 간단한 오버레이 네트워크이다. 많은 경우 성공적으로 적용이 가능하다.
[Google Compute Engine (GCE)]
Google Compute Engine 클러스터 구성 스크립트의 경우 고급 라우팅을 사용하여 각 VM에 서브넷을 할당한다 (기본값은 / 24-254 IP). 해당 서브넷에 바인딩 된 모든 트래픽은 GCE 네트워크 패브릭에 의해 VM으로 직접 라우팅된다. 이것은 아웃 바운드 인터넷 액세스를 위해 NAT 인 VM에 할당 된 "기본"IP 주소에 추가되며. Linux 브리지 (cbr0)는 해당 서브넷에 존재하도록 구성되며 docker의 --bridge 플래그로 전달된다.
Docker를 다음과 같은 옵션으로 실행한다.
DOCKER_OPTS="--bridge=cbr0 --iptables=false --ip-masq=false"
이 브리지는 노드의 .spec.podCIDR에 따라 Kubelet (-network-plugin = kubenet 플래그로 제어)에 의해 생성된다.
Docker는 이제 cbr-cidr 블록에서 IP를 할당합니다. 컨테이너는 cbr0 브리지를 통해 서로 노드에 도달 할 수 있다. 이러한 IP는 모두 GCE 프로젝트 네트워크 내에서 라우팅 가능하다.
그러나 GCE 자체는 이러한 IP에 대해 전혀 알지 못하므로 아웃 바운드 인터넷 트래픽을 위해 IP를 NAT하지 않는다. iptables 규칙을 사용하여 GCE 프로젝트 네트워크 외부의 IP (10.0.0.0/8)에 바인딩 된 트래픽을 가장하는 (일명 SNAT-마치 패킷이 노드 자체에서 온 것처럼 보이도록 만들기 위해) 사용된다.
iptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o eth0 -j MASQUERADE
마지막으로 커널에서 IP 전달이 활성화되어 있으므로 커널은 브리지 된 컨테이너에 대한 패킷을 처리한다.
sysctl net.ipv4.ip_forward=1
결과적으로 모든 포드는 각자에게 연결되고 인터넷을 통해서 트래픽을 전달할 수 있다.
[Jaguar]
Jaguar는 OpenDaylight 기반의 Kubernetes 네트워크를위한 오픈 소스 솔루션이다. Jaguar는 vxlan을 사용하여 오버레이 네트워크를 제공하고 Jaguar CNIPlugin은 포드 당 하나의 IP 주소를 제공한다.
[k-vswitch]
k-vswitch는 Open vSwitch를 기반으로하는 간단한 Kubernetes 네트워킹 플러그인이다. Open vSwitch의 기존 기능을 활용하여 작동하기 쉽고 성능이 뛰어나고 안전한 강력한 네트워킹 플러그인을 제공한다.
[Knitter]
Knitter는 Kubernetes에서 여러 네트워킹을 지원하는 네트워크 솔루션이다. 테넌트 관리 및 네트워크 관리 기능을 제공한다. Knitter에는 응용 프로그램의 IP 주소 유지, IP 주소 마이그레이션 등과 같은 여러 네트워크 계층 외에 엔드 투 엔드 NFV 컨테이너 네트워킹 솔루션 세트가 포함되어 있다.
[Kube-OVN]
Kube-OVN은 기업을위한 OVN 기반 kubernetes 네트워크 패브릭입니다. OVN / OVS의 도움으로 서브넷, QoS, 고정 IP 할당, 트래픽 미러링, 게이트웨이, 오픈 플로우 기반 네트워크 정책 및 서비스 프록시와 같은 고급 오버레이 네트워크 기능을 제공한다.
[Kube-router]
Kube-router는 Kubernetes를위한 특수 목적의 네트워킹 솔루션으로 고성능 및 운영 단순성을 제공한다. Kube-router는 Linux LVS / IPVS 기반 서비스 프록시, 오버레이가없는 Linux 커널 전달 기반 포드 대 포드 네트워킹 솔루션 및 iptables / ipset 기반 네트워크 정책 집행자를 제공한다.
[L2네트워크와 리눅스 브리징]
"베어 메탈"환경의 간단한 스위치와 같은 "dumb"L2 네트워크가있는 경우 위의 GCE 설정과 유사한 작업을 수행 할 수 있어야한다. 이 지침은 매우 우연히 시도되었지만 작동하는 것으로 보이지만 철저히 테스트되지 않았다. 이 기술을 사용하여 프로세스를 완료 한 경우 알려주십시오. 이에 대한 훌륭한 튜토리얼이 있습니다. 항목에서 "리눅스 브릿지 장치들"을 참고 하세요.
[Mutlus(다중 네트워크 플러그인)]
Multus는 Kubernetes의 CRD 기반 네트워크 객체를 사용하여 Kubernetes의 멀티 네트워킹 기능을 지원하는 멀티 CNI 플러그인이다.
Multus는 CNI 사양을 구현하는 모든 참조 플러그인 (예 : Flannel, DHCP, Macvlan) 및 타사 플러그인 (예 : Calico, Weave, Cilium, Contiv)을 지원하며, Multus는 Kubernetes의 클라우드 네이티브 및 NFV 기반 응용 프로그램과 함께 Kubernetes의 SRIOV, DPDK, OVS-DPDK 및 VPP 워크로드를 지원한다.
[NSX-T]
VMware NSX-T는 네트워크 가상화 및 보안 플랫폼이다. NSX-T는 다중 클라우드 및 다중 하이퍼 바이저 환경에 네트워크 가상화를 제공 할 수 있으며 이기종 엔드 포인트 및 기술 스택이있는 새로운 애플리케이션 프레임 워크 및 아키텍처에 중점을 둔다. 이러한 환경에는 vSphere 하이퍼 바이저 외에도 KVM, 컨테이너 및 베어 메탈과 같은 다른 하이퍼 바이저가 포함된다.
NSX-T Container Plug-in (NCP)은 NSX-T와 Kubernetes와 같은 컨테이너 오케 스트레이터 간의 통합뿐만 아니라 NSX-T와 PKS (Pivotal Container Service) 및 OpenShift와 같은 컨테이너 기반 CaaS / PaaS 플랫폼 간의 통합을 제공합니다.
Plugin Document는 여기(
서 확인할 수 있다.
[Nuage Networks VCS (Virtualized Cloud Services)]
Nuage(https://www.nuagenetworks.net)는 확장 성이 뛰어난 정책 기반 SDN (Software-Defined Networking) 플랫폼을 제공한다. Nuage는 개방형 표준을 기반으로하는 풍부한 기능의 SDN 컨트롤러와 함께 데이터 플레인 용 오픈 소스 Open vSwitch를 사용한다.
Nuage 플랫폼은 오버레이를 사용하여 Kubernetes Pod와 비 Kubernetes 환경 (VM 및 베어 메탈 서버)간에 완벽한 정책 기반 네트워킹을 제공하며, Nuage의 정책 추상화 모델은 애플리케이션을 염두에두고 설계되었으며 애플리케이션에 대한 세분화 된 정책을 쉽게 선언 할 수 있게 한다. 플랫폼의 실시간 분석 엔진을 통해 Kubernetes 애플리케이션에 대한 가시성과 보안 모니터링이 가능하다.
[OpenVSwitch]
OpenVSwitch는 다소 발달된 오버레이 네트워크를 구축하는 복잡한 방법으로, 이것은 네트워킹 영역의 몇몇 “Big Shop- 대형 벤더를 의미” 에 의해 승인되었다.
[OVN (Open Virtual Networking)]
OVN은 Open vSwitch 커뮤니티에서 개발 한 오픈 소스 네트워크 가상화 솔루션이다. 논리적 스위치, 논리적 라우터, 상태 저장 ACL,로드 밸런서 등을 만들어 서로 다른 가상 네트워킹 토폴로지를 구축 할 수 있다. 이 프로젝트에는 ovn-kubernetes에 특정 Kubernetes 플러그인 및 설명서가 있다.
[Project Calico]
Project Calico는 오픈 소스 컨테이너 네트워킹 공급자 및 네트워크 정책 엔진이다.
Calico는 Linux (오픈 소스) 및 Windows (독점-Tigera에서 사용 가능)에 대해 인터넷과 동일한 IP 네트워킹 원칙을 기반으로 Kubernetes 포드를 연결하기위한 확장 성이 뛰어난 네트워킹 및 네트워크 정책 솔루션을 제공한다. Calico는 캡슐화 또는 오버레이없이 구축되어 고성능의 대규모 데이터 센터 네트워킹을 제공 할 수 있다. 또한 Calico는 분산 방화벽을 통해 Kubernetes 포드에 대해 세분화 된 의도 기반 네트워크 보안 정책을 제공한다.
Calico는 Flannel, 일명 운하(aka canal - 문서가 project calico로 이행되었다.) 또는 기본 GCE, AWS 또는 Azure 네트워킹과 같은 다른 네트워킹 솔루션과 함께 정책 시행 모드로 실행될 수도 있다.
[Romana]
Romana는 오버레이 네트워크없이 Kubernetes를 배포 할 수있는 오픈 소스 네트워크 및 보안 자동화 솔루션이다. Romana는 Kubernetes 네트워크 정책을 지원하여 네트워크 네임 스페이스에서 격리를 제공한다.
[Waveworks의 Weave Net]
Weave Net은 Kubernetes 및 호스팅 응용 프로그램에 탄력적이고 사용하기 쉬운 네트워크이다. Weave Net은 CNI 플러그인 또는 독립형으로 실행된다. 두 버전 모두 실행하기 위해 구성이나 추가 코드가 필요하지 않으며 두 경우 모두 Kubernetes의 표준과 같이 네트워크에서 포드 당 하나의 IP 주소를 제공한다.

2019년 5월 25일 토요일

Docker를 위한 Linux - Atomic Host 소개

Atomic Host란?

이 글은 공식 홈페이지의 내용의 발번역과 관련 자료를 정리하여 만들고 있습니다.

공식 홈페이지 : http://www.projectatomic.io

홈페이지의 일부 내용을 발췌하자면, "변경 불가능한 인프라"를 원칙으로 시스템을 다시 구성한 수많은 프로젝트의 산물입니다.  LDK(Linux, Docker, Kubernetes)를 기반으로 구성되었습니다.

"변경 불가능 인프라(Immutable infra)" 라는 용어는 생소하시겠지만, 내용을 간단히 정리하여 살펴보면 다음과 같습니다. 실제로 서버를 변경하지 못하도록 한다는 것입니다.
Docker는 변경 불가능한 인프라를 구성하는 핵심적인 개념입니다. docker 자체는 변경해야 할 요소가 있을 때, 기존 버전의 docker image를 제거하고, 새로운 docker 이미지로 대체합니다.
이 방식의 가장 뛰어난 점은, 인프라에 대한 배포에 부담이 없다는 것입니다. 이미 아시다시피, docker는 실행에 필요한 라이브러리와 우리가 작성한 code 그리고 최소한의 시스템라이브러리까지 단일 파일처럼 관리할 수 있습니다.
( 단일 파일처럼 관리가 가능하다는 것은, 버전 관리가 가능하다는 의미입니다.)

기존에 배포가 의미하는 것은 응용 프로그램의 영역만을 말하는 경우가 많았습니다.
실행 환경을 포함하여 처리량을 늘리려면 별도의 물리 환경(서버, ..)을 준비해야 했고,
이를 위해서 시간이 소요되며, 다시 물리환경에 프로그램의 실행환경을 준비하는데 시간이 소요되었습니다. 클라우드의 등장으로 물리 환경 구성에 대한 부담이 사라졌고, Application Container의 등장으로 실행환경에 대한 준비가 별도로 필요하지 않게 되었습니다.

이 프로젝트의 많은 부분은, OpenShift Origin v3에 차용되었습니다.
기본적으로, 경량 컨테이너에 대한 아이디어에서 출발하였습니다. 응용프로그램은 컨테이너 안에서 실행됩니다. 현재 CentOS 버전과 Fedora 버전이 제공됩니다. Atomic host 개념은 Redhat Linux Enterprice에도 차용되었습니다.

현재는 기본적으로 Kubernetes가 포함되어 있습니다. 그러나 목표는 Kubernetes를 컨테이너 형태로 진행하여 OpenShift v3와 같은 호스트에서 서로 다른 버전을 지원하는 것입니다.  etcd와 flannel과 같은 Kubernetes 유틸리티가 제공됩니다.
현재 사용이 용이한 Application Container인 Docker를 사용하고 있습니다.

etcd : 분산형 키 / 값 저장소입니다.
        Go 언어기반으로 작성되어 있습니다.
        -> 클러스터 시스템에서는 보통 분산된 각 서버의 설정을 얻어오고 저장하는데 사용됩다.
flannel : Kubernetes에서 네트워크 레이어3의 구성요소와 관계를 쉽게 설정하기 위해 개발된 도구입니다.
         Go 언어 기반으로 구성되어 있습니다.

호스트는 rpm-ostree를 통해 관리됩니다. rpm-ostree는 부팅가능하고, 불변하고, 버전 관리가 가능한 파일스템을 RPM시스템을 통해서 관리합니다.

Atomic 프로젝트는 다음과 같은 요소들을 포함하고 있습니다.

*  Cockpit은 호스트와 컨테이너에 대한 가시성을 제공합니다.
  -> 호스트와 컨테이너에 대한 모니터링을 웹기반으로 할 수 있도록 제공합니다.
*  Selinux와 Systemd의 통합을 위한 Docker 확장과 패치들.
*  컨테이너화 된 응용프로그램의 개발을 쉽게 해주는 Atomic Developer Bundle


2019년 5월 12일 일요일

Docker를 위한 Linux 배포판 - Alpine Linux

Alpine linux
-> musl libcbusybox 기반의 보안을 우선적으로 생각하는 경량 배포판입니다.

우리의 목적은 Docker의 Hosting 환경으로 이 배포판을 설치하고, 간단한 container를 배포해 보는 것입니다.

설치 파일 다운로드

URL : https://alpinelinux.org/downloads/
위의 URL에 접속해 보면, 다양한 설치 파일의 종류에 놀랄 것입니다.
각 카테고리 별로 설명을 하면 다음과 같습니다.

[STANDARD] - 표준 설치 관련된 이미지 , 네트워크 연결이 필수입니다.
[EXTENDED] - 많이 사용되는 패키지가 포함되어 있으며, 라우터 및 서버에 적합합니다.
[NETBOOT] - 네트워크 부팅 이미지입니다.
[MINI ROOT FILESYSTEM] - 컨테이너에 사용하기 적절한 최소한의 Root File 시스템입니다.
[VIRTUAL] - 가상시스템에 최적화 되어 있습니다.
[XEN] - Xen 하이퍼바이저 지원이 내장되어 있습니다.
[RASBERRY PI] - 라즈베리파이를 위한 이미지입니다.
[GENERIC ARM] - 일반적인 ARM 시스템을 위한 이미지 입니다.

우리는 일반적인 용도에 해당하므로 STANDARD의 x86_64를 다운로드 하여 설치를 진행하도록 하겠습니다. 이 글을 쓰는 현재 시점의 최신 버전은 3.9.3입니다.

현재 저희가 선택한 기본 이미지는 내부에 설정되거나 준비된 파일이 별로 없습니다. 그래서 반드시 네트워크 연결이 선행되어야 합니다.



위의 이미지는 실제 설치 관련 사항을 Capture 한 것입니다.
기본적인 선택은 위의 선택지 대로 선택하시면 크게 문제없이 설치가 가능하실 것입니다.
설치가 완료되었다면,
alpine 리눅스에 docker를 설치하도록 하겠습니다.


docker를 설치하기 위해서는 Community 레파지토리를 추가해야 합니다.
이를 위해서는 /etc/apk/respositories 파일에

http://dl-cdn.alpinelinux.org/alpine/latest-stable/community


항목을 추가하고, 

apk update를 수행합니다.
docker를 설치하기 위해서, apk add docker 명령을 수행합니다.
docker가 데몬모드로 수행되도록 설정하기 위하여, 
rc-update add docker boot를 수행합니다.
설치 완료 후에 수동으로 데몬을 수행하기 위하여 
다음을 수행합니다. -> 귀찮으시면, 이 단계를 생략하고 reboot 하시면 됩니다.
service docker start

이상의 과정을 수행하는 화면이 다음에 있습니다. 



이제 docker의 설치가 완료되었습니다. 
이제 까지의 설치를 통해 docker는 시스템이 시작될 때 자동으로 실행되고, 현재 daemon모드로 실행되고 있습니다.

이제, 간단한 docker 이미지를 다운로드하여 실행해 보겠습니다.
docker에서의 일반적인 예제인 hello-world를 실행하겠습니다.
이미 docker 설치가 완료되어 있기 때문에 다음과 같이 실행하시면, 
docker의 hello-world가 다운로드되어 실행되는 것을 볼 수 있습니다.
# docker run hello-world
실행 결과는 아래와 같습니다.

추가 도구의 사용이나, docker 자체에 대한 것은 저의 다른 글 들에 정리해 두었습니다.

다음에는 다른 배포판인 CoreOS에 대해서 알아보겠습니다.

2019년 5월 5일 일요일

Docker를 위한 Linux 배포판들

원문 : https://sweetcode.io/linux-distributions-optimized-hosting-docker/


docker는 어떤 종류의 전통적인 리눅스 배포판에서도 동작이 가능합니다. 하지만 Docker의 실행에 특화되어 설계된 배포판이 있습니다. 일반적인 배포판보다 좀 더 잘 맞습니다.

Docker를 위한 배포판 선택하기

Docker 호스트를 위한 배포판을 고를 때 다음과 같은 점을 생각하십시오:

  • 편리한 Docker 지원
    Docker를 배포판에서 설치하고 업데이트하기가 간편해야 합니다.
  • 확장성과 맞춤 설정 지원
    컨테이너는 에자일 체계의 일부입니다. 쉽게 확장하고 설정을 사용자가 설정할 수 있어야 합니다.
  • 효율성
    컨테이너의 다른 매력적인 부분은 가상 머신 보다 자원을 효율적으로 사용하는데 있습니다.
  • 보안
    컨테이너 자체에 대한 보안은 호스팅하는 운영체제에서 제공되는 것이 더 좋습니다.
  • 기동시간
    가상머신이 구동되는 것처럼 오래 걸려서는 우리가 목표하는 바를 이룰 수 없습니다.
Docker를 위한 리눅스 배포판

Docker를 위한 리눅스 배포판에는 다음과 같은 것이 있습니다.

  • Alpine Linux
    이 배포판은 패키지관리를 위해 Docker를 기본으로 사용합니다. 원래는 컨테이너를 호스팅할 목적으로 설계되지는 않았지만, 적은 용량과 보안에 집중된 설계로 우리의 목적에 잘 맞습니다.
  • Container Linux
    CoreOS로 알려진 배포판의 새로운 이름입니다. 이름에서 알 수 있듯이, container를 고려하여 설계 되었습니다.
  • RancherOS
    컨테이너 호스팅을 위해서 설계된 리눅스 배포판입니다. 중요한 기능 중의 하나가, 스스로를 하나의 컨테이너로 빠르고 간단하게 배포하는 것입니다.
  • Atomic Host
    가장 쉬운 컨테이너 중심의 배포판 중의 하나입니다. 정확히 말하면 atomic host는 배포판은 아닙니다. Fedora를 위한 것과 RHEL(Redhat)을 위한 것이 있습니다.
  • Boot2Docker
    boot2docker는 여러분의 컴퓨터가 docker 환경에서 booting을 하도록 도와줍니다. 최소한의 자원과 메모리로, 5초 정도면 진행됩니다. 중요한 점은 윈도우나, 맥환경에서도 docker를 사용 가능 하도록 도와준다는 것입니다. 개발자를 위한 테스트 docker 환경을 구축하는데 도움이 됩니다.
  • Ubuntu Core
    Ubuntu 기반의 가벼운 배포판으로 설치 용량이 적은 좋은 배포판 입니다.

이 글에 언급된 각각의 OS를 설치하여 간단한 Container를 Deploy 하는 과정까지 앞으로 살펴 보겠습니다.

2019년 3월 22일 금요일

Docker Compose UI 설치 및 활용하기

[개발이 중단되었습니다.]

1. Docker Compose UI란?

docker 명령행 도구인 docker-compose의 WebFront End 입니다.
docker와 docker-compose의 차이는, docker가 단일 단위의 container를 다룬다면,
docker-compose는 다수의 컨테이너를 다룰 수 있습니다.

공식 홈페이지 : https://github.com/francescou/docker-compose-ui
라이센스 : MIT라이센스
개발 환경 : Python(Flask, docker-compose ), AngularJS

2. Docker Compose 설치하기


설치 과정은 아래와 같이 수행합니다.

설치화면보기
정상적으로 설치가 되었다면, http://localhost:5000/에 브라우저로 접속을 하면,
아래와 같은 웹페이지가 보여지면 설치가 완료된 것입니다.

DockerCompose Install Compelete


3. Docker Compose UI 활용


기본적으로 Docker Compose UI에는 예제 파일이 들어 있습니다.
이 구조를 참조하여 여러가지 작업을 할 수 있습니다.

아래의 화면은 예제 프로젝트중 하나인 env-demo를 선택한 화면입니다.

Docker Compose UI Project Selected

위의 화면에서 Action에 해당하는 항목은 실제로 Docker-compose의 명령행에서 사용되는 내용과 동일합니다
Docker-compose의 명령행에 대한 내용은 Docker compose CLI에서 확인할 수 있습니다.
각각의 내용은 Compose UI에서 API로 제공하며 해당 항목은 Compose UI API에서 확인할 수 있습니다.

Detail 항목을 선택하면, 현재 선택된 프로젝트의 docker-compose.yml 파일이 화면에 출력됩니다.

Docker Compose UI Project Detail

Clone을 선택하면, 현재 선택한 프로젝트의 docker-compose.yml파일을 복제하여 새로운 프로젝트를 만들 수 있습니다.

Docker Compose UI Project Clone

Edit를 선택하면, 현재 프로젝트 파일의 내용을 직접 수정하고 반영할 수 있습니다.

Docker Compose UI Project Edit

4.의견

Docker에서 공개적으로 개발하고, 배포하고 있기때문에 docker-compose에 대한 연계가 매우 잘되어 있습니다.
하지만, docker-compose자체가 docker의 이미지 관리나 부가기능들을 전부 제공하지는 않기 때문에
작은 규모의 개발/운영이라면 Portainer와 함께 사용하는 것이 좋다고 생각됩니다.
물론 대규모의 시스템이라면, 쿠버네티스를 사용하시는 것을 더 권장해 드립니다.
Docker 관리도구의 마지막 편이었습니다.
다음 글에서 뵙겠습니다. 감사합니다

쿠버네티스 네트워크 정리

본 문서는 쿠버네티스의 공식문서( https://kubernetes.io/docs/concepts/cluster-administration/networking/ )의 일부를 번역하고 링크를 정리하여 붙이는 것에서 시작한 문서입니다. 일부 링크는 ...