Cocktail Private Hub 서버 설치
1.필요 소프트웨어 다운로드 및 설치
- Docker, docker-compose 설치 및 harbor 압축파일 다운로드 및 압축 해제
Cocktail Private Hub를 설치하기 위한 설치하고자 하는 장비상에서 아래 init.sh파일을 upload하고 실행하면 docker, docker-compose설치 및 harbor 압축파일 다운로드& 압축해제를 수행한다.
작업 디렉토리 생성 및 설치 script upload
// root 사용자 변경
# sudo su - root
// 방화벽 중지
# systemctl stop firewalld
# systemctl disable firewalld
# vi /etc/sysconfig/selinux
SELINUX=disabled
// 작업 디렉토리 생성
# mkdir -p /root/cocktail/cert/harbor
# mkdir -p /root/cocktail/cert/docker
//docker, docker-compose, harbor 설치 및 다운로드
# vi /root/init.sh
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install -y --setopt=obsoletes=0 \
docker-ce-17.03.1.ce-1.el7.centos \
docker-ce-selinux-17.03.1.ce-1.el7.centos
systemctl enable docker
systemctl start docker
curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > docker-compose
chmod +x docker-compose
mv docker-compose /usr/local/bin/
docker-compose --version
yum install -y wget
wget https://github.com/vmware/harbor/releases/download/v1.1.1-rc4/harbor-online-installer-v1.1.1-rc4.tgz
tar -zxvf harbor-online-installer-v1.1.1-rc4.tgz
# chmod 755 /root/init.sh
// openssl.cnf 작성
# vi /root/cert/openssl.cnf
[ req ]
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_ca ]
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, keyEncipherment, keyCertSign
[ v3_req_server ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names_harbor
[ v3_builder_server ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names_builder
[ v3_builder_client ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
[ alt_names_harbor ]
DNS.1 = localhost
IP.1 = 172.30.1.56 // registry server IP 입력
IP.2 = 127.0.0.1
[ alt_names_builder ]
DNS.1 = localhost
IP.1 = 172.30.1.56 // registry server IP 입력
IP.2 = 127.0.0.1
# chmod 755 /root/cert/openssl.cnf
// harbor 인증서 만들기
# vi /root/cert/harbor/make_harbor_cert.sh
#!/bin/bash
# Harbor Template 의 root ca 파일 경로
#!/bin/bash
# Harbor Template 의 root ca 파일 경로
HARBOR_CA_CERT_DIR=/root/cocktail/harbor/common/templates/registry
TARGET_DIR=/data/cert
openssl genrsa -out ca.key 4096
openssl req -x509 -new -sha256 -nodes -key ca.key -days 10000 -subj "/CN=harbor-ca" -out ca.crt -extensions v3_ca -config ../openssl.cnf
openssl genrsa -out harbor.key 4096
openssl req -new -key harbor.key -out harbor.csr -subj "/CN=harbor" -config ../openssl.cnf
openssl x509 -req -in harbor.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.crt -days 10000 -extensions v3_req_server -extfile ../openssl.cnf
mkdir -p $TARGET_DIR
# Harbor Template 의 root ca 파일 교체
cp ca.crt $HARBOR_CA_CERT_DIR/root.crt
cp harbor.crt $TARGET_DIR
cp harbor.key $TARGET_DIR
# chmod 755 /root/cert/harbor/make_harbor_cert.sh
// docker 인증서 만들기
# vi /root/cert/docker/make_docker_cert.sh
#!/bin/bash
HARBOR_CA=/root/cocktail/cert/harbor/ca.crt
HARBOR_CA_KEY=/root/cocktail/cert/harbor/ca.key
set -e
if [ "$#" -gt 0 ]; then
DOCKER_HOST="$1"
else
echo " => ERROR: You must specify the docker FQDN as the first arguement to this scripts! <="
exit 1
fi
if [ "$USER" == "root" ]; then
echo " => WARNING: You're running this script as root, therefore root will be configured to talk to docker"
echo " => If you want to have other users query docker too, you'll need to symlink /root/.docker to /theuser/.docker"
fi
echo " => Using Hostname: $DOCKER_HOST You MUST connect to docker using this host!"
echo " => Ensuring config directory exists..."
mkdir -p "$HOME/.docker"
echo " => Verifying ca.srl"
if [ ! -f "ca.src" ]; then
echo " => Creating ca.srl"
echo 01 > ca.srl
fi
echo " => Generating server key"
openssl genrsa -out server.key 2048
echo " => Generating server CSR"
openssl req -new -key server.key -out server.csr -subj "/CN=$DOCKER_HOST" -config ../openssl.cnf
echo " => Signing server CSR with Harbor CA"
openssl x509 -req -in server.csr -CA $HARBOR_CA -CAkey $HARBOR_CA_KEY -out server.crt -days 3650 -extensions v3_builder_server -extfile ../openssl.cnf
echo " => Generating client key"
openssl genrsa -out client.key 2048
echo " => Generating client CSR"
openssl req -new -key client.key -out client.csr -subj "/CN=docker.client" -config ../openssl.cnf
echo " => Creating extended key usage"
echo " => Signing client CSR with Harbor CA"
openssl x509 -req -in client.csr -CA $HARBOR_CA -CAkey $HARBOR_CA_KEY -out client.crt -days 3650 -extensions v3_builder_client -extfile ../openssl.cnf
if [ -d "/etc/profile.d" ]; then
echo " => Creating profile.d/docker"
sudo sh -c "echo '#!/bin/bash
export DOCKER_CERT_PATH=$HOME/.docker
export DOCKER_HOST=tcp://$DOCKER_HOST:2376
export DOCKER_TLS_VERIFY=1' > /etc/profile.d/docker.sh"
sudo chmod +x /etc/profile.d/docker.sh
source /etc/profile.d/docker.sh
else
echo " => WARNING: No /etc/profile.d directory on your system."
echo " => You will need to set the following environment variables before running the docker client:"
echo " => DOCKER_HOST=tcp://$DOCKER_HOST:2376"
echo " => DOCKER_TLS_VERIFY=1"
fi
OPTIONS="--tlsverify --tlscacert=$HOME/.docker/ca.crt --tlscert=$HOME/.docker/server.crt --tlskey=$HOME/.docker/server.key -H=0.0.0.0:2376"
if [ -f "/etc/sysconfig/docker" ]; then
echo " => Configuring /etc/sysconfig/docker"
BACKUP="/etc/sysconfig/docker.$(date +"%s")"
sudo mv /etc/sysconfig/docker $BACKUP
sudo sh -c "echo '# The following line was added by ./create-certs docker TLS configuration script
OPTIONS=\"$OPTIONS\"
# A backup of the old file is at $BACKUP.' >> /etc/sysconfig/docker"
echo " => Backup file location: $BACKUP"
else
echo " => WARNING: No /etc/sysconfig/docker file found on your system."
echo " => You will need to configure your docker daemon with the following options:"
echo " => $OPTIONS"
fi
# Copy docker server certificate
cp $HARBOR_CA /root/.docker/ca.crt
cp ./server.crt /root/.docker/server.crt
cp ./server.key /root/.docker/server.key
# Copy docker client certificate
cp $HARBOR_CA /root/.docker/ca.pem
cp ./client.crt /root/.docker/cert.pem
cp ./client.key /root/.docker/key.pem
export DOCKER_HOST=tcp://DOCKER_HOST:2376
export DOCKER_TLS_VERIFY=1
echo " => Done! You just need to restart docker for the changes to take effect"
# chmod 755 vi /root/cert/docker/make_docker_cert.sh
init.sh 를 실행하면 docker, docker-compose설치 및 harbor 압축파일 다운로드& 압축해제를 수행한다.
# cd ~/root/
# ./init.sh
2.Harbor 설정
- Harbor Self Signing Certificate 생성하기
Harbor를 설치하는 서버에서 작업한다.
make_harbor_cert.sh 실행하면 harbor.crt, harbor.key 파일이 생성된다.
# cd /root/cert/harbor
# ./make_harbor_cert.sh "도메인 또는 IP"
Generating a 4096 bit RSA private key
.......................................................................................++
...................................................++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:192.168.50.105
Email Address []:
Generating a 4096 bit RSA private key
.....................................................................................................................................................................................................++
...............................................................................................................................................................................................................................++
writing new private key to 'harbor.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:192.168.50.105
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Signature ok
subject=/C=JP/L=Default City/O=Default Company Ltd/CN=192.168.50.105
Getting CA Private Key
# ls -al // 인증서가 정상적으로 생성되었는지 확인한다.
- Harbor.cfg 파일 수정하기
# vi ~/cocktail/harbor/harbor.cfg
...
hostname = 서버 ip
ui_url_protocol = https
ssl_cert = /root/cert/harbor/harbor.crt // harbor crt 파일 경로
ssl_cert_key = /root/cert/harbor/harbor.key // harbor 인증서 key 파일 경로
harbor_admin_password = C0ckt@1lAdmin
...
- Harbor 기동
./prepare 스크립트를 실행해서 harbor 설정 파일들을 generation한 후 docker-compse를 기동한다
# cd /root/harbor
# ./install.sh
// Harbor가 정상기동 했는지 확인. (총 7개의 container가 running 상태이면 정상임)
# docker ps
- Harber 설치 장비에서 Docker client로 Harbor 로그인이 정상적으로 되는지 확인하기.
Harbor 서버에서 생성한 ca.crt파일을 docker client가 인증서를 확인하는 디렉토리인 /etc/docker/certs.d/serverip/ 밑에 복사한다.
폴더 생성은 반드시 아래와 같은 형식을 따른다.
# mkdir -p /etc/docker/certs.d/xxx.xxx.xxx.xxx
# cp /root/cocktail/cert/harbor/ca.crt /etc/docker/certs.d/xxx.xxx.xxx.xxx
# docker login https://xxx.xxx.xxx.xxx
< 참고 - Harbor 실행/중단/설정변경시 >
Harbor는 부팅시에 자동 실행되며 수동으로 기동, 종료 및 설정 변경시에 아래 명령을 실행하면 된다.
# cd ~/cocktail/harbor
# docker-compose start
# docker-compose stop
설정을 변경한 경우에는 install.sh 파일을 다시 실행한다.
3. Cocktail Buid Server 설치
Cocktail build Server는 docker상에 container로 실행되며 Cocktail Builder-api component와 통신하게 된다.
일반적으로 Docker Server와 Docker Client간 로컬이 아닌 원격지에서는 반드시 TLS로 통신해야 함으로 사설인증서를 생성하여 설정해 준다.
이를 편하게 설정하기 위해 "make_docker_cert.sh" 파일을 설치하고자 하는 VM 또는 machine에 upload 또는 작성하여 실행한다.
# cd /root/cert/doker
# ./make_docker_cert.sh "도메인 또는 IP"
# cd /root/.docker
# ls -al // 실제 인증서가 생성되었는지 확인해 본다.
drwx------. 2 root root 211 12월 19 15:18 .
dr-xr-x---. 6 root root 204 12월 19 15:15 ..
-rw-r--r--. 1 root root 1980 12월 19 15:18 ca.crt
-rw-r--r--. 1 root root 3 12월 19 15:18 ca.srl
-rw-r--r--. 1 root root 1464 12월 19 15:18 cert.pem
-rw-r--r--. 1 root root 895 12월 19 15:18 client.csr
-rw-------. 1 root root 159 12월 19 15:15 config.json
-rw-r--r--. 1 root root 30 12월 19 15:18 extfile.cnf
-rw-r--r--. 1 root root 1679 12월 19 15:18 key.pem
-rw-r--r--. 1 root root 1428 12월 19 15:18 server-cert.pem
-rw-r--r--. 1 root root 1679 12월 19 15:18 server-key.pem
-rw-r--r--. 1 root root 899 12월 19 15:18 server.csr
// 시스템 전역 환경설정 파일 수정 및 실행.
# cd /etc/profile.d
# vi docker.sh
export DOCKER_CERT_PATH 의 값을 /root/.docker 로 변경
# ./docker.sh
// docker service 파일 수정.
# vi /lib/systemd/system/docker.service
#ExecStart=/usr/bin/dockerd // 주석으로 처리
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/root/.docker/ca.crt --tlscert=/root/.docker/server.crt --tlskey=/root/.docker/server.key
// Docker service restart
# systemctl daemon-reload
# systemctl restart docker
*
// Docker daemon이 정상적으로 실행됬는지 확인
# docker ps
4. k8s cluster를 구성하는 모든 node에서 harbor에 저장된 image를 pull할 수 있도록 harbor의 CA파일을 전 node에 복사.
k8s cluster를 구성하는 모든 node에서 harbor로 부터 image를 pull하기 위해 harbor 설치시에 생성한 ca.crt파일을 모든 node의 /etc/docker/certs.d/serverip/ 밑에 복사한다.
mkdir -p /etc/docker/certs.d/xxx.xxx.xxx.xxx (중요. xxx.xxx.xxx.xxx는 harbor를 설치한 ip임)
이후 ca.crt를 복사한다.
5. Cocktail builder-api, client-api의 환경 변수 수정.
k8s dashboard에서 builder-api의 환경변수 REGISTRYURL, DOCKER_URL, SERVER_TYPE, CA_PEM, CERT_PEM, KEY_PEM 를 수정하고, cocktail-api의 환경변수 REGISTRY_URL을 수정한다.
- builder-api
환경변수 | 값 예시 |
---|---|
REGISTRY_URL | xxx.xxx.xxx.xxx |
DOCKER_URL | https://xxx.xxx.xxx.xxx |
SERVER_TYPE | 임의의 string |
CA_PEM | CA 인증키인 ca.crt파일을 base64 encoding해서 입력 |
# cat /root/.docker/ca.crt 의 결과값을 https://www.base64encode.org에서 encoding하여 입력 | |
CERT_PEM | build server cert.pem파일을 base64 encoding해서 입력 |
# cat /root/.docker/cert.pem의 결과값을 https://www.base64encode.org에서 encoding하여 입력 | |
KEY_PEM | build server key.pem파일을 base64 encoding해서 입력 |
# cat /root/.docker/key.pem의 결과값을 https://www.base64encode.org에서 encoding하여 입력 |
- cocktail-api
환경변수 | 값 예시 |
---|---|
REGISTRY_URL | https://xxx.xxx.xxx.xxx |
REGISTRY_USER | harbor login id |
REGISTRY_PASSWORD | habor login passwd |