마짱짱의 지식창고
[k8s] docker, kubeadm, Calico 설치 본문
(수정)
해당 방법은 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 설정
이제 여기서부터 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
'Kubernetes' 카테고리의 다른 글
[Prometheus] helm을 이용한 설치 (0) | 2023.01.04 |
---|---|
[k9s] kubernetes 관리 tool 설치 (1) | 2023.01.04 |
[K8s] drain, cordon, taint 비교 (0) | 2021.03.25 |
Ubuntu 18.04 Kubeadm & Calico 구성하기 (0) | 2021.03.12 |
Ubuntu 18.04 Docker install (도커 설치하기) (0) | 2021.02.22 |