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

'k8s' 카테고리의 다른 글

k8s CoreDNS Configmap DNS 변경  (0) 2023.06.11

개요 : EC2 에서 k8s 를 구성하여 사용중 pod 에서 AWS Network 대역대 DNS 를 찾지 못한 현상이 발생하여, k8s CoreDns 에 지정된 DNS 조회 주소를 변경

 


방법 : CoreDns ConfigMap 수정 후 pod 재실행


 

기본 설정된 내용은 아래와 같습니다.

  • 아래 yaml 파일중 forward . /etc/resolv.conf 부분을 forward . 169.254.169.253 로 변경
  • 169.254.169.253 IP 는 AWS Private Subnet 에서 사용하는 DNS 서버 IP 입니다.
k edit cm -n kube-system coredns
##기본 설정된 내용
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf  {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html

1. 컨트롤 플레인 노드 업그레이드

master node 에서 실행
yum install -y kubeadm-1.26.x-0 --disableexcludes=kubernetes

다운로드 결과 조회
kubeadm version

업그레이드 계획 확인
sudo kubeadm upgrade plan v.1.2x.x

2. kubeadm upgrade

sudo kubeadm upgrade apply v1.2x.x

결과 확인
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.26.x". Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.

3. node drain

kubectl drain <node-to-drain> --ignore-daemonsets

4. kubelet and kubectl upgrade

yum install -y kubelet-1.2x.x-0 kubectl-1.2x.x-0 --disableexcludes=kubernetes

5. kubelet reolad and uncordon

sudo systemctl daemon-reload
sudo systemctl restart kubelet

kubectl uncordon <node-to-drain>

6. workernode upgrade

wokernode 에서
yum install -y kubeadm-1.2x.x-0 --disableexcludes=kubernetes

sudo kubeadm upgrade node

7. node drain and kubelet/kubectl upgrade

kubectl drain <node-to-drain> --ignore-daemonsets

yum install -y kubelet-1.2x.x-0 kubectl-1.2x.x-0 --disableexcludes=kubernetes

8. kubelet restart

sudo systemctl daemon-reload
sudo systemctl restart kubelet

kubectl uncordon <node-to-drain>

 

'k8s > CKA' 카테고리의 다른 글

[연습]9. etcd backup AND restore  (0) 2023.03.04
[연습]7. pod_mount  (0) 2023.03.04
[연습]6. Pod run with env  (0) 2023.03.02
[연습]5. Pod run  (0) 2023.03.02
[연습]4. expose AND service  (0) 2023.03.02

방법 : 

1. ETCD backup

##backup

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> \
  --cert=<cert-file> \
  --key=<key-file> \
  snapshot save <backup-file-location>

2. ETCD restore

ETCDCTL_API=3 etcdctl  \
--data-dir <data-dir-location> \   ## 변경될 etcd 위치(to-be)
snapshot restore snapshotdb        ## 복구시킬 저장된 스냅샷 경로(as-is)

3. etcd.yaml 파일 수정

sudo vim /etc/kubernetes/manifests/etcd/yaml

- hostPath : 
  path : [새로만든 경로로 수정]

'k8s > CKA' 카테고리의 다른 글

[연습]10. kubeadm upgrade  (0) 2023.03.04
[연습]7. pod_mount  (0) 2023.03.04
[연습]6. Pod run with env  (0) 2023.03.02
[연습]5. Pod run  (0) 2023.03.02
[연습]4. expose AND service  (0) 2023.03.02

조건 : redis 이름과  imgae 를 사용하는 POD를 생성 후 /data/redis 경로에 마운트

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: non-persistent-redis
  name: non-persistent-redis
spec:
  containers:
  - image: redis
    name: redis-container
    volumeMounts:
      - mountPath: /data/redis
        name: redis-mount
  volumes:
    - name: redis-mount

 

'k8s > CKA' 카테고리의 다른 글

[연습]10. kubeadm upgrade  (0) 2023.03.04
[연습]9. etcd backup AND restore  (0) 2023.03.04
[연습]6. Pod run with env  (0) 2023.03.02
[연습]5. Pod run  (0) 2023.03.02
[연습]4. expose AND service  (0) 2023.03.02

+ Recent posts