Kubernetes Cluster를 구성하기 위해 Kubernetes Controlplane, 컨테이너가 실행 될 worker 노드가 필요합니다.
(kubernetes hard way 경우 kubernetes controlplane은 kubelet을 설치하지 않기 때문에 컨테이너가 동작하진 않습니다.)
이 튜토리얼은 kubernetes controlplane, worker node에 사용할 다양한 서버 속성들을 아래와 같은 예시로 장비 데이터베이스용 텍스트 파일로 저장하여 설정을 하고자 합니다.
IPV4_ADDRESS FQDN HOSTNAME POD_SUBNET
IPV4_ADDRESS
은 서버의 IP, FQDN
은 fully qualified domain name, HOSTNAME
은 host name, POD_SUBNET
은 Pod의 IP 서브넷을 나타냅니다.
Kubernetes는 Pod당 하나의 IP 주소를 할당하며, POD_SUBNET
은 Kubernetes Cluster 내 각 서버에 할당된 고유 IP 주소 범위를 나타냅니다.
자신의 시스템 환경에 맞춰 수정 후 장비 데이터베이스 파일을 생성합니다.
cd /k8s-hardway
cat <<EOF > machines.txt
10.0.35.207 controlplane-1.kubernetes.local controlplane-1
10.0.34.93 node-1.kubernetes.local node-1 192.168.10.0/24
10.0.32.237 node-2.kubernetes.local node-2 192.168.11.0/24
EOF
SSH는 Kubernets Cluster를 구성하는데 사용됩니다. 위에 생성한 장비 데이터 파일에 대한
root SSH 접근 권한이 있는지 확인하고, root 접근이 안되어 있을 경우 /etc/ssh/sshd_config
파일을 root로 접근할 수 있게 수정 후 SSH를 재시작 하면 됩니다.
Enable root SSH Access
만약에 root 계정의 SSH 접근 권한이 활성화 되어있을 경우 해당 섹션은 넘어가셔도 됩니다.
리눅스 운영체제마다 다르지만, 보안상 root 계정을 통한 SSH 접근은 비활성화 되어 있는 경우가 있습니다. root라는 사용자 명은 널리 알리어져 있으며, 만약에 엄청 취약한 패스워드를 사용하고 있다면, 외부에서 쉽게 SSH 접근을 할 수 있기에 공격에 매우 취약합니다.
하지만, 해당 튜토리얼의 단계를 간소화 하기 위해 SSH를 통한 root 계정 액세스를 활성화를 합니다.
(이 가이드는 외부에서 접근하면 위험하기에 외부에서 접근 가능한 서버라면, 방화벽 인바운드 정책 또는 root 계정 패스워드를 강력하게 설정하시면 됩니다.)
각 서버에 접근하여 root 계정으로 전환합니다.
su - root
OR
sudo -i
/etc/ssh/sshd_config
의 PermitRootLogin
옵션을 no에서 yes로 변경합니다.
sed -i \
's/^#PermitRootLogin.*/PermitRootLogin yes/' \
/etc/ssh/sshd_config
설정파일을 수정했으니sshd
(SSH Daemon)SSH 서버를 재시작합니다.
systemctl restart sshd
systemctl status sshd
# OUTPUT
# > ● ssh.service - OpenBSD Secure Shell server
# Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: e>
# Active: active (running) since Mon 2024-05-27 15:20:38 UTC; 10s ago`
이 섹션에서는 controlplane-1
, node-1
, node-2
에 대한 SSH Key pair를 생성하고,서버에 배포 작업을 합니다.
해당 작업은 튜토리얼 동안 jumpbox 서버에서 명령을 실행하는데 사용될 것입니다.
SSH Key 생성
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
생성한 SSH public key를 각 서버에 복사합니다.
while read IP FQDN HOST SUBNET; do
ssh-copy-id root@${IP}
done < /k8s-hardway/machines.txt
만약 해당 작업이 실패할 경우 jumpbox의 /root/.ssh/id_rsa.pub
파일 내용을 각 서버의 /root/.ssh/authorized_keys
파일에 복사하시면 됩니다.
.ssh
디렉터리도 없으면 mkdir /root/.ssh && chmod 700 /root/.ssh
를 실행하시면 됩니다.
정상적으로 SSH public key가 추가 됐다면, 잘 동작하는지 확인해봅시다.
while read IP FQDN HOST SUBNET; do
ssh -n root@${IP} uname -o -m
done < /k8s-hardway/machines.txt
x86_64 GNU/Linux
x86_64 GNU/Linux
x86_64 GNU/Linux
이번 섹션에는 controlplane-1
, node-1
, node-2
서버에 대한 host name을 설정합니다.
hostname은 jumpbox
서버에서 각 서버마다 명령어를 실행할 때 사용될 것입니다.
그리고 hostname은 Kubernetes Cluster에 중요한 역할을 하며, Kubernetes API 서버에 명령을 실행하기 위해 IP 주소말고 controlplane-1
의 hostname으로 사용할 것입니다.
while read IP FQDN HOST SUBNET; do
CMD="sed -i 's/^127.0.0.1.*/127.0.0.1\t${FQDN} ${HOST}/' /etc/hosts"
ssh -n root@${IP} "$CMD"
ssh -n root@${IP} hostnamectl hostname ${HOST}
done < /k8s-hardway/machines.txt
정상적으로 잘 설정 됐는지 확인해봅니다.
while read IP FQDN HOST SUBNET; do
ssh -n root@${IP} hostname --fqdn
done < /k8s-hardway/machines.txt
controlplane-1.kubernetes.local
node-1.kubernetes.local
node-2.kubernetes.local
해당 작업이 안될 경우 각 서버에 접근하여 /etc/hosts
파일을 다음과 깉이 수정하셔도 됩니다.
cat /etc/hosts
127.0.0.1 node-1.kubernetes.local node-1
이번 섹션에는 jumpbox
서버의 /etc/hosts
파일과 controlplane-1
, node-1
, node-2
서버의 /etc/hosts
파일에 추가될 DNS hosts
파일을 생성할 것입니다.
새로운 hosts
파일을 생성하고 헤더를 추가하여 추가되는 서버를 식별합니다.
echo "" > /k8s-hardway/hosts
echo "# Kubernetes The Hard Way" >> /k8s-hardway/hosts
machines.txt 파일의 각 서버에 대한 DNS entry를 생성하고 hosts 파일에 추가합니다.
while read IP FQDN HOST SUBNET; do
ENTRY="${IP} ${FQDN} ${HOST}"
echo $ENTRY >> /k8s-hardway/hosts
done < /k8s-hardway/machines.txt
hosts 파일에 DNS entry가 잘 추가됐는지 확인해봅니다.
cat /k8s-hardway/host
# Kubernetes The Hard Way
10.0.35.207 controlplane-1.kubernetes.local controlplane-1
10.0.34.93 node-1.kubernetes.local node-1
10.0.32.237 node-2.kubernetes.local node-2
이번 섹션에는 앞에서 생성한 hosts
파일을 jumpbox
서버의 /etc/hosts
파일에 추가합니다.
hosts에 존재하는 DNS entry를 /etc/hosts
파일에 추가합니다.
cat /k8s-hardway/hosts >> /etc/hosts
/etc/hosts
파일이 업데이트 됐는지 확인해봅니다.
cat /etc/hosts
127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
# Kubernetes The Hard Way
10.0.35.207 controlplane-1.kubernetes.local controlplane-1
10.0.34.93 node-1.kubernetes.local node-1
10.0.32.237 node-2.kubernetes.local node-2
이제 hostname을 사용하여 /k8s-hardway/machines.txt
파일에 나열된 각 서버에 SSH로 접근할 수 있어야합니다.
for host in controlplane-1 node-1 node-2
do ssh root@${host} uname -o -m -n
done
controlplane-1 x86_64 GNU/Linux
node-1 x86_64 GNU/Linux
node-2 x86_64 GNU/Linux
jumpbox
서버에서 /etc/hosts
파일에 DNS Entry를 추가한 작업을 각 서버마다 동일하게 작업해줍니다.
hosts
파일을 각 서버에 복사하고 해당 내용을 /etc/hosts
파일에 추가합니다.
while read IP FQDN HOST SUBNET; do
scp hosts root@${HOST}:~/
ssh -n \
root@${HOST} "cat hosts >> /etc/hosts"
done < /k8s-hardway/machines.txt
hosts 100% 171 448.5KB/s 00:00
hosts 100% 171 37.4KB/s 00:00
hosts 100% 171 381.4KB/s 00:00
정상적으로 적용이 됐는지 확인해봅니다.
while read IP FQDN HOST SUBNET; do
ssh -n \
root@${HOST} "cat /etc/hosts"
done < /k8s-hardway/machines.txt
이제는 jumpbox
서버 뿐만 아니라 Kubernetes Cluster의 3개 서버 중 어느 서버에서 연결할 때 IP 주소 대신 hostname을 사용하여 연결할 수 있습니다.