클라우드 네이티브 애플리케이션 부트캠프 알림

티스토리 뷰

Cloud/Kubernetes

k8s Multi node에 설치하기

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

Update History

# 2024-09-26 
- k8s 1.30 설치 검증
- Multi OS에서 설치할 수 있도록 내용 보강

# 2023-11-21일 업데이트
k8s 1.28도 아래 가이드대로 잘 설치됩니다.

# 2022-12 최초작성
k8s 1.23 기준 작성

 

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

목차

01. 시스템 아키텍처

02. 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. VM 구매하기 

AWS/Azure/Google 등 퍼블릭 Cloud에서 가상머신을 구매 하십시오. 

 

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

로컬PC에서 Linux shell을 사용할 수 있도록 환경을 구성하고 쿠버네티스 VM 접근 설정을 하겠습니다. 

Mac 사용자는 터미널에서 작업하시면 됩니다. 

Win 사용자는 아래와 같이 PC에 VM을 만들거나, MobaXTerm에서 Linux shell을 사용하시기 바랍니다. 

배천 노드는 비용을 줄이기 위해 아래 글을 참조하여 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. 컨테이너 런타임 엔진과 툴 설치

쿠버네티스의 최신 버전은 2024년 9월 현재 '1.31'입니다. 

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

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

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

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

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

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


1) CRI-O 설치

CentOS가 아닌 다른 OS에 설치할 때는 아래 가이드를 참고하세요.

cri-o

 

cri-o

Try Now Minikube: Use CRI-O as the container runtime kubeadm: Checkout this kubeadm guide to setup kubeadm to use CRI-O Kubic: Configured to use CRI-O out of the box in both its kubeadm and microOS system roles Join #crio on Kubernetes Slack Distribution P

cri-o.io

단, 아래 단계는 하지 마십시오. CRI-O 시작은 다른 방법으로 할 거고, Bootstrap a cluster단계는 k8s cluster구성할 때 합니다. 

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

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


2) podman, buildah, skopeo 설치

Podman Installation | Podman

 

Podman Installation | Podman

Looking for a GUI? You can find Podman Desktop here.

podman.io

 

buildah/install.md at main · containers/buildah (github.com)

 

buildah/install.md at main · containers/buildah

A tool that facilitates building OCI images. Contribute to containers/buildah development by creating an account on GitHub.

github.com

 

skopeo/install.md at main · containers/skopeo (github.com)

 

skopeo/install.md at main · containers/skopeo

Work with remote images registries - retrieving information, images, signing content - containers/skopeo

github.com

 

 

* 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

 

06. VM 설정 변경 

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

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


1) (CentOS만 수행) 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

* Ubuntu는 dnf 대신 apt-get 명령어 사용하세요.

 

07. kubeadm, kubelet, kubectl설치

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

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

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

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

이 작업은 위 CRI-O 설치 시 이미 했습니다.

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

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

* systemctl status kubelet으로 상태를 보면 Running이 아닌데, 이후 Kubeadm init이나 Kubeadm join명령 실행시 자동으로 Running상태가 됩니다. 

 

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 ~]#
 

(Ubuntu 만 수행) 먼저 필요한 소프트웨어를 설치합니다.

sudo apt-get update
sudo apt-get install -y socat conntrack ipset

 

아래와 같이 컨트롤 플레인을 설치 합니다. '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
 

* 에러 시 재설치: 아래 작업 후 다시 kubeadm init 명령을 수행하세요

- 설치 초기화

sudo kubeadm reset -f

- iptables 설정 초기화

sudo iptables -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -X

- CNI(Container Network Interface) 구성 삭제

sudo rm -rf /etc/cni/net.d

 

- etcd 데이터 디렉토리 삭제

sudo rm -rf /var/lib/etcd

 


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

* 계속 일부 Pod가 Running상태로 바뀌지 않는 경우 VM을 재부팅하면 해결 될 때가 있습니다.

 

 

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. 쿠버네티스 대시보드 설치

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

 

 


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

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

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

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

수고 하셨습니다. 

 

 


 

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
DNS 서버 설치 https://happycloud-lee.tistory.com/297 infra 노드
모든 노드에서 DNS 설정을 수정해서, DNS서버를 지정함
HAProxy 서버 설치
사용자를 위한 서비스는 infra노드의 haproxy 노드를 통해 in/out 되도록 함
https://happycloud-lee.tistory.com/298 infra 노드

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

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

1) docker 설치
https://happycloud-lee.tistory.com/14

2) kubectl 설치 및 환경설정
- 설치
https://cri-o.io/
위 CRIO설치에서 'Add the Kubernetes repository'를 수행하고, 'Install the packages'에서 kubectl만 설치
- 환경설정
. mkdir ~/.kube && cd ~/.kube
. worker의 .kube/config 파일 내용 복사하여 ~/.kube/config파일 생성


3) 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
댓글

클라우드 네이티브 애플리케이션 부트캠프 알림