Master 1대, Worker2대 기반으로 k8s clustering 진행
1. Kubernetes 구성 요소 버전
- CRI : Docker
- Docker version: v20.10.22
- Containerd version : v2.0
- CNI : Calico v0.3.1
- Kubectl: v1.26.0
2. Virtal Machine 정보
- AWS: t3.medium
- Virtual Machine OS: Ubuntu 20.04 (해당 가이드는 Ubuntu 22 버전에서 오동작)
- TCP 개방 요구사항
- 22, 80 : ssh, http 기본 port
- 443, 6443, 2379 : k8s apiserver, etcd 활용 port
- 179, 5473 : Calico 활용 port
- UDP 개방 요구사항
- 51820, 51821, 4789 : 개방
- CNI(Calico Network) 필요 Port 정보 링크
- Network requirements 항목 확인
3. Master, Worker 모두 적용해야하는 명령어
아래 명령어들은 k8s clustering을 하기 위한 설정들로 k8s node로 활용하고자 하는 모든 VM에 적용 필요
CRI(docker & containerd) 및 kubeadm, kubelet, kubectl 설치 진행 (관리자 권한으로 수행, sudo su)
Machine 정보 확인 : ubuntu 이미지 버전 확인
hostnamectl
Machine hostname 변경 : master worker1 worker2
hostnamectl set-hostname master
reboot
ssh 재접속 후, Machine hostname 변경 : hostname 변경 확인
hostnamectl
Swap 메모리 비활성화
swapoff -a && sed -i '/swap/s/&/#/' /etc/fstab
방화벽 비활성화
ufw disable
k8s 설치에 필요한 패키지 파일들 설치
apt-get install -y apt-transport-https ca-certificates gnupg lsb-release curl
Docker 엔진 관련 패키지 서버 정보 다운로드
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /u
sr/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/ubuntu $(lsb_release -cs) s
table" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
패키지 서버 업데이트
apt-get update
Docker 관련 패키지 파일 다운로드
apt-get install -y docker-ce docker-ce-cli containerd.io
Docker daemon 설정 파일 수정
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
Machine이 구동될때 Docker도 자동실행 되도록 설정
systemctl enable docker
Docker 실행
systemctl start docker
Docker containerd를 cni로 활용하기 위해 설정 파일 수정
/etc/containerd/config.toml 파일의 disabled_plugins행 주석 처리
(vi /etc/containerd/config.toml을 수행하여 아래 명령어 수행 전 과 후 변화 확인)
sed -i -e '/disabled_plugins/ s/^/#/' /etc/containerd/config.toml
수정한 파일 적용을 위해 containerd 재시작
systemctl restart containerd
k8s 네트워크 테이블 설정
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
설정적용
sysctl --system
k8s 설치 도구 패키지 서버 정보 다운로드
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cl
oud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://a
pt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kuber
netes.list
패키지 서버 업데이트
apt-get update
k8s 관련 패키지 파일들 다운로드
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
k8s 관련 패키지 파일들 버전 Lock
apt-mark hold kubelet kubeadm kubectl kubernetes-cni
k8s 동작에 필요한 바이너리 구동
systemctl daemon-reload
systemctl restart kubelet
4. Master 적용 명령어
kubeadm을 통하여 master component 설정 (자동으로 됩니다.)
- /etc/kubernetes/manifast에 yaml 파일 다운로드 후 필수 pod 구동
- etcd, kube-apiserver, kube-controller-manager, kube-schedule
- TLS 관련 설정 및 admin.conf파일 생성 (kubeconfig)
- Pod Network 설정
ls /etc/kubernetes/manifests을 수행하여 아래 명령어 수행 전 과 필수 pod 유무 확인
kubeadm init --pod-network-cidr=10.0.1.0/24
참고 : 10.0.1.0/24 (사용할 내부 주소 직접 입력)
설치 완료 후 kubeadm join {ip}:6443 --token {token} --discovery-token-ca-cert-hash {hash} 문구 복사 및 별도로 저장
(워커 노드에 해당 명령어를 수행함으로서 worker를 master에 join 시킴. 5.Worker 적용 명령어 참고!!!!!)
Master Component의 kubectl 설정
k8s apiserver주소 정보 및 인증서가 담긴 파일을 일반적으로 "kubeconfig"라고 부름
kubeconfig파일은 kubeadm init명령어 수행할 때 /etc/kubernetes/admin.conf로 생성
kubectl은 kubeconfig 파일을 읽어서 apiserver와 통신
아래 명령어를 수행하보면 현재 kubectl이 바라보고 있는 kubeconfig가 설정이 안된걸 알 수 있음
kubectl config view
kubectl get nodes
kubectl이 kubeconfig 파일을 바라보도록 설정 2가지 방법이 있다.
(1) kubectl의 kubeconfig 설정 1번째 방법
- $HOME/.kube 디렉토리 생성 후, kubeconfig 파일을 "config"라는 이름으로 저장
- kubectl은 default로 $HOME/.kube/config 파일을 읽도록 되어있다.
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
(2) kubectl의 kubeconfig 설정 2번째 방법
- KUBECONFIG 환경 변수 지정
- kubectl은 KUBECONFIG 환경 변수를 읽어서 파일을 가져오도록 되어있음
export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl이 kubeconfig 파일을 읽었는지 확인
kubectl config view
kubectl 으로 k8s api server에게 node 정보 요청, 응답 결과 확인
Not Ready 상태의 Master node 확인
kubectl get nodes
만약 x509 에러(인증서 에러)가 발생했다면, kubectl이 (구)kubeconfig를 읽어들인것
위 설정 1번째 또는 2번째를 다시 수행(새로운 kubeconfig 적용)
5. Worker 적용 명령어
Master에서 kubeadmin init 수행한 후 복사한 join 명령어를 각 worker에서 실행
kubeadm join {ip}:6443 --token {token} --discovery-token-ca-cert-hash {hash}
6. Master 적용 명령어
위 과정까지 모두 완료하였다면 kubernetes master, worker clustering은 성공
kubectl로 k8s api server에게 node 정보 요청, 응답 결과 확인
Not Ready 상태의 Master, Worker node 확인
kubectl get nodes
k8s CNI calico 설정 파일 다운로드
curl -O https://projectcalico.docs.tigera.io/manifests/calico.yaml
다운받은 calico.yaml의 pod network 부분 수정
위에서 실행한 master에서 kubeadm init --pod-network-cidr={ip/subnet} 설정한 {ip/subnet}으로 변경
sed -i -e 's?192.168.0.0/16? 10.0.1.0/24?g' calico.yaml
calico.yaml적용
kubectl apply -f calico.yaml
k8s core-dns pod 동작 확인
kubectl get pod --namespace kube-system
8. k8s Master, Worker 정상 설치 확인
kubectl을 통해 Master, Worker 노드 현황 및 상태 확인
kubectl get nodes
Master, Worker 모두 목록에 Ready 상태로 동작하는것 확인
nginx 예제 파일 배포하여 테스트
vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f pod.yaml
nginx pod 로그 출력 확인
kubeclt logs nginx
만약 먹통일 경우 CNI 설정이 잘못되었을 확률이 크다.
- CNI 네트워크 설정을 잘못하여 배포한 경우 체크리스트
- master에서 "kubeadm init --pod-network-cidr={ip/subnet}" 설정한 {ip/subnet}과 calico.yaml "sed -i -e 's?192.168.0.0/16? {ip/subnet}?g' calico.yaml이 불일치
- VM의 Calico 기본 TCP/UDP 개방 X