


우리는이 프로젝트의 기고자와 관리자를 적극적으로 찾고 있습니다. 컨테이너 내부에 대한 경험이있는 경우 CGROUP, 네임 스페이스 또는 컨테이너 주변의 오픈 소스 프로젝트에 기여한 경우 docker , containerd , nerdctl , podman 등 또는 컨테이너 내부를 다루는 데 도움이되는 도구 구축 도구에 기여하고 있으며이 프로젝트에 기여하는 데 관심이 있습니다. Golang 경험이 선호되지만 필수는 없습니다.
이 프로젝트에 기여하는 데 관심이 있으시면 연락처 세부 정보 @_shishir_m 함께이 저장소에서 문제를 열어주세요.
컨테이너를 사용하여 컨테이너를 발사하기위한 유목민 작업 드라이버.
Containerd (containerd.io) 컨테이너 수명주기를 달리고 관리하기위한 가벼운 컨테이너 데몬입니다.
Docker Daemon은 또한 Containerd를 사용합니다.
dockerd (docker daemon) --> containerd --> containerd-shim --> runc
Nomad-Driver-Containerd는 Nomad 클라이언트가 Docker없이 컨테이너를 사용하여 직접 컨테이너를 발사 할 수 있습니다!
호스트 시스템에는 Docker Daemon이 필요하지 않습니다.

$ gopath 가 올바르게 설정되어 있는지 확인하십시오.
$ mkdir -p $GOPATH/src/github.com/Roblox
$ cd $GOPATH/src/github.com/Roblox
$ git clone [email protected]:Roblox/nomad-driver-containerd.git
$ cd nomad-driver-containerd
$ make build (This will build your containerd-driver binary)
arm64 를 컴파일하려면 다음을 실행할 수 있습니다.
make -f Makefile.arm64
$ vagrant up
또는 vagrant provision Vagrant VM이 이미 실행중인 경우.
설정 ( vagrant up 또는 vagrant provision )이 완료되고 Nomad 서버가 UP가 실행되면 다음을 사용하여 등록 된 작업 드라이버 ( containerd-driver 도 표시)를 확인할 수 있습니다.
$ nomad node status (Note down the <node_id>)
$ nomad node status <node_id> | grep containerd-driver
참고 : setup.sh 는 Vagrant 설정의 일부이며 직접 실행해서는 안됩니다.
example 디렉토리에는 예제 작업이 거의 없습니다.
$ nomad job run <job_name.nomad>
작업을 시작합니다.
보다 자세한 지침은 example README.md 입니다
images 및 containers 와 직접 상호 작용하려면 containerd 용 Docker 호환 CLI 인 nerdctl 사용할 수 있습니다. nerdctl 이미 /usr/local/bin 의 Vagrant VM에 설치되어 있습니다.
드라이버 구성
| 옵션 | 유형 | 필수의 | 기본 | 설명 |
|---|---|---|---|---|
| 활성화 | 부 | 아니요 | 진실 | 작업 드라이버를 활성화/비활성화합니다. |
| containerd_runtime | 끈 | 예 | N/A | 컨테이너의 런타임 예를 들어 io.containerd.runc.v1 또는 io.containerd.runc.v2 . |
| stats_interval | 끈 | 아니요 | 1s | TaskStats 수집하기위한 간격. |
| allow_privileged | 부 | 아니요 | 진실 | false 으로 설정되면 운전자는 실행되는 권한있는 작업을 거부합니다. |
| 인증 | 차단하다 | 아니요 | N/A | 개인 레지스트리에 대한 인증을 제공합니다. 자세한 내용은 인증을 참조하십시오. |
작업 구성
| 옵션 | 유형 | 필수의 | 설명 |
|---|---|---|---|
| 영상 | 끈 | 예 | 컨테이너의 OCI 이미지 (Docker도 OCI 호환). |
| image_pull_timeout | 끈 | 아니요 | containerd-driver image 에 지정된대로 OCI 이미지의 진보적 인 풀을 취소하기 전에 얼마나 오래 기다릴 지 제어하는 시간 지속 시간. 기본값은 "5m" 입니다. |
| 명령 | 끈 | 아니요 | 이미지에 정의 된 명령을 재정의합니다. |
| args | []끈 | 아니요 | 명령에 대한 주장. |
| EntryPoint | []끈 | 아니요 | 이미지의 EntryPoint를 대체하는 문자열 목록입니다. |
| CWD | 끈 | 아니요 | 컨테이너 프로세스의 현재 작업 디렉토리를 지정하십시오. 디렉토리가 존재하지 않으면 하나가 생성됩니다. |
| 특권 | 부 | 아니요 | 권한 모드에서 컨테이너를 실행하십시오. 권한 모드에서 실행될 때 컨테이너가 모든 Linux 기능을 갖습니다. |
| PIDS_LIMIT | int64 | 아니요 | 컨테이너의 PID 한계를 지정하는 정수 값. 기본값으로 무제한. |
| pid_mode | 끈 | 아니요 | host 여부 (기본값). PID 네임 스페이스를 호스트와 공유하도록 host 로 설정하십시오. |
| 호스트 이름 | 끈 | 아니요 | 컨테이너에 할당 할 호스트 이름. 이 옵션 세트를 사용하여 하나 이상의 작업 ( count 사용)을 시작할 때 작업이 시작되는 모든 컨테이너에는 동일한 호스트 이름이 있습니다. |
| host_dns | 부 | 아니요 | 기본값 ( true ). 기본적으로 containerd-driver 사용하여 발사 된 컨테이너는 host /etc/resolv.conf 사용합니다. 이것은 docker behavior 과 유사합니다. 그러나 호스트 DNS를 사용하지 않으려면 host_dns=false 설정 하여이 플래그를 끕니다. |
| Seccomp | 부 | 아니요 | 기본 seccomp 프로필을 활성화합니다. allowed syscalls 목록. |
| seccomp_profile | 끈 | 아니요 | 사용자 정의 Seccomp 프로파일로가는 길. seccomp_profile 사용하려면 seccomp true 로 설정해야합니다. here 있는 기본 docker Seccomp 프로파일은 참조로 사용하여 사용자 정의 SECComp 프로파일을 만들기 위해 수정할 수 있습니다. |
| shm_size | 끈 | 아니요 | /dev /shm의 크기 예, 예 : 128MB의 /dev /shm을 원한다면 "128m". |
| sysctl | 지도 [문자열] 문자열 | 아니요 | 시작시 컨테이너로 설정하기위한 SyscTL 구성의 키 가치 맵. |
| readonly_rootfs | 부 | 아니요 | 컨테이너 루트 파일 시스템은 읽기 전용입니다. |
| host_network | 부 | 아니요 | 호스트 네트워크를 활성화합니다. 이것은 docker의 --net=host 와 같습니다. |
| extra_hosts | []끈 | 아니요 | 호스트로 제공되는 호스트 목록 : IP는 /etc /hosts에 추가 될 것입니다. |
| cap_add | []끈 | 아니요 | 개별 기능을 추가하십시오. |
| CAP_DROP | []끈 | 아니요 | 초대 능력을 떨어 뜨립니다. |
| 장치 | []끈 | 아니요 | 컨테이너에 노출 될 장치 목록. |
| 인증 | 차단하다 | 아니요 | 개인 레지스트리에 대한 인증을 제공합니다. 자세한 내용은 인증을 참조하십시오. |
| 마운트 | []차단하다 | 아니요 | 컨테이너에 장착 할 마운트 목록. 볼륨, 바인드 및 TMPFS 유형 마운트가 지원됩니다. FSTAB 스타일 mount options 지원됩니다. |
마운트 블록
{
- type (string) (선택 사항) : 지원되는 값은 volume , bind 또는 tmpfs . 기본값 : 볼륨.
- 대상 (문자열) (필수) : 컨테이너의 대상 경로.
- source (string) (선택 사항) : 호스트의 소스 경로.
- 옵션 ([] 문자열) (선택 사항) : FSTAB 스타일 mount options . 참고 : 바인드 마운트의 경우 적어도 rbind 및 ro 필요합니다.
}
마운트 예제 바인드
mounts = [
{
type = "bind"
target = "/target/t1"
source = "/src/s1"
options = ["rbind", "ro"]
}
]
Task Config 의 mounts 옵션에 대한 Additon에서는 Nomad volume_mount stanza 사용하여 컨테이너에 볼륨을 장착 할 수도 있습니다.
volume_mount 의 example job 참조하십시오.
사용자 정의 Seccomp 프로파일 예제
here 있는 기본 docker Seccomp 프로파일을 다운로드하고 (SYSCALLS를 제거/추가하여) 사용자 정의 SECCOMP 프로파일을 만들 수 있습니다.
그런 다음 사용자 정의 Seccomp 프로파일은 Nomad 클라이언트 노드에서 /opt/seccomp/seccomp.json 하에서 저장할 수 있습니다.
이 Custom Seccomp 프로파일을 사용하여 유목민 작업을 시작할 수 있습니다.
config {
seccomp = true
seccomp_profile = "/opt/seccomp/seccomp.json"
}
sysctl 예제
config {
sysctl = {
"net.core.somaxconn" = "16384"
"net.ipv4.ip_forward" = "1"
}
}
auth Stanza를 사용하면 Docker Hub의 개인 저장소에서 이미지를 가져 오려면 개인 레지스트리에 대한 자격 증명을 설정할 수 있습니다.
auth Stanza는 Driver Config 또는 Task Config 또는 둘 다에서 설정할 수 있습니다.
두 장소 모두에서 설정하면 Task Config 인증이 Driver Config 인증보다 우선합니다.
참고 : 아래 예제에서 user 와 pass 자격 증명을 지정할 때 실제 username 과 password 로 대체 해야하는 자리 표시 자 값 일뿐입니다. 아래에서 auth Stanza는 Driver Config 및 Task Config 에 모두 사용할 수 있습니다.
auth {
username = "user"
password = "pass"
}
nomad-driver-containerd 호스트 및 브리지 네트워크를 지원합니다.
참고 : host 와 bridge 는 상호 배타적 인 옵션이며 한 번에 하나만 사용해야합니다.
작업 사양의 작업 구성에서 host_network true 로 설정하여 호스트 네트워크를 활성화 할 수 있습니다 ( Supported options 아래 참조).
작업 사양의 작업 그룹 섹션에서 network 스탠자를 설정하여 브리지 네트워크를 활성화 할 수 있습니다.
network {
mode = "bridge"
}
bridge 네트워크를 사용하기 전에 /opt/cni/bin 아래에 Nomad 클라이언트 노드에 CNI 플러그인을 설치해야합니다.
CNI 플러그인 설치 지침.
$ curl -L -o cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
$ sudo mkdir -p /opt/cni/bin
$ sudo tar -C /opt/cni/bin -xzf cni-plugins.tgz
또한 Linux 운영 체제 배포가 브리지 네트워크를 통해 컨테이너 트래픽을 iptables를 통해 라우팅 할 수 있도록 구성되었는지 확인하십시오. 이 튜블은 다음과 같이 설정할 수 있습니다.
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-arptables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
Nomad 클라이언트 노드의 시작시 이러한 설정을 보존하려면 /etc/sysctl.d/ 에 다음을 포함한 파일을 추가하거나 Linux 배포판이 해당 디렉토리에 넣은 파일을 제거하십시오.
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
유목민은 정적 및 동적 포트 매핑을 모두 지원합니다.
network 스탠자에 정적 포트 매핑을 추가 할 수 있습니다.
network {
mode = "bridge"
port "lb" {
static = 8889
to = 8889
}
}
여기서 host 포트 8889 container 포트 8889 에 매핑됩니다.
참고 : system 또는로드 밸런서와 같은 전문 작업을 제외하고 정적 포트는 일반적으로 권장되지 않습니다.
network 스탠자에서 동적 포트 매핑도 활성화됩니다.
network {
mode = "bridge"
port "http" {
to = 8080
}
}
여기서 Nomad는 host 에 동적 포트를 할당하고 해당 포트는 컨테이너에서 8080 에 매핑됩니다.
nomad official documentation 에서 network stanza 에 대한 자세한 내용을 읽을 수도 있습니다.
유목민은 일반 호스트 클러스터에서 다양한 유형의 워크로드를 예약합니다. 이로 인해 배치는 미리 알려지지 않으며 서비스 검색을 사용하여 클러스터에 배치 된 다른 서비스에 작업을 연결해야합니다. 유목민은 영사와 통합되어 서비스 발견 및 모니터링을 제공합니다.
서비스 검색을 가능하게하기 위해 service 스탠자를 작업 사양에 추가 할 수 있습니다.
STANZA는 유목민에게 영사에 서비스를 등록하도록 지시합니다.
로컬로 테스트를 실행하는 경우 저장소에 제공된 vagrant VM 사용하십시오.
$ vagrant up
$ vagrant ssh containerd-linux
$ sudo make test
참고 : 이들은 파괴적인 테스트이며 시스템을 변경된 상태로 남겨 둘 수 있습니다.
CI/CD 시스템의 일부로이 테스트를 실행하는 것이 좋습니다.
테스트 이름을 지정하여 개별 테스트를 실행할 수도 있습니다. 예를 들어
$ cd tests
$ sudo ./run_tests.sh 001-test-redis.sh
make clean
이진이 삭제됩니다 : containerd-driver
vagrant destroy
이것은 당신의 Vagrant VM을 파괴합니다.
우분투 (> = 16.04)
Copyright 2020 Roblox Corporation
Apache 라이센스, 버전 2.0 ( "라이센스")에 따라 라이센스가 부여되었습니다. 자세한 내용은 라이센스를 읽으십시오.