전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

Cloud/Kubernetes

k8s Multi node에 설치하기

Happy@Cloud 2019. 9. 12. 12:48

2023-11-21일 업데이트

k8s 1.28도 아래 가이드대로 잘 설치됩니다. 

1. CRI-O 기반 Kubernetes 1.2X 설치 

목차

01. 시스템 아키텍처

02. IBM Cloud에서 VM 구매하기

03. 배천 노드에서 쿠버네티스 VM 접근 설정

04. VM hostname 변경, hosts에 등록, OS upgrade

05. 컨테이너 런타임 엔진과 툴 설치

06. VM 설정 변경

07. kubeadm, kubelet, kubectl설치

08. 컨트롤 플레인 설치

09. 워커 노드 설치

10. 배천 노드에서 쿠버네티스 클러스터 접근 설정

11. 컨테이너 간 통신 확인

12. 인그레스 컨트롤러 설치

13. 쿠버네티스 대시보드 설치

 

01. 시스템 아키텍처

쿠버네티스는 여러대의 머신이나 가상머신에 설치하는 것이 보통입니다. 

하지만 학습 목적으로만 구성한다면 1대에도 설치할 수 있습니다. 

 

싱글 노드의 물리 구성은 아래 그림과 같습니다. 

이때 쿠버네티스는 경량화 버전인 미니큐브(minikube)를 설치 합니다. 

미니큐브 설치 가이드는 아래 글을 참고 하십시오. 

https://happycloud-lee.tistory.com/20

 

 

멀티 노드의 물리 구성은 아래 그림과 같습니다.  이 가이드에서는 두대의 가상머신에 설치 합니다. 

배천 노드(bastion node)는 쿠버네티스 VM들을 접근하는 게이트웨이(Gateway) 역할을 하는 VM입니다.

실무에서는 쿠버네티스 VM들을 외부에서 직접 접근 시키지 않고 이러한 배천 노드를 통해서만 접근 하도록 합니다.  

 

 

젠킨스(Jenkins), NFS(Network File Server) 서버, 하버(Harbor), LDAP, 소나큐브(SonarQube)는 CI/CD를 위해 필요한 소프트웨어들이고 쿠버네티스 클러스터 구성 시 아직 설치할 필요 없습니다. 

위에서 제시한 CPU, 메모리, 스토리지 사양은 실습을 위한 최소 사양입니다. 실무에서는 배포되는 어플리케이션의 성격과 양에 따라 사양을 결정해야 합니다.

 

싱글노드에 구성하신다면 1대가 컨트롤 플레인과 워커 노드의 역할을 하는 겁니다. 

컨트롤 플레인은 쿠버네티스의 제반 사항을 통제하는 노드이고 워커 노드가 실제 컨테이너가 배포되는 노드입니다. 

컨트롤 플레인과 워커 노드를 합쳐서 쿠버네티스 클러스터(Kubernetes Cluster)라고 부릅니다. 

과거에는 컨트롤 플레인을 '마스터(master) 노드'라고 했는데 이제는 컨트롤 플레인(Control Plane)이라는 용어를 씁니다. 

'마스터'라는 말이 인종차별적인 어감이 있어서 IT용어에서 점점 더 안쓰는 추세입니다. 예를 들어 깃 허브도 기본 브랜치 이름을 'master'에서 'main'으로 바꿨습니다.  

 

02. IBM Cloud에서 VM 구매하기 

IBM Cloud에서 가상머신을 구매 하도록 하겠습니다.  

이 가이드에서는 PC에 Oracle VirtualBox로 VM을 만들어 배천노드로 사용할 것이므로 클라우드에서는 2대만 구매 하시면 됩니다.  

IBM Cloud에 회원가입을 하는 절차는 아래 글을 참고 하십시오. 

https://happycloud-lee.tistory.com/239

 

VM 구매 시 선택 사항은 아래 예제와 같이 하시면 됩니다. 

❶ '임시 가상 서버'를 선택하시면 사용 비용은 줄어드나 필요 시 CPU/메모리/스토리지를 조정할 수가 없습니다. 리소스 조정이 예상 되면 '공용 가상 서버'를 선택 하십시오. 

❷ 호스트 이름은 VM에서 다시 바꾸니까 지금 안 바꾸셔도 됩니다. 

❸ 수량은 2대로 해주시고 ❹ 위치는 서울로 해 주십시오. '서울'이 없으면 국내에서 가장 가까운 지역으로 선택 하십시오. 

 

❺ 4 CPU, 8GB 메모리로 해 주시고 ❻ OS는 CentOS 8 CentOS7으로 선택 하십시오

Ubuntu로 하셔도 되는데 가이드는 CentOS 7 기준이라 설치 시 명령어가 조금 달라 혼란스러울 수 있습니다. 

※ CentOS8은 2021년 12월 EOS되고 CentOS8 Stream으로 대체 되었습니다.

CentOS8 Stream은 Fedora처럼 안정적 버전을 RHEL에 반영하기 전에 실험적 기능을 테스트하는 버전이므로

CentOS7을 사용 하겠습니다.

❼ 디스크는 100GB로 선택해 주십시오. 기본인 25GB는 부족할 수 있습니다. 

생성된 VM은 왼쪽 메뉴의 3번째 아이콘을 누르시면 볼 수 있습니다. 

 

각 VM의 ❶ 공인 IP를 확인하고 ❷ 맨 왼쪽의 화살표 버튼을 눌러 펼친 후 ❸ '비밀번호' 우측의 아이콘을 눌러  루트root의 암호를 확인 합니다. 

VM 중 퍼블릭 IP가 빠른 것을 컨트롤 플레인으로 하고 나머지 1대를 워커 노드로 하겠습니다. 

퍼블릭 클라우드는 각종 해킹의 대상이 됩니다. 기본적으로 제공하는 복잡한 암호를 유지 하시는 게 좋습니다.

 

03. 배천 노드에서 쿠버네티스 VM 접근 설정

배천 노드는 비용을 줄이기 위해 아래 글을 참조하여 PC에 Oracle Virtualbox를 이용하여 구성 하십시오. 

https://happycloud-lee.tistory.com/233

여러분의 로컬 VM에서 쿠버네티스 VM을 ssh라는 프로토콜로 편하게 접근하는 설정부터 하겠습니다. 

여러분의 PC에서 생성된 VM의 퍼블릭 IP로 직접 접근하여도 되지만 실제와 유사한 경험을 하기 위해 배천 노드를 통해서만 k8s 클러스터Cluster를 접근 하도록 하겠습니다. 또한 리눅스 명령에 익숙해지기 위한 목적도 있습니다. 


1) ssh key 생성 및 컨트롤 플레인/워커 노드로 복사

배천 노드를 로그인 하고 아래와 같이 ssh key를 생성 합니다.

[root@osboxes ~]# ssh-keygen -b 4096 -t rsa

 '.ssh'디렉토리로 이동하여 컨트롤 플레인과 워커 노드로 퍼블릭 키public key를 복사 합니다. 

[root@osboxes ~]# cd ~/.ssh
[root@osboxes ~]# ssh-copy-id -i id_rsa.pub root@{컨트롤 플레인 퍼블릭 IP}
[root@osboxes ~]# ssh-copy-id -i id_rsa.pub root@{워커 노드 퍼블릭 IP}

 

2) 로그인 정의 파일 만들기

각 VM 접근을 위한 로그인 정의 파일인 'config'를 만듭니다. 

Host의 이름은 여러분 마음대로 바꿔도 되는데 혼란을 피하기 위해 ‘m’과 ‘w1’으로 해 주십시오. 

IP는 본인 VM IP로 바꿔야 합니다.

[root@osboxes ~]# cat <<EOF > config
Host m
HostName 169.56.70.197
User root
IdentityFile ~/.ssh/id_rsa

Host w1
HostName 169.56.70.201
User root
IdentityFile ~/.ssh/id_rsa

EOF
 

이제 각 VM으로 위에서 지정한 Host이름(위 예에서는 m과 w1임)으로 로그인 해 보십시오.
아래와 같이 비밀번호를 묻지 않고 로그인이 됩니다. VM을 빠져 나올때는 ‘exit’명령을 입력하면 됩니다. 

[root@osboxes .kube]# ssh m
Last failed login: Sun Jan  2 08:16:28 CST 2022 from 219.145.61.20 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Jan  2 08:16:13 2022 from 223.62.216.170
[root@virtualserver01 ~]# exit
logout
Connection to 169.56.70.197 closed.
[root@osboxes .kube]# ssh w1
Last failed login: Sun Jan  2 01:09:59 CST 2022 from 165.232.92.225 on ssh:notty
There were 132 failed login attempts since the last successful login.
Last login: Sat Jan  1 20:02:24 2022 from 223.62.216.170
[root@vertualserver02 ~]# exit

 

 

동작 원리에 대해 궁금하신 분들은 아래 글을 참조하세요.

https://happycloud-lee.tistory.com/145

 

04. VM hostname 변경, hosts에 등록, OS upgrade

각 VM의 hostname이 그대로 노드 이름이 됩니다. 너무 길면 보기 안 좋기 때문에 의미 있는 이름으로 바꾸고 hosts파일에 등록 합니다. 

그리고 OS를 최신으로 업데이트 합니다.  

아래 작업들을 컨트롤 플레인과 워커 노드에서 모두 수행 합니다. 


1) hostname 변경

컨트롤 플레인은 'master', 워커 노드는 'worker1'로 바꾸십시오.  

[root@virtualserver01 ~]# hostnamectl set-hostname {새 hostname}
 

VM을 빠져 나갔다가 다시 들어오면 새로운 hostname으로 변경된 것을 확인할 수 있습니다. 



2) hosts에 등록

IP는 본인이 생성한 VM 의 퍼블릭 IP로 바꾸십시오. 

[root@master ~]# cat <<EOF >> /etc/hosts
169.56.70.197 master
169.56.70.201 worker1
EOF

[root@master ~]# cat /etc/hosts
…
169.56.70.197 master
169.56.70.201 worker1
 


3) OS upgrade

[root@master ~]# dnf upgrade -y
 



05. 컨테이너 런타임 엔진과 툴 설치

쿠버네티스의 최신 버전은 2021년 12월 현재 '1.23.1'입니다. 

곧 나올 쿠버네티스 1.24 버전 부터는 컨테이너 런타임 엔진으로 도커가 더 이상 사용되지 않고 containerd와 CRI-O를 사용하게 됩니다. 

이 가이드에서는 CRI-O(Container Runtime Interface-Open Container Initiative)를 컨테이너 런타임 엔진으로 사용하겠습니다. 

그 외 컨테이너 작성, 저장, 실행을 위한 툴인 팟맨(podman), 빌다(buildah), 스코피오(skopeo)를 설치 합니다. 

팟맨은 Docker CLI와 같은 역할을 합니다. 고맙게도 Docker와 거의 모든 명령과 옵션이 동일합니다. 

빌다는 컨테이너 이미지를 작성하는 툴입니다. 'podman build'명령을 수행하면 내부적으로 buildah를 이용하여 이미지가 만들어집니다. 

스코피오는 컨테이너 이미지를 관리하는 툴로 이미지의 업로드, 복사, 삭제와 같은 기능을 제공 합니다. 'podman push'명령을 수행하면 내부적으로 skopeo를 이용하여 이미지가 업로드 됩니다. 

아래 작업들을 컨트롤 플레인과 워커 노드 모두에서 수행 하십시오.  


1) CRI-O 설치

환경변수 OS와 VERSION을 생성 합니다. 

OS는 OS의 이름과 버전 값을 지정하면 됩니다. 지정할 수 있는 값에는 CentOS_8, CentOS_8_Stream, CentOS_7이 있습니다.

이 가이드에서는 CentOS_8로 지정하면 됩니다. 만약 VM 구매시 CentOS 7을 선택했으면 CentOS_7로 지정 하십시오. 

VERSION은 설치할 쿠버네티스의 메이저와 마이너 버전과 동일하게 지정해야 합니다. 

이 가이드에서는 쿠버네티스 1.23.1을 설치하므로 VERSION값은 1.23으로 지정하면 됩니다. 

[root@master ~]# OS=CentOS_7
[root@master ~]# VERSION=1.23
 

 

부팅 시 로딩 할 모듈을 정의 합니다. 

[root@master ~]# cat <<EOF > /etc/modules-load.d/crio.conf
overlay
br_netfilter
EOF

[root@master ~]# sudo modprobe overlay
[root@master ~]# sudo modprobe br_netfilter
 

 

CRI-O 설치파일을 다운로드 할 리포지토리를 추가 합니다. 

[root@master ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/${OS}/devel:kubic:libcontainers:stable.repo
[root@master ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:${VERSION}/${OS}/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo
가끔 위 명령이 'curl: (16) Error in the HTTP2 framing layer' 에러가 발생하면서 안될 수 있습니다. 
아래와 같이 리포지토리 정의 파일을 다운로드 하면 됩니다. 
https://download.opensuse.org/repositories로 접근하고, devel: > kubic: > libcontainers: > stable: > cri-o: 디렉토리를 클릭 합니다. 
설치할 버전 디렉토리를 클릭하고 OS디렉토리를 선택 합니다. 
아래와 같이 레포지토리 정의 파일의 주소를 복사 합니다. 

아래와 같이 레포지토리 정의 파일을 다운로드 합니다. 

[root@master ~]# cd /etc/yum.repos.d
[root@master ~]# wget {레포지토리 정의 파일 주소} 

 

CRI-O를 설치 합니다.

[root@master ~]# dnf list cri-o
ri-o.x86_64              1.23.3-1.2.el7
[root@master ~]# dnf install -y cri-o cri-tools
 

 

CRI-O를 시작 프로그램에 등록하면서 시작 합니다. 상태 정보를 종료하려면 'q'를 누르십시오. 

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable crio --now
[root@master ~]# systemctl status crio
 

* 2023-11-21일 수정: 1.24버전 부터는 정상 설치되므로 docker설치 하지 마세요. 

중요) docker설치
2022-08-12일 현재 crio설치 시 어떤 모듈(runc로 추정)이 설치 안돼 k8s 클러스터 구성이 안되는 버그가 있습니다.
이 버그가 해결될때까지는 아래와 같이 docker도 설치해 주십시오.
# yum install -y yum-utils device-mapper-persistent-data lvm2

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# yum install docker-ce -y

 


2) podman, buildah, skopeo 설치

설치를 위해 리포지토리 정의 파일을 추가 합니다. 

[root@master ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo
 
위 명령이 에러가 나면 아래와 같이 리포지토리 정의 파일을 다운로드 하면 됩니다. 
https://download.opensuse.org/repositories로 접근하고, devel: > kubic: > libcontainers: > stable 디렉토리를 클릭 합니다. OS버전 디렉토리를 선택 합니다. 
링크 주소를 복사 합니다. 


아래와 같이 레포지토리 정의 파일을 다운로드 합니다. 
[root@master ~]# cd /etc/yum.repos.d
[root@master ~]# wget {레포지토리 정의 파일 주소} 

 

설치 가능한 팟맨(podman) 버전을 확인하고 설치 합니다. 이 가이드에서는 1.6.4를 설치 했습니다.

[root@master ~]# dnf list podman
...
podman.x86_64               1.6.4-32.el7_9 
[root@master ~]# dnf install -y podman-1.6.4
 

* CentOS7에서 root가 아닌 계정이고 sudo권한도 없는 일반 계정으로 podman을 사용하려면 아래 작업 필요

> sudo vi /etc/sysctl.d/42-rootless.conf

user.max_user_namespaces = 10000

> sudo sysctl --system

위 작업을 안하면 아래와 같은 이상한 에러가 발생합니다. 

[gappa@worker1 ~]$ podman
cannot clone: Invalid argument
user namespaces are not enabled in /proc/sys/user/max_user_namespaces
Error: could not get runtime: cannot re-exec process

 

설치 가능한 빌다(buildah) 버전을 확인하고 설치 합니다.  이 가이드에서는 1.1.6를 설치 했습니다. 

[root@master ~]# dnf list buildah
[root@master ~]# dnf install -y buildah-1.11.6
 

 

설치 가능한 스코피오(skopeo) 버전을 확인하고 설치 합니다. 이 가이드에서는 2:1.4.1를 설치 했습니다. 

[root@master ~]# dnf list skopeo
[root@master ~]# dnf install -y skopeo-2:1.4.1
 

 

06. VM 설정 변경 

쿠버네티스 설치를 위해 VM의 SELinux 모드, iptables 사용 설정, SWAP 비활성화, 네트워크 툴 설치를 먼저 해야 합니다. 

아래 작업들을 컨트롤 플레인과 워커 노드 모두에서 수행 합니다. 


1) SELinux mode 변경

SELinux 보안정책 위배 시 처리 방법을 변경하는것입니다. CentOS는 SELinux(Security Enhanced Linux)모드를 permissive로 변경하여야 합니다. 

[root@master ~]# setenforce 0
[root@master ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
 


2) iptables 사용 설정

쿠버네티스에서 네트워크 모드의 하나인 iptables를 사용하도록 설정 합니다. 

[root@master ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

[root@master ~]# sysctl --system
 


3) SWAP 비활성화

쿠버네티스는 SWAP공간을 사용하지 않습니다. 아래와 같이 비활성화 하십시오. 

[root@master ~]# swapoff -a
 

 또한 리부팅 시에도 SWAP 비활성화가 되도록 /etc/fstab 파일도 수정 합니다. 

fstab파일이 열리면 커서를 ' LABEL=SWAP-xvdb1'로 옮기고 'i'를 누른 후 '#'을 앞에 붙입니다. 그리고 'ESC'키를 누른 후 ':'을 입력하고 콜론 뒤에 'wq'를 눌러 저장하고 닫으면 됩니다. 

[root@master ~]# vi /etc/fstab
UUID=2d00ecfc-6476-4e54-8066-19863783ee5a / ext4 defaults,noatime 0 0
UUID=0af0758b-9892-4acc-8037-a30111f1e4f0 /boot ext4 defaults,noatime 0 0
#LABEL=SWAP-xvdb1       swap    swap    defaults,nofail,x-systemd.device-timeout=500ms  0       0

[root@master ~]# mount -a
 


4) 네트워크 툴 설치 

[root@master ~]# dnf install -y net-tools

 

07. kubeadm, kubelet, kubectl설치

쿠베어드민(kubeadm)은 쿠버네티스 설치 툴입니다. 

큐블릿(kubelet)은 각 노드에 설치 되어 요청된 명령을 수행하는 쿠버네티스의 핵심 컴포넌트 입니다. 

쿠베컨트롤(kubectl)은 쿠버네티스 명령을 수행하는 CLI입니다. 

아래 작업들을 컨트롤 플레인과 워커 노드 모두에서 수행 합니다. 


1) 레포지토리 정의 파일 추가

[root@master ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
 


2) kubeadm, kubelet, kubectl 설치

우리는 kubernetes 1.23.1을 설치하므로, 버전에 맞는 kubelet, kubeadm, kubectl을 설치하여야 합니다.

아래 명령으로 설치 가능한 버전을 찾고 설치 합니다.

dnf list kubelet --showduplicates | sort -r
dnf list kubeadm --showduplicates | sort -r
dnf list kubectl --showduplicates | sort -r

 

[root@master ~]# dnf install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 --disableexcludes=kubernetes

 

 


3) kubelet 부팅 시 로딩 설정 및 시작 

[root@master ~]# systemctl enable kubelet --now
 

 

08. 컨트롤 플레인 설치

쿠베어드민kubeadm을 이용하여 컨트롤 플레인을 설치 합니다. 

이 수행은 컨트롤 플레인에서만 수행 해야 됩니다. 

옵션으로 kubernetes version, Pod Network IP범위, API Server의 IP를 지정해야 합니다. 

1) 컨트롤 플레인 설치

배천 노드에서 컨트롤 플레인 VM을 로그인 합니다. 

[root@osboxes .ssh]# ssh m
Last login: Fri Dec 31 00:45:55 2021 from 223.62.175.143
[root@master ~]#
 

 

아래와 같이 컨트롤 플레인을 설치 합니다. 'apiserver-advertise'의 IP는 컨트롤 플레인 VM의  IP로 바꾸십시오.

IP는 bastion통해서만 k8s 클러스터를 접근하려면 private IP를 부여하고, 그게 아니라면 public IP를 지정합니다.

[root@master ~]# kubeadm init \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=169.56.70.197

중요) docker와 crio가 같이 설치된 경우는 아래와 같이 '--cri-socket'옵션을 추가해야 합니다.

kubeadm init \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=10.138.90.195 \
--cri-socket /var/run/crio/crio.sock

 

 
옵션 설명
- kubernetes-version: 설치할 쿠버네티스 버전을 지정 합니다.  
- pod-network-cidr: Pod Network IP 범위는 컨테이너 간 통신을 위한 CNI(Container Network Interface) 제품에 따라 다르게 지정해야 합니다. CNI제품에는 Calico, Flannel 등 여러가지가 있는데 이 가이드에서는 Calico를 설치 합니다. 
Flannel은 CPU/메모리 소비도 적고 성능도 좋지만 network policy와 암호화를 지원하지 않고,  Calico는 리소스 사용, 성능, network policy, 암호화 등 모든 면에서 뛰어나기 때문입니다. 
Calico의 Pod Network IP 범위는 '192.168.0.0/16' 입니다. 
Flannel의  Pod Network IP 범위는 '10.244.0.0/16' 입니다.

CNI툴들을 비교한 아래 글을 참고 하십시오. 

https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-august-2020-6e1b757b9e49

-  apiserver-advertise-address: API Server의 IP는 프라이빗 IP 또는 퍼블릭 IP를 지정 합니다. 우리는 배천 노드인 PC의 VM에서 쿠버네티스 클러스터를 접근해야 하므로 퍼블릭 IP로 지정 합니다. 
* 만약, bastion서버도 public cloud에서 구매한 경우는 콘트롤 플레인의 private ip를 지정하는게 보안 상 더 좋습니다.

 

설치 결과의 마지막에 kubernetes config 복사 명령과 Join 명령을 다른 곳에 잘 복사해 놓습니다. 

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
…
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 169.56.70.197:6443 --token 8y74bm.cqhmnafnr7avy339 \
--discovery-token-ca-cert-hash sha256:ce909f7dc8d2524522e4063b2aae5cf4927d80de909f985d00fa8f68b6ac47b8
 


2) 쿠버네티스 컨피그kubernetes config 파일 복사

위에서 복사한 쿠버네티스 컨피그 파일 복사 작업을 수행 합니다. 

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
 

 

컨트롤 플레인이 잘 설치 되었는지 아래 명령으로 확인 합니다. 

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   4m29s   v1.23.1
 


3) CNI 제품 설치

CNI 제품인 Calico를 설치 합니다. 

설치안내:  https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart 

[root@master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml

[root@master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
 

 

아래 명령으로 Calico Pod들이 정상 실행될때까지 기다립니다. 모두 실행되면 'watch'명령을 'CTRL-C'로 중단합니다.

[root@master ~]# watch kubectl get po -A
 

 

09. 워커 노드 설치

워커 노드를 쿠버네티스 클러스터에 추가 합니다. 

워커노드에서만 수행 합니다. 


1) 워커 노드 추가 

배천 노드에서 워커 노드를 로그인 합니다. 

[root@osboxes .ssh]# ssh w1
Last login: Fri Dec 31 00:45:55 2021 from 223.62.175.143
[root@worker1 ~]#
 

컨트롤 플레인 설치 시 복사 해 놓은 Join 명령을 실행 합니다.  

그대로 붙여넣기 하면 에러가 발생 합니다. 아래 예와 같이 역슬래시와 엔터를 지우고 한 줄로 만들어서 붙여 넣으십시오.  

[root@worker1 ~]#kubeadm join 169.56.70.197:6443 --token 8y74bm.cqhmnafnr7avy339 --discovery-token-ca-cert-hash sha256:ce909f7dc8d2524522e4063b2aae5cf4927d80de909f985d00fa8f68b6ac47b8
 


2) 쿠버네티스 컨피그 파일 복사

워커 노드 설치 후 'kubectl get nodes'명령을 실행 하면 아래와 같이 API Server를 못 찾는 에러가 발생 합니다. 아직 워커 노드에 쿠버네티스 컨피그 파일이 없기 때문 입니다. 

[root@worker1 ~]# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
 

아래와 같이 배천 노드에서 컨트롤 플레인의 쿠버네티스 컨피그 파일을 다운로드 하고 워커 노드로 복사 합니다. 

[root@worker1 ~]# exit
logout
Connection to 169.56.70.201 closed.
[root@osboxes .ssh]# cd
[root@osboxes ~]# mkdir -p .kube
[root@osboxes ~]# cd ~/.kube
[root@osboxes .kube]# scp m:~/.kube/config config
config                                                                                                                                                       100% 5641   112.8KB/s   00:00
[root@osboxes .kube]# ssh w1 "mkdir -p ~/.kube"
[root@osboxes .kube]# scp ./config w1:~/.kube/config
config                                                                                                                                                       100% 5641    11.0KB/s   00:00
[root@osboxes .kube]# ssh w1
Last login: Fri Dec 31 01:36:31 2021 from 223.62.175.143
[root@worker1 ~]#
 

이제 쿠버네티스 노드들을 확인하면 아래와 같이 정상적으로 나옵니다. 

[root@worker1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE     VERSION
master    Ready    control-plane,master   18m     v1.23.1
worker1   Ready    <none>                 6m26s   v1.23.1
 


3) 워커 노드 역할명 변경

위 노드 리스트를 보면 워커 노드의 역할이 '<none>'으로 나옵니다. 

아래 명령으로 역할명을 바꾸십시오.

[root@worker1 ~]# kubectl label node worker1 node-role.kubernetes.io/worker=worker
node/worker1 labeled
[root@worker1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   22m   v1.23.1
worker1   Ready    worker                 10m   v1.23.1
 

 

10. 배천 노드에서 쿠버네티스 클러스터 접근 설정

앞으로는 쿠버네티스 클러스터를 로그인하여 작업하지 않고 배천 노드에서만 작업 합니다. 


1) bastion 노드에 kubectl 설치 

배천 노드도 CentOS이므로 아래와 같이 설치 합니다. 

먼저 레포지토리 정의 파일을 만듭니다. 

[root@osboxes ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
 

kubectl을 설치 합니다. 

[root@osboxes ~]# dnf install -y kubectl
 

kubectl명령을 편리하게 수행하기 위해 alias 'k'를 만듭니다. 이제 'kubectl' 대신에 'k'를 사용하면 되서 편합니다. 

[root@osboxes ~]#install /usr/bin/kubectl /usr/bin/k
 


2) 쿠버네티스 컨피그 파일 복사

워커 노드 설치 시 컨트롤 플레인으로 부터 쿠버네티스 컨피그 파일을 이미 '~/.kube/config'로 복사했습니다. 

[root@osboxes ~]# cd ~/.kube
[root@osboxes .kube]# ll
total 24
drwxr-x---. 4 root root   35 Nov 29 06:47 cache
-rw-------. 1 root root 5641 Dec 31 02:44 config
 

파일 내용을 보면 아래와 같이 ❶ API Server의 주소, ❷ 쿠버네티스 클러스터, ❸ 접근 유저명, ❹ 접근 유저의 인증 토큰이 있는 것을 확인할 수 있습니다.  

쿠버네티스 클러스터로 접근이 되는지 확인해 봅니다. 

이제부터는 'k' 명령을 사용합니다. 

[root@osboxes .kube]# k get nodes
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   39m   v1.23.1
worker1   Ready    worker                 27m   v1.23.1
 

 

11. 컨테이너 간 통신 확인

컨테이너 간 통신을 해 주는 CNI제품이 정상적으로 동작하는지 반드시 확인해야 합니다. 

확인 방법은 테스트 용 파드를 실행하고 파드안에서 'kubernetes'라는 k8s service를 접근하는 지 테스트 하면 됩니다. 

배천 노드에서 아래와 같이 테스트 하십시오. 

아마 아래와 같이 에러가 날 겁니다. 제대로 나오면 다행이구요. 

[root@osboxes .kube]# k run curl -it --image=curlimages/curl -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
;; connection timed out; no servers could be reached
 

원인은 kubernetes의 DNS(Domain Name Server)역할을 하는 코어DNScoredns가 제대로 동작하지 않아서 입니다.

해결책은 간단 합니다. coredns를 재시작 하면 됩니다. 

위 curl 파드에서 'exit'를 입력하여 빠져 나오십시오. 그리고 아래 명령을 실행 합니다.

[root@osboxes]# k rollout restart deploy coredns -n kube-system
 

파드 'curl'을 아래와 같이 들어가서 nslookup을 재시도 합니다. 

아래 예와 같이 service 'kubernetes'를 'kubernetes.default.svc.cluster.local'라는 주소로 찾으면 CNI가 정상적으로 동작하는 겁니다. 

[root@osboxes .kube]# k get po
NAME   READY   STATUS    RESTARTS        AGE
curl   1/1     Running   1 (4m20s ago)   5m1s
[root@osboxes .kube]# k exec -it curl -- sh
/ $ nslookup kubernetes
Server: 10.96.0.10
Address: 10.96.0.10:53

** server can't find kubernetes.cluster.local: NXDOMAIN
** server can't find kubernetes.cluster.local: NXDOMAIN
Name: kubernetes.default.svc.cluster.local
Address: 10.96.0.1
 

 

12. 인그레스 컨트롤러 설치

https://happycloud-lee.tistory.com/167#recentComments

 

nginx ingress controller 설치하기

kubeadm으로 k8s를 설치한 후 ingress controller를 추가로 설치해야 합니다. 만약, minikube를 사용한다면 아래 명령으로 간단히 설치할 수 있습니다. $ minikube addons enable ingress kubernetes 1.20.* 이상부터는 bitn

happycloud-lee.tistory.com

 

 

13. 쿠버네티스 대시보드 설치

쿠버네티스 대시보드를 설치하면, kubectl CLI로 할 수 있는 대부분을 할 수 있을 뿐 아니라 디버깅을 하는데 매우 편합니다. 약한 수준이지만 자원 사용 현황 모니터링도 되고요.

공식 설치 가이드는 아래 링크에 있습니다. 

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

1) manifest 파일 다운로드

인그레스 컨트롤러 설치와 마찬가지로 리소스 정의 파일인 야믈 파일을 다운로드 하고 몇가지를 수정하여 설치하겠습니다. 

[root@osboxes ~]# cd ~/install
[root@osboxes install]# curl -L -o dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
 

2) Service 정의 수정

쿠버네티스 대시보드를 웹브라우저로 접근하기 위해 Service리소스 정의를 아래와 같이 수정합니다. 

[root@osboxes ~]# vim dashboard.yaml

- type: NodePort 추가 

- spec.ports.nodePort에 충돌하지 않는 포트 지정 (아래 예에서는 31234)

...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 31234
  type: NodePort
  selector:
    k8s-app: kubernetes-dashboard
 ...
 

 

3) 인증서  유효시간 추가

위쪽 화살표를 이용하여 위로 올려서 Deployment ‘kubernetes-dashboard’를 찾으십시오. 

그리고 spec.template.spec.containers.args 항목에 아래 'token-ttl'인자를 추가 합니다. 

‘- --namespace=kubernetes-dashboard’의 마지막 글자 ‘d’로 커서를 옮기고 ESC를 누른 후 ‘o’를 입력하고 엔터를 칩니다. 추가된 빈 줄에 ‘- --token-ttl=43200’을 입력 합니다.  

이 인자는 쿠버네티스 대시보드의 자동 로그아웃 시간을 기존 15분에서 12시간으로 늘리는 것입니다.  이 값은 적절히 줄이셔도 됩니다. 

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  …
  template:
    …
    spec:
      containers:
        - name: kubernetes-dashboard
          …
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            - --token-ttl=43200
 

ESC키를 누르고 ‘:’를 입력한 후 ‘wq’를 입력하고 엔터를 칩니다. 파일이 저장되고 닫힐 겁니다. 

4) 리소스 설치

수정한 dashboard.yaml을 이용하여 쿠버네티스 대시보드 리소스들을 설치 합니다. 

[root@osboxes install]# k apply -f dashboard.yaml
  replicas: 1
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
ingress.networking.k8s.io/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
[root@osboxes install]# k create serviceaccount kube-admin -n kube-system
serviceaccount/kube-admin created
[root@osboxes install]# kubectl create clusterrolebinding kube-admin --clusterrole cluster-admin --serviceaccount=kube-system:kube-admin
clusterrolebinding.rbac.authorization.k8s.io/kube-admin created

 

대시보드 파드가 정상 실행될때까지 기다립니다. 

[root@osboxes install]# k get po -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-799d786dbf-npqxj   1/1     Running   0          37m
kubernetes-dashboard-78754dcdf-t7tsn         1/1     Running   0          13s
 
5) 로그인 Service Account 생성

이제는 대시보드 로그인 계정을 만들어야 합니다.  아래와 같이 쿠버네티스 서비스 계정을 하나 만듭니다.

[root@osboxes install]# k create serviceaccount kube-admin -n kube-system
 

  계정 ‘kube-admin’에 클러스터 어드민 권한을 부여 합니다. 

[root@osboxes install]# k create clusterrolebinding kube-admin --clusterrole cluster-admin --serviceaccount=kube-system:kube-admin

 

계정 ‘kube-admin’의 인증 토큰 값을 알아야 그 토큰으로 쿠버네티스 대시보드를 로그인할 수 있습니다. 

서비스 어카운트가 만들어지면 자동으로 그 계정을 위한 Secret 리소스가 만들어 집니다. 

k8s 1.24부터는 보안 강화를 위해 서비스 어카운트 생성 시 자동으로 Secret이 만들어지지 않습니다. 

아래와 같이 수동으로 만들어 주십시오. 

apiVersion: v1
kind: Secret
metadata:
  name: kube-admin-secret
  namespace: kube-system
  annotations:
    kubernetes.io/service-account.name: kube-admin
type: kubernetes.io/service-account-token

인증 토큰 값은 그 Secret 리소스에 있습니다. 

아래와 같이 ‘kube-admin’을 위한 Secret 이름을 찾습니다. 

[root@osboxes install]# k get secret -n kube-system | grep kube-admin
kube-admin-token-flvm2                           kubernetes.io/service-account-token   3      79m
 

위에서 찾은 Secret의 내용에서 인증 토큰 값을 구합니다.  'token'항목의 'eyJ....'로 시작하는 긴 문자열이 인증 토큰 값입니다. 

이 인증 토큰 값을 다른 곳에 복사해 놓으십시오. 

[root@osboxes install]# k describe secret kube-admin-token-flvm2 -n kube-system
Name:         kube-admin-token-flvm2
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: kube-admin
              kubernetes.io/service-account.uid: 5e494c6b-a793-4ea2-850c-4735b8d6e608

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1099 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6InVNUXJUM3lCQmdqSktnM0FxdmM4VElFZkprd25qV3EyczI2LU8zYm9sZUUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlLWFkbWluLXRva2VuLWZsdm0yIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imt1YmUtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1ZTQ5NGM2Yi1hNzkzLTRlYTItODUwYy00NzM1YjhkNmU2MDgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06a3ViZS1hZG1pbiJ9.ogWomQyPJD9OovxaNhPN8JMRuXdu4W3gWNqKFuziZBUi_VSGwZaokSNMMtmXVOUEseXJFWEfLoQNjh6pdlyVhIaPiJEb6EYipDi5LepcBrqF51uG-gWt-wzwFwvoHscFJNGahzNY9oD2iY6QcK7nGu7EHDp_5hcjzcKaEw8giGxNQL6WYIE5ru8alfW8DmoxZaCP32d_IwOBSrbviomQFXMl_F-UML9FQPfsyHqS7GCQBjvRx0A9n-hMc3uL7GIIIyUh-rfQH9Cwf3T3X9Tz-yMxmXvwjEqRMN2S3snBxANATX1ym528jyPhDllQYRMFVAj-LGSnLm-2_qQqzKYAag
 

 

6) PC의 hosts에 등록

PC의 hosts파일에 이 주소를 등록 합니다. 

hosts파일의 위치는 윈도우는 C:\windows\system32\drivers\etc디렉터리에 있고 맥은 /etc/hosts에 있습니다. 

윈도우는 메모장이나 에디터 프로그램을 이용하여 열고 맥은 아래와 같이 sudo 권한으로 엽니다. 

❯ sudo vim /etc/hosts
Password:

hosts파일에 mydashboard.io를 추가 합니다.

IP는 쿠버네티스 클러스터를 구성하는 VM의 퍼블릭 IP 중 아무거나 사용하면 됩니다. 

169.56.70.201	mydashboard.io

 

웹브라우저를 열고 'https://mydashboard.io:{NodePort}' 로 접근 합니다.

위에서 구한 인증 토큰 값을 붙여넣기 하고 [로그인] 합니다.    

아래와 같이 첫 페이지가 나오면 잘 설치 된겁니다. 

 

7) bastion통해 dashboard 열기

실제 운영시에는 외부에서 직접 k8s cluster를 접근 못하게 구성합니다. 

이번에는 bastion 서버에 haproxy를 설치하고 proxying하여 dashboard를 연결해 보겠습니다. 

먼저, haproxy를 bastion서버에 설치하십시오. 

https://kubepia.github.io/cloudpak/cp4app/install/infra05.html

 

Infra Servers-HAProxy서버 설치 | Kubepia Documents

Infra Servers-HAProxy서버 설치 HAProxy서버 설치 Terminal 또는 ssh명령으로 Network VM을 접근합니다. L/B 설정 api server에 대한 6443, 22623포트 L/B설정을 합니다. user services에 대한 80, 443포트 L/B설정을 합니다. L

kubepia.github.io

 

/etc/haproxy/haproxy.cfg파일에 아래 예시와 같이 proxy설정을 추가합니다. 

'31234'는 Service의 NodePort번호이니 자신에 맞게 수정하십시오. worker node의 IP도 수정하셔야 합니다. 

#---------------------------------------------------------------------
# dashboard
#---------------------------------------------------------------------
frontend dashboard
    bind *:31234
    default_backend dashboard
    mode tcp
    option tcplog
backend dashboard
    balance source
    mode tcp
    server worker1 10.193.24.196:31234 check
    server worker2 10.193.24.197:31234 check

 

haproxy를 재시작합니다. 

systemctl restart haproxy
systemctl status haproxy

PC의 host파일에 dashboard 호스트를 bastion IP로 변경하십시오. 

165.192.105.51	mydashboard.io

이제 https://mydashboard.io:{Node Port}로 접속하여 dashboard가 연결되는지 확인합니다. 

 

 


지금까지 CRI-O를 컨테이너 런타임으로 사용하는 쿠버네티스 1.23.1 설치를 하였습니다. 

잘 설치가 되었나요 ? 아마 처음엔 많은 시행 착오가 있을 겁니다. 

그 원인을 찾아 가면서 실력이 쌓아지는 것이니 절대 헛된 시간은 아닙니다. 

설치 중 문제가 있으면 댓글에 남겨 주십시오. 

수고 하셨습니다. 

 

 


 

2. 추가 설치 및 구성

NFS서버는 Network File Server를 의미하며, 컨테이너간 스토리지공유 목적의 서버입니다. 별도 VM이 필요합니다.

S/W 설명 설치 위치
web console, metrics, ingress controller 1) k8s web console 설치하기: happycloud-lee.tistory.com/36?category=832243
2) Metrics 서버 설치: happycloud-lee.tistory.com/38?category=832243
3) nginx ingress controller: happycloud-lee.tistory.com/167?category=832243

k8s cluster
작업할 VM 설정:
k8s master, worker노드를 직접 접속하지 않고, bastion서버를 이용하는 경우

* bastion서버는 k8s 클러스터를 접근하는 gateway역할을 하는 서버임
작업할 VM에서 수행

1) kubernetes 사용환경 설정: happycloud-lee.tistory.com/69?category=832243* 위 가이드 참조하여, docker, kubectl를 설치하고, root user로 k8s cluster접근할 수 있도록만 하십시오.

2) kubectx, kubens 설치: happycloud-lee.tistory.com/95?category=832243
bastion
NFS서버 1) NFS서버 설치: happycloud-lee.tistory.com/46?category=832247 NFS (bastion에 설치도 가능)
2) NFS Dynamic provisioning: happycloud-lee.tistory.com/178?category=832243 k8s cluster
LDAP 1) LDAP서버 설치: happycloud-lee.tistory.com/117?category=8322502)

2) LDAP에 사용자/그룹 추가하기
https://happycloud-lee.tistory.com/172
bastion 또는
k8s cluster
image registry: harbor harbor 설치 및 구성:happycloud-lee.tistory.com/165?category=832250*
host는 harbor.io로 설치해 주십시오. DNS서버가 없는 경우 PC, NFS서버의 hosts파일에 등록도 필요합니다.
bastion
git private gitea
https://happycloud-lee.tistory.com/270

private gitlab
happycloud-lee.tistory.com/50?category=832247
k8s cluster
git CLI 'git 설치'로 google검색하여 OS에 맞게 설치 PC, bastion
OS user 생성 및 kubeneste config cluster를 여러 사람이 사용하기 위해서는 OS user를 각각 만들고, 각 OS user에게 특정 namespace만 Write할 수 있도록
허용해야 함

happycloud-lee.tistory.com/223
bastion
Jenkins
happycloud-lee.tistory.com/48?category=832247
bastion
sonarQube
happycloud-lee.tistory.com/49?category=832247
k8s cluster

 

kubernetes를 3개의 node에서 성공적으로 설치하였습니다.

수고하셨습니다.

 

 

 

'Cloud > Kubernetes' 카테고리의 다른 글

kubernetes 명령 자동완성 설정하기  (0) 2019.09.12
k8s Multi node 설치 후 web dashboard 설정  (0) 2019.09.12
6. K8s 교재 맺음말  (0) 2019.09.12
5. Kubernetes 보안  (0) 2019.09.12
4. K8s Resources > 모니터링  (0) 2019.09.12
댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]