본문 바로가기

Kubernetes 학습/Kubernetes 학습과정21

21. Storage - NFS(FileStorage), Longhorn(BlockStorage) & Logging - PLG Stack 1. PV Volume Plugin PV는 기본 속성 중 capacity라는 용량을 설정하는 부분과 accessMode를 지정하는 부분이 있고, Volume Plugin이라고 해서 이 PV의 실질을 결정하는 옵션이 있습니다. 1) hostPath : 이 PV를 hostPath로 만들면 워커 노드에 지정된 /path를 이 PV에 대한 볼륨으로 사용하겠다는 것 입니다. 2) NFS : 웹 스토리지에 NFS 서버가 고정되어 있다면 PV의 Volume Plugin을 NFS로 지정하게 되면 이 PV는 외부에 있는 NFS와 연결할 수 있는 NFS 클라이언트의 역할을 하게 됩니다. OS에 NFS 클라이언트가 설치되어 있어야 합니다. 3) Cloud Service Volume : Azuer, GCP, AWS 등 클라우.. 2024. 1. 30.
20. Networking - Pod / Service Network(Calico), Pause Container 1. 먼저 Master, Worker 노드들이 있고, Pod Network에 대한 영역이 있습니다. 처음 클러스터 설치 시 pod-network-cidr로 이 네트워크 대역에 대한 영역을 설정했던 부분입니다. Pod Network에 대해 알아볼 영역은 Pod내에 컨테이너로 가는 네트워킹을 하는 부분입니다. Pod가 생성되면 Pod Network 범위 내에서 고유 IP를 가지고 있는 인터페이스가 생기는데 이것을 통해서 어떻게 여러 컨테이너들 간에 통신이 되는지 알아보겠습니다. 그리고 또 다른 Pod가 생성되었을 때 이 두 Pod간의 통신은 k8s에서 Node마다 설치가 되는 Network Plugin에 의해 통신이 됩니다. k8s에서 기본적으로 제공하는 큐브넷이라는 네트워크 플러그인이 있는데 이건 네트워크.. 2024. 1. 26.
19. Component : kube - apiserver, etcd, kube - schedule, kube - proxy, kube-controller-manager k8s는 한 대의 Master, Workers 노드들로 구성이 되는데, Master에는 Control plane Component라고 k8s 주요 기능들을 담당하는 컴포넌트들이 있고, Worker Node Component라고 해서 컨테이너를 관리하기 위한 기능들이 있습니다. [ Pod 생성 예제 ] 먼저 Master 노드에는 위와 같이 Etcd, kube-scheduler, kube-apiserver가 있는데 일반적인 설치를 했을 때 이 컴포넌트들은 Pod의 형태로 띄워져서 구동 중인 상태입니다. k8s가 기동시에 /etc/kubernetes/manifests 있는 위 3개의 .yaml 파일을 읽어서 이 Pod들을 static으로 띄웁니다. Worker 노드에는 kubelet, Container Run.. 2024. 1. 26.
18. Autoscaler k8s의 Autoscaler에는 3가지가 있습니다. Pod의 개수를 늘리는 HPA, Pod의 리소스를 증가시키는 VPA, 클러스터에 노드를 추가하는 CA가 있는데 각각의 개념과 동작 방식을 확인해보겠습니다. 1. HPA, VPA, CA 1. HPA (Horizontal Pod Autoscaler) : 컨트롤러가 있고, Replicas 수치에 따라 Pod가 만들어져서 운영이 되고 있는 상태입니다. 서비스도 연결이 돼서 모든 트래픽이 해당 Pod로 흐르는 상황입니다. 트래픽이 많아져서 Pod 내에 있는 리소스를 모두 사용하게 됐고, 조금 더 트래픽이 증가되면 Pod는 죽을 수 있습니다. 만약 사전에 HPA 만들어서 Controller에 연결을 해놓았다면 HPA가 Pod의 리소스 상태를 감지하고 있다가 위험한.. 2024. 1. 22.
17. Ingress 1. Ingress 사용 목적 Ingress 사용 목적으로 대표적인 Service LoadBalancing, Canary Upgrade가 있습니다. Service LoadBalancing은 만약 쇼핑몰을 운영 중이라고 가정했을 때 쇼핑페이지와 고객센터, 주문 서비스를 Pod별로 각각 만듭니다. 이렇게 애플리케이션을 나누면 독립적이기 때문에 하나 장애가 생기더라도 다른 서비스는 영향이 없습니다. 또한 외부에서 연결할 수 있도록 각각 서비스를 달아주고, 사용자들로 하여금 쇼핑페이지에 접근하기 위해서는 www.mall.com 도메인 이름으로 고객센터에 접근하려면 /customer, 주문 서비스로 접근하려면 /order 붙여서 접근하도록 하고 싶을 때 일반적으로는 각각의 Path에 따라 각 서비스 IP를 이어줄.. 2024. 1. 22.
16. StatefulSet 어플리케이션 종류에는 Stateless Application, Stateful Application 있습니다. Stateless 대표적으로 웹 서버입니다. Stateful 대표적으로 데이터베이스입니다. Stateless는 앱이 여러개 배포되더라도 다 똑같은 서비스의 역할을 합니다. Stateful은 각각의 앱마다 자신의 역할이 있습니다. 몽고 DB 경우를 보면 하나는 Primary 역할, 또 하나는 Secondary, 그리고 Arbiter 역할이 있습니다. Primary는 Main DB이고, 이가 죽으면 Arbiter가 이것을 감지해서 Secondary가 대신 역할을 할 수 있도록 변경해줍니다. 1. 단순 복제인 Stateless 앱과 달리 Stateful 앱은 각 앱마다 본인의 고유 역할을 가지고 있습.. 2024. 1. 22.
15. Authentication - X506 Certs, kubectl, Service Account / Authorization - RBAC, Role, RoleBinding Authentication 1. X506 Client Certs 먼저 클러스터에 6443 포트로 API 서버가 열려있습니다. 사용자가 https로 접근하려면 k8s 설치시 kubeconfig 라고 해서 이 클러스터에 접근할 수 있는 정보들이 들어있는 파일이 있는데 위처럼 인증서 내용이 있습니다. 여기서 Client Key, crt 복사해서 가져오면 됩니다. 최초에 발급 기간과 클라이언트에 대한 개인 키를 만들고, 이 개인 키를 가지고 인증서를 만들기 위한 각각의 인증 요청서라는 csr 파일을 만듭니다. 이 CA 경우 인증 요청서를 가지고 바로 인증서를 만드는데 kubeconfig에 있는 CA crt 가 이것입니다. 클라이언트 인증서의 경우 발급기간 개인키와 인증서 그리고 클라이언트 요청서를 모두 합쳐서 .. 2024. 1. 17.
14. Volume - Dynamic Provisioning, StorageClass, Status, ReclaimPolicy / Accessing API - Overview 1. Dynamic Provisioning Volume은 데이터를 안정적으로 유지하기 위해 사용합니다. 실제 데이터는 k8s 클러스터와 분리돼서 관리됩니다. 이런 방식으로 관리할 수 있는 종류가 많은데 크게 내부망에서 관리하는 경우 외부망에서 관리하는 경우로 나눌 수 있습니다. 외부망으로는 aws, gcp, microsoft Azure 같은 cloud storage를 두고 여기에 본인의 k8s와 연결해서 사용할 수 있습니다. 내부망에는 이 k8s를 구성하는 노드들이 있는데, k8s에는 노드들의 실제 물리적인 공간에 데이터를 만들 수 있는 hostPath, local Volume이 있고, 별도의 On-premise solution들을 이 노드들에 설치할 수 있습니다. 이 솔루션들이 알아서 노드의 자원을 이.. 2024. 1. 17.
13. Basic Object - Service 사용자의 접근 경우 Service가 만들어진 후에 IP를 확인하고, 이 IP로 접근을 하면 되는데(10.111.41.1) Pod의 경우 이 자원들이 동시에 배포가 될 수 있습니다. Pod A가 Pod B에 접근을 해야하는 상황인데 Pod A에 IP를 넣기에는 Pod나 Service가 동적으로 할당되기 때문에 미리 알기에는 제약이 있습니다. Pod B의 경우 문제가 생겨 죽으면 자동으로 재생성되면서 IP가 변경되기 때문에 Pod A가 IP를 알더라도 계속 쓸 수 없습니다. 이런 문제를 해결하기 위해 DNS, Headless 서비스가 필요합니다. Pod가 외부 특정 사이트에 접근해서 데이터를 가져오는 상황에서 접근 주소를 변경해야 되는 상황이 생기면 경로를 변경해주기 위해 Pod를 수정하고 재배포해야 될까요.. 2024. 1. 16.
12. QoS classes (Guaranteed, Burstable, BestEffort) & Node Scheduling QoS class 위 Qos는 노드에 이렇게 리소스가 있다고 가정하고, 이 노드 위에 Pod가 3개 만들어져서 자원을 모두 사용하고 있는 상태라고 가정합니다. 이 상태에서 Pod1이 추가적으로 자원이 필요할 때 노드에는 추가적으로 할당받을 수 있는 자원이 없기 때문에, 선택을 해야합니다. k8s는 앱의 중요도에 따라 이런 것을 관리할 수 있도록 3가지 단계로 Quality of Service를 지원해주고 있습니다. 현재 위 상태에서는 1. Best Effort가 부여된 Pod가 가장 먼저 다운이 돼서 자원이 반환됩니다. Pod1은 필요한 자원을 추가로 얻게 됩니다. 다음엔 어느 정도 노드에 자원이 남아있지만, Pod2에서 그보다 많은 자원을 요구하는 상황이 됐다면, 2. Burstable이 적용된 Pod.. 2024. 1. 12.
11. Pod - Lifecycle & (ReadinessProbe, LivenessProbe) Lifecycle Pod는 해당 라이프사이클 단계에 따라 주요 행동들이 있습니다. status 안에 Phase라고 해서 Pod의 전체 상태를 대표하는 속성이 있습니다. 그리고 Pod가 생성되면서 실행하는 단계들이 있는데 그 단계와 상태를 알려주는 것이 Conditions라는 특성입니다. 또한 컨테이너마다도 State라고 해서 각각의 컨테이너를 대표하는 상태가 있습니다. 먼저 Pod를 대표하는 Phase 종류는 아래와 같습니다. (1) Pending, (2) Running (3) Succeeded, (4) Failed, (5) Unknown Conditions는 4종류가 있고, Reason이라고 해서 Condition의 세부 내용을 알려주는 항목이 있습니다. (1) Initizlized, (2) Conta.. 2024. 1. 12.
10. Controller - DaemonSet, Job, CronJob 노드들이 있고, 각각의 노드에 자원이 다르게 남아있는 상태에서 이전에 배운 ReplicaSet의 경우 Pod를 스케줄러에 의존해서 노드에 배치를 할 때 만약 노드1에 자원이 많이 남아 있는 상태면 위처럼 배치를 많이 할거고, 자원이 별로 없다면 Pod를 배치 안할 수 있습니다. DaemonSet : 노드의 자원 상태와 상관없이 모든 노드에 Pod가 하나씩 생긴다는 특징이 있습니다. 이렇게 사용되는 서비스로 대표적인 1. 성능 수집인데 각 노드들의 성능상태는 모두 감시 대상이죠. 그래서 모니터링 화면이 있을거고, 각각의 노드에 프로메테우스 같은 수집 에이전트가 깔여 있어야 모든 노드들의 정보들을 모니터링 시스템에 전달해 줄 수가 있습니다. 2. 로그 수집인데, 특정 노드에 문제가 파악했다면 로그를 확인해야.. 2024. 1. 10.
9. Controller - Deployment & 실습 Deployment는 현재 한 서비스가 운영 중인데 이 서비스를 업데이트 해야 돼서 재배포를 해야 할 때 도움 주는 컨트롤러 입니다. 크게 아래와 같이 4가지 방식이 있습니다. ReCreate : Deployment를 만들면 이렇게 v1의 파드가 생성됩니다. 그리고 Pod 하나당 위와 같이 하나씩 자원이 사용된다고 가정하겠습니다. Deployment는 먼저 Pod 모두 삭제합니다. 그렇게 되면 서비스에 대한 다운타임이 발생하고, 자원 사용량도 없어지게 됩니다. 그 후 v2에 대한 Pod 2개를 만들어 줍니다. 단점은 다운타임이 발생해서 일시적인 정지가 가능한 서비스인 경우에만 가능한 방법입니다. Rolling Update : 원래의 상태에서 업그레이드 할 때 Deployment는 먼저 v2의 Pod를 하.. 2024. 1. 10.
8. Replication Controller, ReplicaSet - Template, Replicas, Selector & 실습 컨트롤러는 서비스를 관리하고 운영하는데 크게 아래 4가지 기능으로 도움을 줍니다. Auto Healing : 노드 위에 파드가 있는데, 파드가 다운되거나 파드가 스케줄링이 되어 있는 노드가 다운되면 파드에서 돌아가던 서비스가 장애가 옵니다. 하지만 컨트롤러는 이것을 즉각 인지하고 파드를 다른 노드에 새로 만들어줍니다. Software Update : 여러 파드에 대한 버전을 업그레이트 해야 될 경우 컨트롤러를 통해 한번에 쉽게 할 수 있고, 업그레이드 도중 문제가 생기면 롤백을 할 수 있게 해줍니다. Auto Scaling : 파드의 리소스가 리미트 상태가 되었을 때 컨트롤러는 이 상태를 파악하고 파드를 하나 더 만들어 줌으로써 부하를 분산시키고, 파드가 죽지 않도록 해주는데 그럼 이 서비스는 성능에 장.. 2024. 1. 10.
7. Namespace, ResourceQuota, LimitRange & 실습 개요 쿠버네티스 클러스터라 해서 전체가 사용할 수 있는 자원이 있습니다. 일반적으로 메모리, CPU가 있을거고, 클러스터 안에는 여러 네임스페이스들을 만들 수 있고, 네임 스페이스 안에는 여러 Pod를 만들 수 있습니다. 각 Pod는 클러스터 자원을 공유해서 사용하는데, 만약 한 네임스페이스 안에 있는 Pod가 클러스터에 남은 자원을 모두 사용하면 다른 Pod 입장에서는 더 이상 쓸 자원이 없어서 자원이 필요할 때 문제가 발생하게 됩니다. 이런 문제를 해결하기 위해 네임 스페이스마다 ResourceQuota를 달면 최대 한계를 지정할 수 있습니다. Pod가 한계를 넘을 수 없고, Pod 입장에서 자원이 부족해 문제가 될지언정 다른 네임 스페이스에 있는 Pod에는 영향을 끼치지 않게 해줍니다. 한 Pod가.. 2024. 1. 9.
6. ConfigMap, Secret & 실습 ConfigMap, Secret의 사용 시기에 대해 알아봐요. 만약 개발 환경과 상용 환경이 있습니다. A라는 서비스가 있는데 이 서비스는 일반 접근과 보안 접근이 가능합니다. 그래서 개발 환경에서는 이 보안 접근을 해제할 수 있는 옵션이 있습니다. 보안 접근을 한다면 접근 User와 Key를 세팅할 수 있습니다. 이처럼 설정하고 있는데, 상용 환경으로 배포를 해야한다면 이 값이 바뀌어야 합니다. 다시 보안 접속으로 설정을 해야하고, User와 Key값도 변경해야 합니다. 근데 이 값은 컨테이너 안에 있는 서비스 이미지에 들어있는 값이기 때문에 이 내용을 바꾼다는 것은 개발 환경과 상용 환경에 컨테이너 이미지를 각각 관리하겠다는 의미가 됩니다. 이미지를 별도로 관리한다는 것은 부담되는 일이에요. 그래서 .. 2024. 1. 8.
5. Volume - emptyDir, hostPath, PV/PVC & 실습 1. emptydir : 컨테이너들끼리 데이터를 공유하기 위해 볼륨을 사용하고, 최초 이 볼륨이 생성될 때 볼륨안에 내용이 비어 있기 떄문에 emptyDir이라고 명칭이 된 것입니다. 만약 컨테이너 1번이 웹 역할을 하는 서버, 컨테이너 2번이 백엔드단을 처리해주는 서버라면 이 웹서버로 받은 어떤 특정 파일을 마운트가 된 볼륨에 저장하고, 백엔드단에 있는 2번 컨테이너 역시 이 볼륨을 마운트 해놓으면 이 두 서버가 이 볼륨을 자신의 로컬에 있는 파일처럼 사용하기 때문에 두 서버가 파일을 주고 받을 필요없이 편하게 사용할 수 있습니다. 볼륨은 Pod안에 생성 되기 때문에, Pod 문제가 발생해서 재생성 되면 데이터가 모두 없어진다는 것을 의미합니다. 그래서 이 볼륨에 쓰이는 데이터는 꼭 일시적인 사용 목적.. 2024. 1. 8.
4. Service - Cluster IP, NodePort, LoadBalancer 1.Service : 기본적으로 자신의 Cluster IP를 가지고 있습니다. 그리고 이 서비스를 Pod에 연결시켜놓으면, 서비스의 IP를 통해서 Pod에 접근할 수 있습니다. 앞 글에서 Pod에서 똑같이 클러스터 내에서 접근할 수 있는 IP가 있었는데, 굳이 서비스를 사용하는 이유는 k8s에서 시스템 장애, 성능 장애 등 언제든지 죽을 수 있고, 그러면 다시 재생성되도록 설계되어 있는 오브젝트입니다. 파드의 IP는 재생성되면 변하기 때문에 Pod의 IP에 대한 신뢰성이 떨어집니다. 이 Service의 IP도 클러스터 내에 다른 모든 오브젝트들이 접근할 수 있지만 외부에서는 접근할 수 없습니다. Pod는 여러개 연결이 가능하고, 이렇게 여러개 연결 시켰을 때 서비스가 트래픽을 분산해서 Pod에 전달해줍니.. 2024. 1. 4.
3. Pod - Container, Label, NodeSchedule & 실습 Pod 특징을 보면 Pod 안에는 하나의 독립적인 서비스를 구동할 수 있는 컨테이너들이 있습니다. 컨테이너들은 서비스가 연결될 수 있도록 포트를 가지고 있는데 한 컨테이너가 하나 이상의 포트를 가질 수는 있지만, 한 Pod 내에서 컨테이너들끼리 포트가 중복될 수는 없습니다. 1) Container : 위 2개 컨테이너는 한 호스트로 묶여있다고 보면 되는데 Container1에서 2로 접근할 때 localhost:8080로 접근할 수 있습니다. 그리고 Pod가 생성될 때 고유의 IP가 자동으로 할당되는데 쿠버네티스 클러스터 내에서만 위 IP를 통해서 Pod에 접근할 수 있습니다. 외부에서는 접근이 불가합니다. 만약 Pod에 문제가 생기면 시스템이 스스로 감지해서 Pod를 삭제하고, 다시 재생성하는데 이때 .. 2024. 1. 3.
2. 쿠버네티스 클러스터 실습(Mac Intel) - 여러 오류를 만나며 저는 Mac Intel을 사용한 맥북을 사용하고 있습니다. 쿠버네티스 클러스터를 처음 접해보아서 엄청난 삽질, 실습을 진행하는 과정에서 mac m series로 잘못 따라가고, pw 접근 불가 등 여러 문제가 있었는데요.. 계속 꼬이고 안되었는데 애초에 m1을 위한 것이라 7시간을...허비 하루정도 깊게 파고 들어가보니 원하는 결과물을 얻어서 뿌듯했습니다!!! 혹시 실습해보시다가 안되는거 있으시면 답들 달아주세요!! 도움드릴 수 있다면 최대한 노력하겠습니다~ 1. XShell : [ 터미널로 Master, Wokred 노드에 접속이 가능해서 설치하지 않았습니다. ] 2. VirtualBox 설치 (VM 및 내부 네트워크 생성 툴) : VirtualBox (7.0.8 버전) 3. Vagrant 설치 및 k.. 2024. 1. 2.
1. 쿠버네티스 시작 [ Introduction ] 쿠버네티스를 큰 기업들이 꼭 써야하는 이유는 큰 기업들은 대규모의 서비스를 운영하고 있기 때문에 최대한 자원을 효율적으로 써야 비용적으로 유리하다. 서버 자원을 효율적으로 쓰기 위해서는 가상화기술에 대해 관심을 가질 수 밖에 없고, 쿠버네티스를 잘 이해하려면 가상화 기술들에 대한 히스토리를 알 필요가 있다. Linux에는 자원들이 격리해서 프로세스들이 독립적인 환경에서 돌아가게 해주는 기술들이 있었는데, 어려워서 대중적으로 잘 사용하지 않았다. 때문에 이후 VM 가상화 기술이 발전이 되었다. 하지만 하다보니 자동화는 되는거 같은데 생각보다 시스템 효율이 안나는 것을 느끼게 됩니다. 가장 큰 원인을 제공하는것이 VM 가상화를 하기 위해서 무거운 OS를 띄워야 한다는 근본적인 .. 2023. 12. 27.