이론
쿠버네티스(Kubernetes, k8s) = 컨테이너 오케스트레이션을 위한 오픈 소스 플랫폼이다.
CNCF(클라우드 네이티브 컴퓨팅 파운데이션)에서 공식적으로 인증된 컨테이너 오케스트레이션 표준이다.
Cloud Native = 클라우드 컴퓨팅을 고려한 환경.
쿠버네티스 로컬(On-premise) 클러스터 구성 (with docker)
CNI = Container Network Interface.
각 노드를 연결하고 각 리소스들의 네트워크를 처리할 플러그인이다.
(ex. 오버레이 네트워크 및 파드에 아이피 할당하는 역할)
칼리코, 플란넬, 위브넷 등…
쿠버네티스 구성
실습
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
# kubeadm으로 로컬 클러스터 구축 공식문서
https://kubernetes.io/docs/concepts/cluster-administration/addons/
# network add on(=CNI, Container Network Interface) 종류 및 설치 링크
<쿠버네티스 클러스터 v1.24, containerd>를 사용했다.
ubuntu 이미지, 4core, 4GB로 3개의 VM을 구성한다.
master 211.183.3.10
worker1 211.183.3.20
worker2 211.183.3.30
# 네트워크 설정
$ vi /etc/netplan/00-installer-config.yaml
$ netplan apply
$ ip a
# 호스트 이름 설정
# 각 VM에 설정
$ hostnamectl set-hostname master
$ hostnamectl set-hostname worker1
$ hostnamectl set-hostname worker2
# 반영
$ su
쿠버네티스 환경 설정
모든 노드에 아래와 같이 설정한다.
#업데이트
$ apt-get update
# 필요한 패키지 설치
$ apt-get install -y apt-transport-https ca-certificates curl gpg
# gpg키 등록
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# apt 레포지토리에 gpg키 등록
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 변경한 레포지토리로 다시 업데이트
$ apt-get update
# kubectl, kubeadm , kubelet 1.24버전으로 설치
# kubeadm : 클러스터를 구성하는데 사용되는 명령어 , kubelet : 각 노드를 관리하는 명령어
# kubectl : 쿠버네티스 클러스터에 명령(api요청) 도커로따지면 docker
$ apt -y install vim git curl wget kubelet=1.24.3-00 kubeadm=1.24.3-00 kubectl=1.24.3-00
# 스왑메모리 off
$ sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 스왑메모리 off
$ swapoff -a
# 오버레이 네트워크 구성을 위한 iptables 구성
$ modprobe overlay
$ modprobe br_netfilter
$ tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
$ sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
# 적용
$ sysctl --system
# containerd 설치를 위한 gpg키
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 레포지토리에 등록
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 업데이트
$ apt-get update
# containerd 설치
$ apt-get install -y containerd.io
# 폴더 생성
$ mkdir -p /etc/containerd
# 설정파일 생성
$ containerd config default>/etc/containerd/config.toml
# 재시작 및 enable
$ systemctl restart containerd
$ systemctl enable containerd
# kubelet 재시작 및 enable
$ systemctl restart kubelet
$ systemctl enable kubelet
마스터 노드 설정
# Master Node
# 버전 1.24.3으로 고정. 클러스터 구성에 필요한 컴포넌트들의 이미지 다운로드
$ kubeadm config images pull --cri-socket /run/containerd/containerd.sock --kubernetes-version v1.24.3
# --cri-socket : 컨테이너 런타임 인터페이스를 containerd로
# --kubernetes-version : 쿠버네티스 버전은 1.24로
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --kubernetes-version=v1.24.3 --ignore-preflight-errors=all --cri-socket /run/containerd/containerd.sock
# --pod-network-cidr : 나중에 CNI를 설치할때 맞춰줘야함. 애드온마다 대역이 다름. flannel은 10.244.0.0/16 , calico는 192.168.0.0/16 이런 대역을 사용하므로 맞춰줘야 한다.
# --ignore-preflight-errors=all : 모든(all) 에러 무시하겠다
# kubectl 명령 설치
# kubectl 명령을 요청할 config 파일 생성, 클러스터 구성할때마다 해줘야한다(덮어쓰기)
$ 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
# Master Node에서 kubeadm init 시 나오는 토큰을 사용한다.
# 아래는 하나의 예시이다.
$ kubeadm join 211.183.3.10:6443 --token plxnsx.yb72fhf7ujcmcdyc > --discovery-token-ca-cert-hash sha256:a9119b18133cf04601b0b3d2f3c601f53d56f3554498c7323ba2ea747f0672e5
CNI 설정
CNI(Container Network Interface, network add on)를 설치한다.
CNI는 각 노드를 연결하고 각 리소스들의 네트워크를 처리할 플러그인이다. (ex. 오버레이 네트워크 및 파드에 아이피 할당하는 역할)
칼리코, 플란넬, 위브넷 등이 있다.
# flannel 이라는 애드온 설치를 위한 매니페스트 파일을 wget으로 다운
$ wget https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
$ kubectl apply -f kube-flannel.yml
# nginx:latest 라는 이미지로 test라는 이름의 pod를 실행
$ kubectl run test --image=nginx:latest
# -o wide : wide 하게 출력(-o) 하겠다.
$ kubectl get pod -o wide
# 자세하게 정보를 확인
$ kubectl describe pod test
# pod 삭제
$ kubectl delete pod test
명령어로 상태 확인
Pod 띄우기
# nginx-pod.yml 파일 생성 후 수정
$ vi nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
# apiVersion: 쿠버네티스의 api버전, kind의 오브젝트에 따라 사용해야하는 버전이 달라질 수 있다.
# kind : 오브젝트(Pod, ReplicaSet과 같은 말 그대로 ‘대상’ or 컨트롤러)
# metadata: 오브젝트의 이름, 레이블
# spec: 나의 바람(desired)이 담겨있는 제원. 어떤걸 몇개 복제 할지 같은 것들.
# 적용
$ kubectl apply -f nginx-pod.yml
쿠버네티스 클러스터 reset 하는 방법
Reset
# Master Node
# cni 삭제
$ kubectl delete -f ~/kube-flannel.yml
# 리셋
$ kubeadm reset
# 남은 정보 삭제
$ rm /etc/cni/net.d/10-flannel.conflist
# 재부팅
$ reboot
# 재부팅후 cni 인터페이스가 날라간것을 확인
$ ip add
# 재부팅후에는 반드시 swapoff -a
$ swapoff -a
# Worker Node
# 리셋
$ kubeadm reset
재설정
# Master Node
$ cd ~
# 나중에 CNI를 설치할때 pod-network-cidr의 대역을 맞춰줘야 한다
$ kubeadm init --pod-network-cidr=10.244.0.0/16 --upload-certs --kubernetes-version=v1.24.3 --ignore-preflight-errors=all --cri-socket /run/containerd/containerd.sock
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# overwrite? y
$ chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl apply -f ~/kube-flannel.yml
# Worker Node
# 각 워커 노드에서 조인
Master Node가 아닌 곳에서 Node 띄우기
master노드가 아닌곳에서 kubectl apply 명령을 통해 http-t1 이라는 이름을 갖는 pod를 띄워본다.
이미지는 httpd:latest를 사용했다.
# Master Node
# ~/.kube/config
# 내가 요청할 api-server의 주소와 인증정보가 담겨있는 파일.
# 이 파일을 복사해서 worker노드에 폴더를 생성하고 복사해준다.
$ mkdir ~/.kube
$ vi ~/.kube/config
$ cat ~/.kube/config
# master의 config 파일을 워커노드에 복사한다. => ??
$ kubectl get pod
No resouces found in default namespace.
# 명령이 잘 들어가는 걸 볼 수 있다.
'🎆 Cloud Practice > 🧪 Docker, K8s, IaC' 카테고리의 다른 글
쿠버네티스의 Deployment, Namespace, Service에 대해 알아보자 (0) | 2023.11.21 |
---|