마짱짱의 지식창고
[k8s] docker, kubeadm, Calico 설치 본문
(수정)
해당 방법은 k8s 1.24 이전 버전만 가능 합니다.
k8s 1.24버전부터 Dokershim을 지원하지 않기에 해당 방법으로는 불가능합니다.
시간 여유있을때 1.24 이후 containerd 방법으로 공유드리도록 하겠습니다.
---
https://majjangjjang.tistory.com/215#google_vignette
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 |