상태(State) 관리 : 설정한 Pod 개수 보장,Pod의 livenessProbe(컨테이너가 동작 중인지 여부를 나타낸다. 만약 활성 프로브에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는재시작 정책의 대상이 된다.)
부하 조정(Scheduling)으로 배포 관리 : Pod 배포 시 부하 정도가 가장 적절한 node 선정하여 배포
배포 버전 관리 : Rolling Update (Deployment로 새로운 버전의 App을 이전 버전을 유지한 채 업데이트 진행) + Roll Back (문제 발생 시 이전 버전으로)
Service Discovery (Pod 집합에서 실행중인 Application을네트워크 서비스로 노출하여 Cluster 외부에 있는 User가 Application을 이용하도록 네트워크 경로를 제공하는 것) (K8S는 Pod에게 고유한 IP주소 부여, Pod 집합에 대한 단일 DNS명을 부여.이들간의 로드-밸런싱 수행)
Volume Storage (각 node 별 다양한 storage 제공) (Volume : Pod에 종속되는 디스크. 해당 Pod에 속해 있는 여러 개의 Container가 공유해서 사용)
Kubernetes는 서비스 관리를 개별적이 아닌 집단적으로 관리한다
따라서 대부분의 상황에서 개별 시스템(node)와 상호작용할 필요는 없다
→ 비교적 Stateless(관계의 상태를 유지하지 않는 것) 업무에 적합하다 (stateless 예시 : UDP 프로토콜)
개발 배경
Container는 stateless, immutable, mortal (상태를 가지고 있지 않고, 변화하지 않으며, 언제든 죽을 수 있는)개념을 기반으로 아키텍처를 구성하다 보면 운영에 앞서 반드시 필요한 것이 Container Orchestration(=Kubernetes)이
Container Orchestration은 다수의 Container를 다수의 node(Cluster)에 적절하게 분산 실행하고, 원하는 상태(Desired State)로 실행상태를 유지해 주고, 다운타임 없이 유동적으로 스케일을 확장/축소(Scale)할 수 있게 도와준다
사용자가 Container에 대한 동작과 다른 Container와의 관계를 정의하면 배포/운영/스케일링에 문제가 없도록 자동으로 관리되는 운영 시스템이라고 할 수 있다
Kubernetes 종류
관리형 Kubernetes : Amazon EKS, Azure AKS, Google GKE
설치형 Kubernetes : RANCHER, RedHat OPENSHIFT
직접 구성형 Kubernetes : Kubeadm, Kubespray, Kops, Krib
Kubernetes 설치
설치 구성도
(아래 내용은 master, node1, node2, node3 모두에게 적용)
실행 환경 : centos7-x86_64
1. /etc/hosts 파일 수정
/etc/hosts
각 PC의 IP 작성 후 scp 로 node1,2,3에 복사 - scp /etc/hosts node1:/etc/hosts
2. SWAP 기능 끄기 - swapoff -a - vi /etc/fstab (마지막 부분인 swap 부분 주석처리) - reboot
6. docker 설치 및 시작 - curl -sSL http://get.docker.com | bash - systemctl start docker && systemctl enable docker - docker info | grep -i cgroup (이 명령어 입력 시 Cgroup Driver : cgroupfs라고 나타난다. Kubernetes는 docker의 cgroup을 systemd를 사용하기 때문에 이를 systemd로 변경해주어야 한다)
7. docker cgroup driver를 systemd로 변경 - vi /usr/lib/systemd/system/docker.service (ExecStart=/usr/bin/dockerd 바로 뒤에 --exec-opt native.cgroupdriver=systemd를 삽입) - systemctl daemon-reload (## 모든unit file을reload) - systemctl restart docker - docker info | grep -i cgroup(## systemd로 변경됨)
9. K8S Clustering 구성(Master에서만 작업) #특정한 이전 버전(1.21.1)의 K8S Clustering 구성 - kubeadm init --kubernetes-version=v1.21.1 이때, 설치 결과를 복사하여 다른 곳에 꼭 저장해놓는다. ----------------------------------------------------------------------------
설치 결과 Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
10. Kubernetes 버전 정보 확인 - Master에서 - kubectl version --short - kubeadm version -o yaml - kubelet --version
레파지토리 버전 정보
Namespace 확인 - kubectl get namespaces
- kubectl get namespace
- kubectl get ns
11. Cluster 구성정보(ConfigMap) 확인하기 - Master에서 - kubectl get configmap -n kube-system - kubectl get cm kubeadm-config -n kube-system - kubectl get cm kubeadm-config -n kube-system -o yaml - kubeadm config view
12. Clustering 상태 및 Pod 상태 확인하기 - Master에서 - kubectl get node (## master가 NotReady 상태) - kubectl get pod --all-namespaces (## 모든 pod 확인) - kubectl get pod -A (## 모든 pod 확인)
-->> cluster 상태가 Not Ready이고 coredns 상태가 Pending이다.
이 상태에선 각 Node들에서 실행중인 Pod들간에 통신이 안된다 -->>Pod Network를 생성하여 이 문제를 해결할 수 있다
13. Pod Network 구성하기 - Master에서만 작업 (weave-net 설치) - export kubever=$(kubectl version | base64 | tr -d '\n') - kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
- kubectl get pod -A (## coredns가 이제는 running) 30초 정도 기다린 후 - kubectl get pods -A
weave - net - xxxxx 이라는 Pod 이 master 에 설치됨
- kubectl get nodes (## master가 Ready 상태가 됨)
(node1,2,3에서) kubeadm join 10.0.2.15:6443 --token h1a03j.qe1qctd831cfijxa \ --discovery-token-ca-cert-hash sha256:538ab8cea29bab9814f850a87450008bf8ee7efcf3706e562bbc6ce5bb08cf74 입력 후
(master) - kubectl get nodes (## master 말고 node1,2,3도 Ready 상태가 됐음을 알 수 있다)