k8s v1.28 install on AWS EC2(Ubuntu22.04) with calico and crio-o (2023-11-15)
k8s를 사용하는 가장 간단한 방법은 EKS 를 사용하는 것이다. 하지만 CKA 연습을 위해, 혹은 비용문제로 인해 EKS 를
사용 하지 못하는 경우가 있다. 이때 VM ware 를 사용하는 것도 방법이지만 EC2에서 직접 k8s 를 설치 하여 사용하는 방법도 고려할 수 있다.
참고사항
- k8s를 기동하기 위해서는 2core, 2mem 가 최소 사양이 되므로, 인스턴스 타입을 고려해서 EC2 생성
- k8s 가 버전이 올라가면서 docker runtime 을 지원하지 않게 됨에 따라, CRI(container runtime interface) 를 직접 설치 해야 한다 // 1.24 버전부터 지원이 안되는 것으로 알고 있다
- k8s 는 CNI(container network interface)도 기본 지원을 하지 않는다. 따라서 사용할 CNI 또한 직접설치해야 한다.
스펙 상세
EC2 : t3a.medium
Disk : gp3 15 GiB
OS : Ubuntu22.04
k8s : 1.2.0
CRI : crio-o
CNI : calico
설치 상세 내용
1. sudo -i 로 root 로 k8s 를 설치 진행 한다
2. ubuntu 기본 apt 업데이트 진행
sudo apt-get update
sudo apt-get upgrade -y
3. k8s 설치를 위해 필요한 인증관련 도구 설치
sudo apt-get install -y apt-transport-https ca-certificates curl
4. swap off 설정
sudo swapoff -a
5. cri-o 설치를 위한 변수 지정
export OS_VERSION_ID=xUbuntu_$(cat /etc/os-release | grep VERSION_ID | awk -F"=" '{print $2}' | tr -d '"')
export CRIO_VERSION=1.28
6. cro-o 설치
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS_VERSION_ID/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$CRIO_VERSION/$OS_VERSION_ID/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION/$OS_VERSION_ID/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS_VERSION_ID/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
sudo apt-get update
sudo apt-get install cri-o cri-o-runc cri-tools -y
sudo systemctl daemon-reload
sudo systemctl enable crio --now
※cri-o 를 설치하게 되면 cri-o 기본 설정으로 cni 가 설치가 되는데, 여기서 우리는 calico 를 사용할 예정이므로 아래 경로에 있는 파일 삭제
/etc/cni/net.d
7. k8s 설치및 사용을 위한 kube 관련 도구 설치
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
8. kubeadm init 을위 환경 설정
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
9. k8s cluster 생성
아래 내용을 샘플로 본인에 맞는 cidr 및 version install
sudo kubeadm init --pod-network-cidr=10.85.0.0/16 --kubernetes-version 1.28.0
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version 1.28.0 --node-name master-node
생성이 완료되면 아래와 같은 내용이 출력 된다
아래 내용중 kubeadm join 부분을 꼭 저장해 두자
-> 추후 노드 추가할때 해당 부분이 필요
10. kube 명령어 설정 및 kube 설정 확인
- 아래와 같이 coredns 가 pending 인 상태가 된것을 확인 할 수 있다.
- 해당 부분은 cni 를 설치하고 나면 정상적으로 running 상태로 변경된다
- coredns 가 running이 되면 node 가 ready 상태로 변경 된다
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
alias k=kubectl
k get no
k get po -A
11. calico cni 설치
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
위 파일을 다운로드 받은 후 vi 로 아래 사진과 같이 13번째줄의 cidr 을 수정 해야함
kubeadm init 시 pod cidr 를 192.168.0.0/16 로 지정 했으면 수정없이 배포하면 됨
k apply -f custom-resources.yaml
12. node 및 pod 확인
- 시간이 지나면 아래와 같이 pod 와 node 가 running 이 되는 것을 확인 할 수 있다
watch kubectl get po -A -o wide
kubectl get no
13. calico 후속작업
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
여기까지하면 k8s master cluster 는 설치가 완료 된다.
이제 설치한 k8s cluster 에 node 를 추가하는 방법을 진행해 보겠습니다.
클러스터 생성시 진행한 1~8 번 까지의 과정을 반복한다
하나하나 입력하면 귀찮으니 아래 스크립트로 진행
#! /bin/sh
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https ca-certificates curl
sleep 1
sudo swapoff -a
sleep 1
export OS_VERSION_ID=xUbuntu_$(cat /etc/os-release | grep VERSION_ID | awk -F"=" '{print $2}' | tr -d '"')
export CRIO_VERSION=1.28
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS_VERSION_ID/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
sleep 1
echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$CRIO_VERSION/$OS_VERSION_ID/ /"|sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION.list
sleep 1
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$CRIO_VERSION/$OS_VERSION_ID/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
sleep 1
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS_VERSION_ID/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
sudo apt-get update
sleep 1
sudo apt-get install cri-o cri-o-runc cri-tools -y
sleep 1
rm /etc/cni/net.d/*
sleep 1
sudo systemctl daemon-reload
sudo systemctl enable crio --now
sleep 1
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sleep 1
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sleep 1
sudo apt-mark hold kubelet kubeadm kubectl
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
이제 클러스터 생성시 저장해둔 kubeadm join 명령어를 입력
마스터노드에서 아래와 같이 조회해 보면 정상적으로 클러스터 구성이 된 것을 볼 수 있다
주의사항
root 가 아닌 다른 계정에서 k8s 를 사용하기 위해서는 아래 명령어 입력 필요
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config