2021. 2. 15. 23:28ㆍIT/AWS
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
'IT > AWS' 카테고리의 다른 글
[EC2 IMDS] EC2 Metadata란? IMDS 확인 설정하기 (0) | 2022.12.27 |
---|---|
AWS MSA 2. 비즈니스 기능 중심으로 구성(Organized Around Business Capabilities) (0) | 2020.06.23 |
AWS MSA 1. 서비스를 통한 컴포넌트화 (Componentization Via Services) (0) | 2020.06.23 |
AWS MSA 0. Running Containerized Microservices on AWS (0) | 2020.06.18 |
Amazon Linux 2에서 Apache와 Tomcat 구성(Web, WAS 서버 구축) (0) | 2020.06.03 |