마짱짱의 지식창고

[k8s] docker, kubeadm, Calico 설치 본문

Kubernetes

[k8s] docker, kubeadm, Calico 설치

마짱짱 2022. 3. 23. 19:42
반응형

(수정)

해당 방법은  k8s 1.24 이전 버전만 가능 합니다.

k8s 1.24버전부터 Dokershim을 지원하지 않기에 해당 방법으로는 불가능합니다.

시간 여유있을때 1.24 이후 containerd 방법으로 공유드리도록 하겠습니다.

---

 

https://majjangjjang.tistory.com/215#google_vignette

 

k8s containerd, kubeadm, calico 설치

2022.03.23 - [Kubernetes] - [k8s] docker, kubeadm, Calico 설치 해당 글이 더이상 현재와 맞지도않고..집에서 공부환경을 다시 구성하면서 새롭게 가이드를 작성하였습니다.시스템환경Master 1대Worker 3대Applicai

majjangjjang.tistory.com

24. 09. 02  새롭게 작성하였으니 위의 주소에서 확인 바랍니다.
24. 09. 02  새롭게 작성하였으니 위의 주소에서 확인 바랍니다.
24. 09. 02  새롭게 작성하였으니 위의 주소에서 확인 바랍니다.

 

 

0. 들어가기 전

Kubeadm 을 설치를위해 K8s Docs 참고로하여 순서대로 진행

https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

어떻게 보면 변화가 빠른 기술이기에 Docs 가 더 정확하고 최신 자료가 있을거라 생각되기에

Docs 보면서 이해하고 알아가는 습관을 위해 해당 방식으로 채택

1. 작업 시작전 참고 사항

K8s Node 들은 최소 스펙으로 말하기를 CPU:2,RAM:2 이상이여야 한다.

1.1 작업 VM Spec

Master

OS : Debian10

CPU : 2

RAM : 2

Node 3개

OS : Debian10

CPU : 2

RAM : 2

2. iptables가 Bridge된 트래픽 보게하기

Linux 노드의 네트워크 흐름을 올바르게 흘러가기 위해 필요한 설정

br_netfilter : 커널묘듈을 사용, 내부와 외부 네트워크 분리

iptables 가 패킷관리하기위해 활성화

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

3. 포트 OPEN

https://kubernetes.io/ko/docs/reference/ports-and-protocols/

3.1 Master

프로토콜 방향 포트 범위 용도 사용 주체
TCP 인바운드 6443 쿠버네티스 API 서버 전부
TCP 인바운드 2379-2380 etcd 서버 클라이언트 API kube-apiserver, etcd
TCP 인바운드 10250 Kubelet API Self, 컨트롤 플레인
TCP 인바운드 10259 kube-scheduler Self
TCP 인바운드 10257 kube-controller-manager Self

3.2 Worker

프로토콜 방향 포트 범위 용도 사용 주체
TCP 인바운드 10250 Kubelet API Self, 컨트롤 플레인
TCP 인바운드 30000-32767 NodePort 서비스† 전부

4. 컨테이너 런타임 설치

컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.

대표적으로 도커, Contaienrd, CRI-O 등이 있다.

파드가 노드에 실행되기 위해서는 각 노드마다 설치가 필요하다.

해당 포스팅에선 Docker를 설치하여 해결하려한다.

포스팅할때 들려오는 정보로는 더 이상 Docker안에있는 Runtime과 K8s CRI와 호환이 안된다는 소식이 있다. 관련 내용으로는
https://ikcoo.tistory.com/189
해당 블로그에서 확인하는 것이 좋다.

(글을 너무 잘쓰셔서 이해가 쏙쏙 되었다 참고바람)

4.1 Docker Install

https://docs.docker.com/engine/install/#server

링크를 통해 확인해보니 요즘에는 Script방식으로도 지원하는듯 한데

해당 포스팅에선 일반적인 방법으로 설치

Script로 아주 간편하게 설치를 원한다면

https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script

해당 URL을 통해 주의할점 확인

4.1.1 Docker Repository 등록

# 필요한 패키지 설치
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release

# Docker Official GPG KEY 등록
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 저장소 설정
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Repository Update
sudo apt update

4.1.2 Docker Engine 설치

# Docker 설치
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 윗 방식대로하면 stable의 최신버전으로 설치가된다.
# 특정 version으로 설치를 원한다면
# apt-cache madison docker-ce
# 명령어를 사용하여 버전을 확인 후
# sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
# 해당 명령어의 버전에 기입하여 실행

4.2 cgroup관리에 systemd를 사용하도록 도커데몬 구성

cgroup 에 관련된 포스팅은 따로 작성할 예정입니다.

K8s에선 v1.22 이상부터는 systemd를 권장으로 하고 있습니다.

cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

4.3 Docker 자동실행

sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# systemd 제대로 적용 되었는지 확인
sudo docker info | grep Cgroup

mswoo@k8s-master:/etc/docker$ sudo docker info | grep Cgroup
WARNING: No swap limit support
 Cgroup Driver: systemd
 Cgroup Version: 1

5. Kubeadm 설치

k8s가 동작하기 위해 설치되는 패키지들은 다음과 같다.

  • kubeadm: 클러스터를 부트스트랩하는 명령이다.
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
  • kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.
# 필요한 패키지 설치
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl

# GPG KEY 등록
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# Repository 등록
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# kubeadm, kubelet, kubectl 설치
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# 다음에 있을 kubeadm init 을 하지않으면 kubelet에 대한 오류가 뜨는건 정상이다.
mswoo@k8s-master:~$ sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: activating (auto-restart) (Result: exit-code) since Wed 2022-03-23 16:18:44 KST; 2s ago
     Docs: https://kubernetes.io/docs/home/
  Process: 1652 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=1/FAILURE)
 Main PID: 1652 (code=exited, status=1/FAILURE)

 3월 23 16:18:44 k8s-master systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE
 3월 23 16:18:44 k8s-master systemd[1]: kubelet.service: Failed with result 'exit-code'.

여기까지는 Master와 일반 Node까지 동일하다.

6. Kubeadm Cluster 설정

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#considerations-about-apiserver-advertise-address-and-controlplaneendpoint

이제 여기서부터 Master와 Node에서 하는 행위가 다르다.

kubeadm init 명령어로 클러스터를 초기화 하는데 다음과 같은 옵션을 사용하여 추가 설정을한다

--apiserver-advertise-address [IP]
마스터 노드의 ip 를 입력하여 Worker 노드에서 접근하도록 한다.

--pod-network-cidr [IP]
컨테이너의 네트워크 대역 다른 네트워크와 중복되지 않도록 설정

여기서 192.168.0.0/16 한 이유는 뒤에 이어나올 CNI 중 Calico의 default 기 떄문

# Master Node 에서만
# kubeadm 설정 명령어 실행
sudo kubeadm init --apiserver-advertise-address 172.16.0.25 --pod-network-cidr 192.168.0.0/16

# 실행 하게되면 출력문이 쫘악 나올텐데 Master Node에서 해당 명령어 실행
# 해당 명령어는 root 가 아닌 사용자도 kubectl할때 sudo 없이 사용 가능하도록 함
# 출력문 중간에 작성되어있음 
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Worker Node 에서만
#마지막 출력문으로 최초의 Token 이 생성되어 Worker Node에 복붙하여 Worker Node로 인식이 가능하도록 한다.
sudo kubeadm join 172.16.0.25:6443 --token 5n9id6.d8id45yc2tfowmub \
        --discovery-token-ca-cert-hash sha256:c62311cd53c5fc2ba6a6e6048c4d90d60fc73f2583c24254f7c5d11f40d7355c

# 해당 토큰에 대해 검색해보니
# kubeadm token list 
# 확인가능 하며 24시간만 사용가능하다.
# 추후 토큰생성하여 노드 늘리는 것 또한 포스팅 예정

# Master Node
# Master Node에서 제대로 인식하고 있는지 확인해보자
kubectl get nodes
mswoo@k8s-master:~$ kubectl get nodes
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   6m4s    v1.23.5
k8s-node-1   NotReady   <none>                 4m7s    v1.23.5
k8s-node-2   NotReady   <none>                 3m46s   v1.23.5
k8s-node-3   NotReady   <none>                 3m45s   v1.23.5

NotReady 가 나오는 이유는 아직 CNI 설치를 않았기 때문

바로 아래 이어서 진행 후 다시한번 확인해보자

7. 컨테이너 네트워크 애드온 설치(CNI)

K8s 간의 통신을 위해서는 Container Network Interface 라고 하는 것이 필요하다.

다양한 CNI의 3rd-Party 가 있지만 대표적으로 유명한 Calico를 설치하려고한다.

https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises

그전에 Calico 요구사항 확인해보면 아래와 같은 Port 가 오픈 되어야한다.

https://projectcalico.docs.tigera.io/getting-started/kubernetes/requirements

Configuration Host(s) Connection type Port/protocol
Calico networking (BGP) All Bidirectional TCP 179
Calico networking with IP-in-IP enabled (default) All Bidirectional IP-in-IP, often represented by its protocol number 4
Calico networking with VXLAN enabled All Bidirectional UDP 4789
Calico networking with Typha enabled Typha agent hosts Incoming TCP 5473 (default)
flannel networking (VXLAN) All Bidirectional UDP 4789
All kube-apiserver host Incoming Often TCP 443 or 6443*
etcd datastore etcd hosts Incoming Officially TCP 2379 but can vary

이제 설치를 진행해보자.

# Master Node에서만 진행합니다.
# 설치에 사용할 yaml 파일 다운로드
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

# 혹시나 kubeadm init 했을때 --pod-network-cidr 192.168.0.0/16
# 부분에서 192.168.0.0/16을 하지않고 다른것을 기입 했을 시 아래 명령어 진행
# 예로 들어 10.10.0.0/16 일때
sed -i -e 's?192.168.0.0/16?10.10.0.0/16?g' calico.yaml
############################################################

# yaml 실행
kubectl apply -f calico.yaml

# 확인
kubectl get pods --namespace kube-system

mswoo@k8s-master:~$ kubectl get pods -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-56fcbf9d6b-qjskp   1/1     Running   0          15m
calico-node-5x59c                          1/1     Running   0          15m
calico-node-n6vwl                          1/1     Running   0          15m
calico-node-sl92x                          1/1     Running   0          15m
calico-node-zwp7v                          1/1     Running   0          15m
coredns-64897985d-5mfbn                    1/1     Running   0          54m
coredns-64897985d-smt2b                    1/1     Running   0          54m
etcd-k8s-master                            1/1     Running   1          54m
kube-apiserver-k8s-master                  1/1     Running   1          54m
kube-controller-manager-k8s-master         1/1     Running   1          54m
kube-proxy-ld8sd                           1/1     Running   0          52m
kube-proxy-qgjt2                           1/1     Running   0          54m
kube-proxy-v8px5                           1/1     Running   0          52m
kube-proxy-xbhrh                           1/1     Running   0          52m
kube-scheduler-k8s-master                  1/1     Running   1          54m

# 그리고 설치를 완료 후 아까 NotReady 나온 것도 확인
mswoo@k8s-master:~$ kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k8s-master   Ready    control-plane,master   59m   v1.23.5
k8s-node-1   Ready    <none>                 57m   v1.23.5
k8s-node-2   Ready    <none>                 56m   v1.23.5
k8s-node-3   Ready    <none>                 56m   v1.23.5


(부록)

perl: warning: Please check that your locale settings

https://int-i.github.io/linux/2021-08-15/linux-locale-timezone/

locale 명령어를 통해 확인하였더니 LANGUAGE= 부분이 비여있기에 발생

또한 locale -a 명령어를 통해서도 ko_kr 팩이 없기에 설치가 필요함

mswoo@k8s-master:~$ locale                                                                                                                                                
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_PAPER="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"
LC_ALL=ko_KR.UTF-8

mswoo@k8s-master:~$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX

해결방법

sudo apt update
sudo apt install -y locales
sudo localedef -f UTF-8 -i ko_KR ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8

# 윗 방식만 사용할시 변수가 변할 수도 있기에 변수 고정을 위한 작업은 아래와 같다.
sudo vi /etc/bash.bashrc
#파일안에 변수 작성
export LC_ALL=ko_KR.UTF-8
반응형