Amazon EKS Distro란? EKS Distro 설치하기 (EC2 기반 EKS Distro 설치)

2021. 2. 15. 23:28IT/AWS

728x90

 EKS Distro는 Amazon EKS에서 배포한 것과 동일한 Kubernetes 오픈소스 지원 배포판이다.

올해 출시 된 EKS Anywhere의 기반이 되는 소스이다. (EKS Anywhere에 대한 기대가 크다. On-Prem에서도 AWS를 사용할 수 있으니, Cloud로의 전환 및 Hybrid 운영이 훨씬 편리해진다.)

 

 Public Cloud로의 전환이 이루어지고 있지만, 모든 워크로드를 전환시킬 수 없다. 분명히 On-Prem 장비에서 운영해야 하는 워크로드들이 존재한다. AWS 역시 이러한 고민을 아래 EKS Anywhere 서비스가 나오는 것 아닐까 싶다. EKS Distro는 오픈소스이므로 AWS의 지원은 받을 수 없고, 커뮤니티를 통해 도움 받아야 한다. 본문에서는 AWS EC2에서 EKS Distro를 설치하여 Cluster를 구성한다.

 

1. Master, Worker node 설치

- SELinux와 Swap을 비활성화한다. 방화벽을 설치하고, Kubernetes 필수 포트는 허용하도록 한다. (본문에서는 추후 방화벽을 stop하고, disable 하였다.)

sudo setenforce 0
sudo swapoff -a
sudo yum install firewalld -y
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --zone=public --permanent --add-port=6443/tcp --add-port=2379-2380/tcp --add-port=10250-10252
/tcp

 

 - Docker를 설치한다.

sudo curl -sSL https://get.docker.com | sh
sudo systemctl start docker
sudo systemctl enable docker

sudo docker pull public.ecr.aws/eks-distro/kubernetes/pause:v1.18.9-eks-1-18-1;\
sudo docker pull public.ecr.aws/eks-distro/coredns/coredns:v1.7.0-eks-1-18-1; \
sudo docker pull public.ecr.aws/eks-distro/etcd-io/etcd:v3.4.14-eks-1-18-1; \
sudo docker tag public.ecr.aws/eks-distro/kubernetes/pause:v1.18.9-eks-1-18-1 public.ecr.aws/eks-distro
/kubernetes/pause:3.2; \
sudo docker tag public.ecr.aws/eks-distro/coredns/coredns:v1.7.0-eks-1-18-1 public.ecr.aws/eks-distro/kubernetes
/coredns:1.6.7; \
sudo docker tag public.ecr.aws/eks-distro/etcd-io/etcd:v3.4.14-eks-1-18-1 public.ecr.aws/eks-distro/kubernetes
/etcd:3.4.3-0

 

- Kubernetes용 Repo를 추가하고, Kubernetes 필수 패키지를 설치한다.

sudo vi /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
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/rpmpackage-key.gpg
exclude=kubelet kubeadm kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

 

- /etc/modules-load.d/k8.conf 에 작성한다.

br_netfilter
sudo mkdir -p /var/lib/kubelet
sudo vi /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd —network-plugin=cni —pod-infra-container-image=public.ecr.aws/eksdistro/kubernetes/pause:3.2"

 

- Distro용 kubeadm , kubelet, kubectl를 설치한다.

cd /usr/bin
sudo rm kubelet kubeadm kubectl
sudo wget https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9/bin/linux
/amd64/kubelet; \
sudo wget https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9/bin/linux
/amd64/kubeadm; \
sudo wget https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9/bin/linux
/amd64/kubectl
sudo chmod +x kubeadm kubectl kubelet
sudo systemctl enable kubelet

 

2. Master 구성

 Multi Master 는 방법 1(HAproxy) 또는 방법 2(NLB 생성)을 통해 구성한다.

2.1 HAproxy LB 구성

- HAproxy LB를 설치한다. (Master1에 해당)

sudo yum -y install haproxy
sudo vi /etc/haproxy/haproxy.cfg
frontend kubernetes-master-lb
bind 0.0.0.0:26443
option tcplog
mode tcp
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
balance roundrobin
option tcp-check
option tcplog
server master1 50.0.0.5:6443 check
server master2 [Master2 IP]:6443 check
server master3 [Master2 IP]:6443 check
sudo systemctl restart haproxy
sudo systemctl enable haproxy

 

- Master 컴포넌트를 생성하고 출력된 토큰을 복사한다. (해당 토큰은 Master에 연결할 때 필요하다.)

sudo kubeadm init --image-repository public.ecr.aws/eks-distro/kubernetes --kubernetes-version v1.18.9-eks-1-18-
1 --control-plane-endpoint "50.0.0.5:26443" --upload-certs
[init] Using Kubernetes version: v1.18.9-eks-1-18-1
[preflight] Running pre-flight checks
...
[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!

 

- Pod network 설치한다. (본문에서는 Weave Net works 사용한다.)

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=v1.18.9-eks-1-18-1"

 

- Master2~3을 연결한다.

cd /usr/bin/
sudo wget sudo wget https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9/bin
/linux/amd64/kubeadm
chmod +x kubeadm
sudo kubeadm join 50.0.0.5:26443 --control-plane --token <Token> --discovery-token-ca-cert-hash <Hash> --
certificate-key <Certi>

 

2.2 NLB 구성

- AWS Console에서 NLB를 생성하고, DNS 주소를 넣어준다. 출력된 토큰을 기반으로 Master2~3을 연결한다.

sudo kubeadm init --image-repository public.ecr.aws/eks-distro/kubernetes --kubernetes-version v1.18.9-eks-1-18-
1 --control-plane-endpoint "NLB엔드포인트.elb.ap-northeast-2.amazonaws.com:6443" --upload-certs

 

3. Worker node 구성

- Worker Node1~5에서 토큰을 기반으로 Master와 연결한다.

cd /usr/bin/
sudo wget sudo wget https://distro.eks.amazonaws.com/kubernetes-1-18/releases/1/artifacts/kubernetes/v1.18.9/bin
/linux/amd64/kubeadm
chmod +x kubeadm

sudo kubeadm join 50.0.0.5:26443 --token <Token> --discovery-token-ca-cert-hash <Hash> --certificate-key <Certi>

 

- Master 연결과 CNI 적용을 확인한다.

 

기타

- 방화벽 해제

sudo systemctl stop firewall
sudo systemctl disable firewall

 

- 재설치를 위한 초기화

sudo kubeadm reset
sudo systemctl restart kubelet

 

- 서버 오류

Error from server (InternalError): an error on the server ("") has prevented the request from succeeding

sudo systemctl restart kubelet

 

참고 Link

https://distro.eks.amazonaws.com/users/install/kubeadm-onsite/

https://github.com/237summit/k8s_core_labs

 

300x250