Kubernetes #2-2. 사전작업 – docker 설정 (offline, 폐쇄망)

[Kubernetes #1. 사전작업 (offline, 폐쇄망)]
[Kubernetes #2-2. 사전작업 – 컨테이너 런타임 (offline, 폐쇄망)]
[Kubernetes #2-2. 사전작업 – docker 설정 (offline, 폐쇄망)]
[Kubernetes #3. Kubernetes 바이너리 설치 (offline, 폐쇄망)]
[Kubernetes #4. Kubernetes 클러스터 구축 – image pull (offline, 폐쇄망)]
[Kubernetes #4-2. Kubernetes 클러스터 구축 – 단일 마스터노드 생성 (offline, 폐쇄망)]
[Kubernetes #4-3. Kubernetes 클러스터 구축 – worker node join (offline, 폐쇄망)]

망분리 환경에서 proxy등을 통한 외부 연결이 가능하거나, 망 내부적으로 proxy를 통해 통신하는 경우 proxy 설정이 필요하다.
linux OS 레벨에서는 .bash_profile 등에 proxy 변수를 등록하는 것으로 처리가 가능하지만 docker 런타임은 별도로 proxy 정보를 정의해 줘야 한다

이 포스트의 작업은 쿠버네티스 클러스터에 포함하는 모든 노드에서 수행해야 한다.

     

Docker Proxy 설정

서비스 설정 (docker login 등의 작업 에 사용된다.)

[haedong@haedong:~:]$ sudo /lib/systemd/system/docker.service
전략...
# [service] 섹션에 아래 추가
Environment="HTTP_PROXY=http://120.121.122.123:8080" 
Environment="HTTPS_PROXY=https://120.121.122.123:8080" 
Environment="NO_PROXY=.haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local" 
[haedong@haedong:~:]$ sudo systemctl daemon-reload
[haedong@haedong:~:]$ sudo systemctl restart docker.service

컨테이너 설행 시 변수로 전달

[haedong@haedong:~]$ docker run \
-e http_proxy=http://120.121.122.123:8080 \
-e https_proxy https://120.121.122.123:8080 \
-e no_proxy .haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local \
CONTAINER_NAME

이미지 빌드 시 포함

ENV PATH /home/haedong/bin:$PATH
ENV LD_LIBRARY_PATH /lib:/lib64:$LD_LIBRARY_PATH
...중략...
# 아래 내용 추가
ENV http_proxy http://120.121.122.123:8080
ENV https_proxy https://120.121.122.123:8080
ENV no_proxy .haedong.net,localhost,127.0.0.1/8,192.168.0.0/16,.local

     

Docker root directory 변경

pull 한 image나 컨테이너 임시 데이터 등이 저장되는 디렉토리이다. 기본 값은 /var/lib/docker 인데, /var directory가 포함된 파티션의 크기가 작거나 하는 경우 disk full 로 인해 문제를 야기할 수 있다.

현재 docker root 확인

docker info | grep "Docker Root Dir" 

 Docker Root Dir: /var/lib/docker

#docker volume inspect my-vol

준비

docker root dirctory로 사용할 디스크를 확정하고 파티션 생성, 마운트 등의 작업을 마친다.
sudo systemctl stop docker.service 명령으로 서비스를 중지하고(시간이 걸릴 수 있다. 프로세스가 완전히 사라졌는지 확인하도록 하자) 이전의 docker 파일들을 대상 디렉토리로 복사한다.

mkdir /data
cp -rp /var/lib/docker /data

     

서비스 수정

sudo vi /usr/lib/systemd/system/docker.service
# Service 섹션에 ExecStart= 로 시작하는 줄을 수정한다.
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data
sudo systemctl daemon-reload
sudo systemctl restart docker.service

     

cgroup driver 변경

현재 상태 확인

sudo docker info | grep cgroup
 Cgroup Driver: cgroupfs

서비스 수정

sudo vi /etc/systemd/system/docker.service

# ExecStart 로 시작하는 줄에  --exec-opt native.cgroupdriver=systemd 추가
# ExecStart=/usr/bin/dockerd -g /home/data/ -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -g /home/data/ -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
sudo systemctl daemon-reload
sudo systemctl restart docker.service

SuDo : SuperUser DO

개요

sudo 명령어는 유닉스 및 유닉스 계열 운영 체제에서, 다른 사용자의 보안 권한, 보통 슈퍼유저로서 프로그램을 구동할 수 있도록 하는 프로그램이다. 명칭은 본래 슈퍼유저로서의 실행에 사용되던 것에서 “superuser do”에서 유래하였으나, 후에 프로그램의 기능이 확장되며 “substitute user do”(다른 사용자의 권한으로 실행)의 줄임말로 해석되게 되었다. 기본적으로 Sudo는 사용자 비밀번호를 요구하지만 루트 비밀번호(root password)가 필요할 수도 있고, 한 터미널에 한번만 입력하고 그 다음부터는 비밀번호가 필요 없다. Sudo는 각 명령줄에 사용할 수 있으며 일부 상황에서는 관리자 권한을 위한 슈퍼유저 로그인(superuser login)을 완벽히 대신하며, 주로 우분투, 리눅스와 애플의 OS X 에서 볼 수 있다. 1위키백과에서 발췌

Windows 시스템의 경우 이것과 같다.

이 명령(기능)이 필요한 이유는 이렇게 생각해 볼 수있겠다.
– 시스템 관리자 A가 있다. root 패스워드는 A만 알고 있다.
– DBA B B는 ‘가’서버의 DB만 관리한다. 서비스의 재 시작등이 필요할 때엔 A에게 요청해야 한다.
– A가 휴가를 갔다.
– A가 휴가를 간 사이 DBMS 서비스에 이상이 생겼고 서비스를 재시작해야 하는 상황이 발생했다.
– 서비스 재시작에는 root 권한이 필요하다.
이 때 A가 취할 수 있는 조치는 B에게 root의 패스워드를 알려주는 방법이 있다.
하지만 A는 A가 관리하는 ‘가’,’나’,’다’모든 서버의 패스워드를 동일하게 설정해서 관리 하고 있었다.
B는 A가 관리하는 모든 서버의 패스워드를 획득한 것과 다름이 없다.

이런 상황이 예가 될 수 있겠다.
사실 B는 신뢰할 수 있는 사람이겠지만, 위 상황은 이미 권한 없는 사용자가 모든 권한을 획득한 보안 사고라 할 수 있겠다. 여기서 sudo는 아래와 같이 동작한다.
– 시스템 관리자 A는 ‘가’서버에신뢰할 수 있는 사용자 B를 sudo 명령 허용 목록에 추가하였다.
– A가 휴가를 갔다.
– B는 ‘가’ 서버에서 sudo 명령을 사용한다.
sudo 명령은 B의 패스워드를 묻는다.
B의 패스워드가 정상적으로 입력 되었을 경우 권한을 상승시킨다.

여기서 B가 B로 로그인 해 있는데 B의 패스워드를 왜 확인해? 이게 무슨 소용이야? 하고 질문할 수 있겠지만 B의 계정은 이미 신뢰하는 계정이라 했으니, 작업을 하는 시점에 다시 B가 맞는지 확인 하는 것이다.
즉, B가 로그인 후 자리를 비웠다거나 하는 등 B를 대체 하더라도 B의 패스워드는 B만 알고 있으니 패스워드를 한번 더 입력 받고 B가 맞는지 확인한 뒤 권한을 상승 시킨다는 말이다.

설정

/etc/sudoers 파일에 권한을 부여할 사용자를 넣으면 된다.
※만약 설정파일의 문법을 틀리거나 하면 아런 에러를 만날 수 있다. (sudo가 동작하지 않는다!!!!)

[centos7:/home/haedong:]$ sudo -i
>>> /etc/sudoers: 문법 오류 near line 94 <<<
sudo: /etc/sudoers 94번째 줄에서 해석 오류
sudo: 올바른 sudoers 설정 원본이 없습니다. 나갑니다.
sudo: 정책 플러그인을 초기화할 수 없습니다

사용자 추가

 ## 기본적으로 root는 포함되어있다. root ALL=(ALL) ALL 을 찾아서 아래에 사용자를 추가한다.
 ## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

 # 여기부터 선택적으로 추가한다.
 # 기본. 
 # haedong 계정으로 sudo 명령 사용 시 패스워드 확인 후 권한을 부여한다. 
 # 모든 명령 사용이 가능하다.
haedong ALL=(ALL)       ALL

 # haedong 계정으로 sudo 명령 사용 시 패스워드 확인 후 권한을 부여한다. /usr/bin/vi,/usr/bin/vim 만 사용 가능하다.
haedong ALL=            /usr/bin/vi,/usr/bin/vim      


 # haedong 계정으로 모든 명령 사용 시 패스워드 확인을 하지 않는다.
haedong ALL=(ALL)       NOPASSWD:   ALL

 # vi, vim 커맨드 사용 시 패스워드 확인을 하지 않고 권한을 상승시킨다.
haedong ALL=NOPASSWD:   /usr/bin/vi,/usr/bin/vim

환경변수 설정
현재 사용자의 환경변수를 sudo 명령 사용 시 승계 하고자 하는경우

 # "" 안에 추가하고자 하는 환경 변수를 추가한다.
Defaults    env_keep += "LD_LIBRARY_PATH"

PATH 변수 설정

 # : 로 구분하여 경로를 추가한다.
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

옵션 및 사용법
자세한 옵션은 man 을 참조하자

 # 일반적인 사용 예
[centos7:/home/haedong:]$ sudo vi
[sudo] haedong의 암호:
 # sudo를 이용한 로그인
[centos7:/home/haedong:]$ sudo -i
[sudo] haedong의 암호:
[centos7:/root:]#
[centos7:/root:]# sudo -h
sudo - 다른 사용자 권한으로 명령을 실행합니다

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-u user] file ...

옵션:
  -A, --askpass               암호 질문에 보조 프로그램 활용
  -b, --background            백그라운드에서 명령 실행
  -C, --close-from=num        num 보다 크거나 같은 모든 파일 서술자를 닫습니다
  -E, --preserve-env          명령을 실행할 때 사용자 환경을 유지합니다
  -e, --edit                  명령을 실행하는 대신 파일을 편집합니다
  -g, --group=group           지정 그룹 이름 또는 ID로 명령을 실행합니다
  -H, --set-home              대상 사용자의 내 폴더에 HOME 변수를 지정합니다
  -h, --help                  도움말을 보여주고 빠져나갑니다
  -h, --host=host             (플러그인에서 지원한다면)호스트에서 명령을 실행합니다
  -i, --login                 대상 사용자 자격으로 셸에 로그인합니다. 명령도 지정할 수 있습니다.
  -K, --remove-timestamp      타임스탬프 파일을 완전히 제거합니다
  -k, --reset-timestamp       타임스탬프 파일을 초기화합니다
  -l, --list                  사용자 권한을 보여주거나 지정 명령을 확인합니다. 긴 형식으로 보려면 옵션을 두 번 사용하십시오
  -n, --non-interactive       비대화형 모드. 프롬프트를 사용하지 않습니다
  -P, --preserve-groups       대상을 설정하는 대신 그룹 벡터를 유지합니다
  -p, --prompt=prompt         지정 암호 프롬프트를 활용합니다
  -r, --role=role             지정 역할을 지닌 SELinux 보안 컨텍스트를 만듭니다
  -S, --stdin                 표준 입력으로 암호를 입력 받습니다
  -s, --shell                 셸을 대상 사용자 명의로 실행합니다. 명령도 지정합니다.
  -t, --type=type             지정 유형의 SELinux 보안 컨텍스트를 만듭니다
  -U, --other-user=user       목록 모드에서 사용자 권한을 보여줍니다
  -u, --user=user             지정한 사용자 이름 또는 ID로 명령을 실행(또는 파일 편집)
  -V, --version               버전 정보를 보여주고 나갑니다
  -v, --validate              명령을 실행하지 않고 사용자 타임스탬프를 업데이트합니다
  --                          명령행 인자 처리를 멈춥니다