docker-compose run --rm openvpn ovpn_genconfig -u udp://VPN.YOUR_HOST.NAME
# 아래는 수행 결과
reating network "vpn_default" with the default driver
Pulling openvpn (kylemanna/openvpn:)...
....중략....
Creating vpn_openvpn_run ... done
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...
docker-compose run --rm openvpn ovpn_initpki
# 아래는 수행 결과
Creating vpn_openvpn_run ... done
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Enter New CA Key Passphrase: CA_KEY의_Passphrase
Re-Enter New CA Key Passphrase: CA_KEY의_Passphrase
Generating RSA private key, 2048 bit long modulus (2 primes)
................................+++++
......................................................+++++
e is 65537 (0x010001)
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:vpn.haedongg.net
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............................................................+...........................................+..........................................................
...중략...
........................................................+..+....................+................................................................+....+..++*++*++*++*
DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
.............+++++
............................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-74.akeLei/tmp.JBdIKe'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-74.akeLei/tmp.BfJlok
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'vpn.haedongg.net'
Certificate is to be certified until Jul 30 00:51:51 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-149.FPcifA/tmp.cjaMHC
Enter pass phrase for /etc/openvpn/pki/private/ca.key: 위_11_12_라인에서_입력했던_Passphrase
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
디렉토리 권한 변경
sudo chown -R $(whoami): ./openvpn-data
서버 프로세스 실행
docker-compose up -d openvpn
클라이언트 사용자 생성 및 인증서 생성
# 비밀번호화 함께 생성
docker-compose run --rm openvpn easyrsa build-client-full 사용자_이름
# 비밀번호 없이 생성
docker-compose run --rm openvpn easyrsa build-client-full 사용자_이름 nopass
# 인증서 파일 출력, 이 파일을 클라이언트 사용자에게 전달하면 된다.
docker-compose run --rm openvpn ovpn_getclient 사용자_이름 > 사용자_이름.ovpn
클라이언트 사용자 제거
# Keep the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME
# Remove the corresponding crt, key and req files.
docker-compose run --rm openvpn ovpn_revokeclient $CLIENTNAME remove
일반적으로 개발사 등에서 제공되는 docker image 들은 운영에 필요한 최소한의 바이너리들만 담는 경우가 많기 때문에 컨테이너에 문제가 생기거나, 컨테이너 내부의 프로세스를 확인하고자 하는 경우에 ps 명령이 없어서 프로세스 확인이 불가능하거나, ping 명령이 없어서 연결 여부 확인이 안된다거나 하는 경우가 있을 수 있다. 또 docker 명령을 이용해 컨테이너에 진입하여 작업을 하는 것이 이래저래 불편해서 ssh의 아쉬움을 느끼는 경우도 왕왕 있을 것이다.
이 포스트에서는 특정한 도커 이미지에 운영에 편의를 위한 패키지들을 설치하고 SSH 서버도 추가하여 이미지를 새로 만들 것이다.
dockerfile 예제
실제 docker image build를 위한 예제이다. 세부 내용은 주석을 참고하면된다.
# base가 될 이미지
# bitnami/jupyter-base-notebook
# 최신의 이미지에 append 하는 형태로 빌드하고자 한다면 latest tag 를 붙여준다.
# FROM haedongg.net/library/jupyter/pyspark-notebook:latest
FROM haedongg.net/library/jupyter/pyspark-notebook:spark-3.2.0
# 레이블. 없어도 된다.
LABEL comment "essential tools & configuration"
# 아래 작업들을 수행할 계정
# USER ACCOUNT 다음 라인은 별도로 USER를 변경하는 작업이 없다면 모두 ACCOUNT 계정으로 작업이 수행된다.
USER root
ENV DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Seoul
# 편의를 위해 기본적으로 필요한 것들
# 프록시를 사용하는 경우 apt-get 앞에 다음을 추가한다.
# RUN sudo https_proxy=PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT
RUN apt-get update
RUN apt-get install -y openssh-server sudo procps curl vim git openssh-client telnet net-tools tcpdump htop --no-install-recommends
# 컨테이너 이미지 파일의 크기를 줄이기 위해 apt 수행 중 생성된 임시 파일들을 삭제해준다.
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#### 여기부터 SSH
RUN mkdir /var/run/sshd
# root password 변경, $PASSWORD를 변경한다.
RUN echo 'root:$PASSWORD' | chpasswd
# ssh 설정 변경
# root 계정으로의 로그인을 허용한다. 아래 명령을 추가하지 않으면 root 계정으로 로그인이 불가능하다.
RUN sed -ri 's/^#?PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
# 응용 프로그램이 password 파일을 읽어 오는 대신 PAM이 직접 인증을 수행 하도록 하는 PAM 인증을 활성화
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
RUN mkdir /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
####여기까지 SSH
# sudo 설정
# 사용자 추가, $USER 가 사용자 명, $PASSWORD 가 패스워드이다.
RUN adduser --disabled-password --gecos "" $USER &&\
echo '$USER:$PASSWORD' | chpasswd &&\
adduser $USER sudo &&\
echo 'USER ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# user 변경
USER $USER
# alias를 추가하고 싶은 경우
RUN echo "alias ll='ls -lha'" >> /home/$USER/.bashrc
# pip 패키지 인스톨
# 프록시를 사용한다면 RUN https_proxy=http://PROXY_SERVER_HOST:PORT http_proxy=PROXY_SERVER_HOST:PORT
RUN pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install --no-cache-dir s3fs py4j pytz toml xgboost==1.5.1 lightgbm==3.3.1 scikit-learn==1.0.1 mlflow mlflow-skinny sqlalchemy alembic sqlparse tqdm boto3
# 설정된 home directory의 권한 부여
RUN chown -R $USER /home/$USER
_-t 옵션 및 tag 옵션으로 지정하는 이미지 이름은 build에 사용한 원래 이미지의 이름, 경로와는 상관이 없다. 내가 사용하고자 하는 이름을 지정하면 된다. 단, local 이미지가 아닌 harbor나 docker hub 등의 외부 리포지터리에 업로드 하고자 한다면 정확한 이름을 지정해줘야 push가 가능하다._
sudo kubeadm init –apiserver-advertise-address $MASTER_NODE_IP_ADDRESS –pod-network-cidr=10.244.0.0/16 명령을 수행하면 설치가 시작된다. –apiserver-advertise-address : 마스터노드 IP –pod-network-cidr : pod간 통신을 위한 내부 네트워크 CIDR 1사이더(Classless Inter-Domain Routing, CIDR)는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법이다. 사이더는 기존의 IP 주소 할당 방식이었던 네트워크 클래스를 대체하였다. 사이더는 IP 주소의 영역을 여러 네트워크 영역으로 나눌 때 기존방식에 비해 유연성을 더해준다. 특히 다음과 같은 장점이 있다. 급격히 부족해지는 IPv4 주소를 보다 효율적으로 사용하게 해준다. 접두어를 이용한 주소 지정 방식을 가지는 계층적 구조를 사용함으로써 인터넷 광역 라우팅의 부담을 줄여준다.
sudo kubeadm init --apiserver-advertise-address $MASTER_NODE_IP_ADDRESS --pod-network-cidr=10.244.0.0/16
...전략...
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.192.168:6443 --token abcdefg.8rpr4mfmetbabcde --discovery-token-ca-cert-hash sha256:3a12345caaef12334567890cd3953d1234c3904ab70a8b949f32d6df12345
/etc/kubernetes/admin.conf 에는 마스터노드의 kube-proxy 관련 정보가 들어있다. mkdir 부터 시작하는 명령을 수행해줘야 kubectl 명령을 사용할 수 있다.
마지막 kubeadm join 명령은 worker 노드를 추가하기 위한 명령이다. worker 노드가 될 서버에kubernetes 관련 패키지(kueadm,kubectl,kubelet 및 image 등)를 설치한 뒤 수행해주면 worker 노드로 클러스터의 멤버가 된다. token 관련 값은 24시간의 유효시간이 있으므로 나중에 클러스터 멤버로 join 하려면 새로 새로 발행해야 한다.
확인
init 스크립트가 완료되고 kubernetes config 관련 설정을 마쳤다면 kubectl 명령을 사용할 수 있다. 다음 명령을 통해 상태를 확인한다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
centos7 NotReady control-plane,master 20s v1.23.5
sudo yum install -y yum-utils
# yum-config-manager를 위한 패키지
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum-utils 패키지 설치를 생략하고 docker-ce.repo 파일을 다운로드 받아서 /etc/yum.repos.d/에 복사해도 된다.
sudo yum clean all
# yum 캐시 정리 캐시 파일이 너무 크거나 문제가 있는 경우 sudo rm -rf /var/cache/yum 명령 수행
sudo yum repolist
# 패키지 목록 업데이트
Ubuntu
sudo apt-get update
# apt 패키지 목록 업데이트
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 패키지 설치 및 rpository 업데이트 등을 위한 패키지 설치
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# gpg key 등록
sudo echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# docker repository 등록
sudo apt-get update
본 예제는 총 4대의 가상머신 (CentOS7, 4core CPU, 8GB RAM, 128GB storage)으로 테스트 하였다.
작업을 시작하기 전에 이 포스트를 참고하여 kubesphere 구성을 할 서버들 간의 SSH key를 맞춰주도록 한다.
의존성 패키지 설치 kubernetes v1.18 이상은 socat과 conntrack 패키지가 필요하고 ebtables와 ipset 패키지는 권장, v1.18 미만은 모두 설치를 권장한다.
haedong@haedong:~/kubesphere:]$ sudo yum install socat conntrack ebtables ipset
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Loading mirror speeds from cached hostfile
Package socat-1.7.3.2-2.el7.x86_64 already installed and latest version
...중략...
---> Package libnetfilter_queue.x86_64 0:1.0.2-2.el7_2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================================================================
Installing:
conntrack-tools x86_64 1.4.4-7.el7 ...중략...
local_centos 23 k
Transaction Summary
==========================================================================================================================================================================================
Install 1 Package (+3 Dependent packages)
Total download size: 245 k
(4/4): libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm ...중략...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.6 MB/s | 245 kB 00:00:00
Running transaction check
...중략...
Verifying : libnetfilter_queue-1.0.2-2.el7_2.x86_64 4/4
Installed:
conntrack-tools.x86_64 0:1.4.4-7.el7
...중략...
Complete!
Kubesphere는 다음 port들을 사용한다. 본인 소유의 시스템이 아니라면 관리자에 다음 표의 포트 개방을 요청 해야 한다.
Service
Protocol
Action
Start Port
End Port
Notes
ssh
TCP
allow
22
etcd
TCP
allow
2379
2380
apiserver
TCP
allow
6443
calico
TCP
allow
9099
9100
bgp
TCP
allow
179
nodeport
TCP
allow
30000
32767
master
TCP
allow
10250
10258
dns
TCP
allow
53
dns
UDP
allow
53
local-registry
TCP
allow
5000
For the offline environment
local-apt
TCP
allow
5080
For the offline environment
rpcbind
TCP
allow
111
Required if NFS is used
ipip
IPENCAP / IPIP
allow
Calico needs to allow the ipip protocol
metrics-server
TCP
allow
8443
Kubekey 다운로드
haedong@kubesphere-01:~:]$ curl -ksfL https://get-kk.kubesphere.io | VERSION=v1.1.1 sh -
Downloading kubekey v1.1.1 from https://github.com/kubesphere/kubekey/releases/download/v1.1.1/kubekey-v1.1.1-linux-amd64.tar.gz ...
Failed to download Kubekey v1.1.1 !
Please verify the version you are trying to download.
haedong@kubesphere-01:~:]$ tar -xvzf kubekey-v1.1.1-linux-amd64.tar.gz
README.md
README_zh-CN.md
kk
haedong@kubesphere-01:~:]$ chmod +x kk
haedong@kubesphere-01:~:]$ ll
합계 26428
-rw-r--r-- 1 haedong haedong 22906 7월 12 16:00 README.md
-rw-r--r-- 1 haedong haedong 22845 7월 12 16:00 README_zh-CN.md
-rwxr-xr-x 1 haedong haedong 13668116 7월 12 16:02 kk
-rw-rw-r-- 1 haedong haedong 13341858 7월 12 16:03 kubekey-v1.1.1-linux-amd64.tar.gz
설치 다운로드한 kk가 지원하는 kubernetes 버전을 확인한다. 1예제는 Kubekey를 이용해 Kubesphere와 Kubernetes를 함께 설치하는 방법을 나열한다. 기존에 설치되어있는 Kubernetes를 이용하는 경우는 여기를 눌러 설치 방법을 확인하면 된다.
haedong@kubesphere-01:~:]$ sudo ./kk create cluster --with-kubernetes v1.20.4 --with-kubesphere v3.1.1
[sudo] haedong의 암호:
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
| name | sudo | curl | openssl | ebtables | socat | ipset | conntrack | docker | nfs client | ceph client | glusterfs client | time |
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
| kubesphere-01 | y | y | y | y | | y | | | y | | | KST 15:17:51 |
+---------------+------+------+---------+----------+-------+-------+-----------+--------+------------+-------------+------------------+--------------+
kubesphere-01: conntrack is required.
필요한 패키지가 모두 설치 되어있다면 다음과 같이 진행 된다.
haedong@kubesphere-01:~:]# sudo./kk create cluster --with-kubernetes v1.20.4 --with-kubesphere v3.1.1
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------- -----+
| name | sudo | curl | openssl | ebtables | socat | ipset | conntrack | docker | nfs client | ceph client | glusterfs client | time |
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------- -----+
| kube01 | y | y | y | y | y | y | y | 20.10.8 | y | | | KST 09:5 2:43 |
+--------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------- -----+
This is a simple check of your environment.
Before installation, you should ensure that your machines meet all requirements specified at
https://github.com/kubesphere/kubekey#requirements-and-recommendations
Continue this installation? [yes/no]: yes
INFO[09:52:45 KST] Downloading Installation Files
INFO[09:52:45 KST] Downloading kubeadm ...
INFO[09:52:49 KST] Downloading kubelet ...
INFO[09:53:00 KST] Downloading kubectl ...
INFO[09:53:07 KST] Downloading helm ...
INFO[09:53:11 KST] Downloading kubecni ...
INFO[09:53:18 KST] Configuring operating system ...
...중략...
clusterconfiguration.installer.kubesphere.io/ks-installer created
#####################################################
### Welcome to KubeSphere! ###
#####################################################
Console: http://0.0.0.0:30880
Account: admin
Password: P@88w0rd
NOTES:
1. After you log into the console, please check the
monitoring status of service components in
"Cluster Management". If any service is not
ready, please wait patiently until all components
are up and running.
2. Please change the default password after login.
#####################################################
https://kubesphere.io 2021-09-07 10:00:00
#####################################################
INFO[10:00:11 KST] Installation is complete.
Please check the result using the command:
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
You have new mail in /var/spool/mail/root
kubekey를 이용한 설치 시 31개의 Docker image를 가져오게 되는데 운영 환경 제약 등으로 실패할 경우 아래 명령을 이용해 설치 전 이미지를 다운 받으면 된다.
Harbor1항구를 의미한다. docker, 컨테이너 등이 쌓여있는 항구를 생각하면 잘 지은 이름이란 생각이 든다.는 정책 및 역할 기반 액세스 제어로 아티팩트를 보호하고, 이미지가 스캔되고 취약성이 없는지 확인하고, 이미지를 신뢰할 수 있는 것으로 서명하는 오픈 소스 레지스트리이다. 규정 준수, 성능 및 상호 운용성 제공을 통해 Kubernetes 및 Docker와 같은 클라우드 네이티브 컴퓨팅 플랫폼에서 일관되고 안전하게 아티팩트를 관리하기 위한 도구이다. 2Habor 홈페이지에서 발췌
Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구로써 Compose에서는 YAML 파일을 사용하여 애플리케이션 서비스를 구성하고 단일 명령으로 구성에서 모든 서비스를 만들고 시작할 수 있도록 한다.
“For alpine, the following dependency packages are needed: py-pip, python3-dev, libffi-dev, openssl-dev, gcc, libc-dev, rust, cargo and make. “1 yum을 이용할 경우 패키지의 이름이 다르다. 아래 명령줄을 참고하자.라고 한다. 관련 패키지를 설치한다.
haedong@kubesphere-01:~:]$ sudo curl -k -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) TCP connection reset by peer