티스토리 뷰
2023-11-21일 업데이트
k8s 1.28도 아래 가이드대로 잘 설치됩니다.
1. CRI-O 기반 Kubernetes 1.2X 설치
목차
04. VM hostname 변경, hosts에 등록, OS upgrade
07. kubeadm, kubelet, kubectl설치
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설치 하지 마세요.
# 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
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
...
위쪽 화살표를 이용하여 위로 올려서 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
이제는 대시보드 로그인 계정을 만들어야 합니다. 아래와 같이 쿠버네티스 서비스 계정을 하나 만듭니다.
[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
/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 |
- Total
- Today
- Yesterday
- spotify
- CQRS
- agile
- 돌봄경제
- 마이크로서비스
- 스핀프로젝트
- 마이크로서비스 패턴
- SAGA
- micro service
- 버라이어티가격
- Event Sourcing
- 애자일
- API Composition
- 호모프롬프트
- 디토소비
- AXON
- 육각형인간
- 리퀴드폴리탄
- 요즘남편 없던아빠
- 분초사회
- 스포티파이
- 도파밍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |