🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

블로그

일프로

[워밍업 클럽 4기-DevOps] 1주차 진행 회고 (코치 시점)

워밍업 클럽 Study(DevOps) - 스터디 준비DevOps 스터디 합류를 결정하고 제 목표는 스터디 완주률을 높이는 거였어요. 그래서 스터디 내에서 팀을 만들어 보자는 생각을 하게 됐네요.카페에 메뉴를 만들고, 팀을 모집해 보라는 샘플을 만들어 놨습니다.하지만 아무런 글도 올라오지 않았어요... 많이 부담스러웠나 봐요.그래서 제가 랜덤으로 팀을 구성해 드리기로 했습니다.다행이 총 59명께서 지원을 해주셨고, 14개의 팀이 만들어 졌습니다. 워밍업 클럽 Study(DevOps) - OT처음 해보는 온라인 미팅이라 많이 어색했습니다. "제 말 잘 들리세요?"를 몇 번이나 물어봤 던 것 같네요.쿠버네티스를 알아야 하는 이유와 저에 대한 자기소개를 했고.다음으로 이 스터디에서 러너분들께서 남겼으면 하는 것으로 제 스터디의 방향성을 설명 드렸습니다.그리고 한 달 동안 우리 스터디에서 진행 될 내용인데, 저도 워밍업 스터디를 설명 듣고 기본 완주 조건에 대해 이해하는 데 시간이 좀 걸렸습니다. 거기에 제가 추가적인 진행을 조금 더 추가했더니 복잡한 그림이 나오더군요. 큰 흐름만 잘 해하시고 자세한 방법은 그때그때 직접 해보는 게 가장 좋은 것 같습니다.한눈에 전체 일정을 알기 쉽게 전체 일정표 달력을 만들 었어요. 이것만 보면 정말 살인적인 스케줄 같네요^^ 하지만 직접 해보면 할 만은 합니다.ㅎㅎ마지막으로 내가 한 걸 하나씩 클리어 하는 기분을 느껴보시라고 개별 진도표도 만들어 배포 드렸어요.OT때 정신 없이 얘기하다 보니 시간이 50분이나 지났네요.그래도 준비했던 내용을 모두 설명 드리긴 했는데, 진행 속도가 빠르거나 혹은 모호한 부분이 있었는지 이번 주 동안 진행방식에 대한 질문을 많이 받았습니다^^ 다음 스터디 OT때는 질문 받았던 부분들을 좀 더 보완해서 말씀드려야 겠어요. 워밍업 클럽 Study(DevOps) - 1주차 진행열심히 공지를 작성했습니다.워밍업 스터디 완주 조건이 처음 봤을 땐 좀 복잡해 보일 수 있고, 제가 추가한 진행도 있으니 계속 공지를 드리며 해야할 내용들을 알려드렸네요. 그러면서 공지 정리 노하우도 조금씩 쌓여갔습니다.다행이 팀 구성은 원할하게 진행됐어요.진행 방식 : 랜덤으로 팀을 구성 -> 임시팀 생성 -> 팀원 확인 및 조율 -> 리더 선출 -> 팀명을 지은 후 등록모두들 잘 협조해주셔서 13팀 이나 만들어 졌습니다. 각 팀에는 최소 4명부터 최대 6명으로 구성되 있고, 이제 이렇게 팀으로 뭉쳤으니 함께 끝까지 완주 하시길 기대해 봐요.다들 번득이는 아이디어로 팀명을 지어 주셨는데, 재미있는 있는 에피소드들이 많았네요. 팀 이름 결정 이유를 보며 혼자 빵빵 터졌습니다^^사다리(리더를 사다리로 뽑아서), 13일의 금요일(팀 이름을 정하는 날이 13일이고 금요일이라), 쿠버넷 (팀원이 총 4명), 쿠버러너스(쿠버네티스+러너), SPG(시니어 파드 그룹), Opssible(Ops+Possible), Union(모두가 모여서), 쿠프로(팀명도 사다리로 결정) 등등..완주를 하려면 제출해야 하는 것들이 많아서, 나도 모르게 놓친 부분이 생길 수 있어요. 그래서 전체 체크 리스트를 만들어 봤고, 차 주 부터는 좀 더 세심하게 코칭을 해드릴 수 있을 것 같습니다. 저도 열심히 준비했지만 처음 진행하는 스터디라 부족함이 많습니다. 중간에 제 스스로가 만든 진행 방식에 착각을 하기도 했었는데, 모두 이해해주시고 잘 따라와 주셔서 정말 감사드려요. 남은 기간 동안 러너분들이 끝까지 완주할 수 있도록 최선을 다하겠습니다.워밍업 클럽 스터디-DevOps 화이팅!! - 일프로 드림 

데브옵스 · 인프라워밍업DevOps일프로쿠버네티스스터디데브옵스

일프로

[워밍업 클럽 4기-DevOps] 1차 중간점검 요약! (일프로 코치)

하프 지점 - 현재까지 완주율 (79%)마라톤 경기도 마찬가지지만 대부분의 대회에서 완주율에 대한 의미는 신청한 사람 기준이 아니라, 대회에 참여한 사람 기준입니다. 그 기준으로 하프 지점인 현재까지 완주율은 79% 이예요!처음 저희 DevOps 워밍업 클럽을 신청해 주신분은 168명 이였고, 여기서 스타트 인원을 잡은 기준을 말씀드리면, 먼저 팀 러너분들은 58명 입니다. 팀 편성 중간에 조정이 있긴 했지만, 일단 다 정리된 후에 인원이 58명 이예요.그리고 개인 러너는 20명으로 책정을 했는데, 사실 개인러너가 몇명으로 시작 했는지 제가 판단하기 힘듦니다. 그래서 처음에는 전체 발자국을 제출한 62명 중에 팀에서 제출한 56명을 빼서 6으로 계산해 봤는데, 발자국 제출은 스타트라고 보긴 좀 무리가 있기 때문에 OT 참석 인원을 기준으로 했어요.구글 밋에 참석한 분은 85명이였지만, 운영진이나 그냥 참관하시는 분도 계신 것 같아, OT에서 출석 체크를 하신 분으로 72명을 잡았네요. 근데 여기서 팀 러너 58명 중에서 OT 참석을 못하신 분이 6분이 계시기 때문에 52를 빼면 총 20명 입니다. 그래서 스타트 인원이, 팀 러너와 개인러너를 합쳐서 78명 입니다.여기서 현재 달리고 계신 분이 몇 명 인지는 1주차 발자국 제출로 했어요.그래서 팀 러너에서는 56명이고 개인 러너는 6명을 합하면 총 62명 인이고, 이를 전체에서 나누면 완주율은 79퍼센트가 되는 거죠. 아직까진 매우 높은 수치 입니다. 그리고 현재 복습을 진행하고 계신 분은 32명 이고요. 저도 러너 입니다.하프 구간을 지나 다음 주, 우리에겐 "벽"이 나타나게 될 겁니다. 마라톤 경기를 보면 보통 30km 전후로 포기를 많이 하거든요. 이걸 Hitting the wall이라고 하는데, 이때 신체에 모든 글리코겐이 소진 되면서 신체적으로나 정신적으로 한계가 오는 거죠. 그리고 이건 비단 마라톤 뿐만 아니라, 우리 스터디에서도 적용이 됩니다.이때가 되면, 시작할때의 흥분이나 동기부여가 사라지고, 지루함과 심리적인 피로가 몰려오게 될 거예요.그래서 실제 이탈을 많이 하게되는 구간인데, 이 시기를 항상 이겨내는 사람이 있고여, 항상 포기하는 사람이 있습니다. 정말 다 와서 좀만 더 가면되는데, 모든 사람마다 임계치가 있다보니까 어쩔 수 없는 거 같아요. 그래도 이 임계치는 늘릴 수 있는 거니까. 이번 기회에 한번 시도해 보시기 바랍니다!미약하지만 저도 최대한 동기부여를 드릴 수 있도록 노력을 해볼께요. 저도 러너 입니다.스터디 기간동안 힘든 걸 같이 공감 하려고, 한 주에 50km씩 잡고 총 200km를 스터디 기간동안 달려보는 챌린지를 시작 했어요. 그래서 운동을 시작할 때 위와 같이 시간을 찍고 있는데, 밑에 조그맞게 날짜도 인증 했습니다.저도 다음 주에 Hitting the wall이 올 텐데, 우리 같이 힘내봐요!! 우리 스터디가 팀 프로젝트는 아니니까 리더를 하셔도 크게 힘들 건 없을 거라고 말씀 드렸는데, 열심히 활동해 주시는 리더분 들이 많아 좀 더 혜택을 드리고 싶었습니다. 하지만 사전에 언급드린 건 아니라 투표를 진행했어요.결과는 찬성이고, 우수러너 선정이 총 5명 일 때, 4명의 우수러너를 먼저 뽑습니다. 여기엔 복습을 잘한 순으로 리더도 포함이 되요. 다음으로 1명의 우수 러너는 남은 리더 중에 활동 내용을 보고 뽑도록 하겠습니다.(만약 복습도 잘하고 활동도 잘하시는 리더가 있다면? 이건 그때 가봐서 더 고려해 봐야 할 것 같네요.^^)  부업에서 전업으로지식공유자 일프로 이야기 <강의 오픈편>저의 이야기가 조금이라도 더 동기부여가 되길 바라는 마음으로 준비한 내용 이예요. 월래는 <강의 제작편>을 먼저 말씀드리려고 했지만, 전날 인프런에서 <강의 오픈편>을 발표를 했고, 기억이 더 생생하다 보니까 변경을 했습니다.강의를 오픈하고 나면 또 다른 시작이 있다는 게 주제 였고, 먼저 제가 부업으로 지식 공유 활동을 했을 때 강의를 오픈하고 발생 했던 일들을 말씀 드렸어요. 그 첫 번째 주제는 무조건 겪게 되는 스무고개 시간 입니다.처음엔 온라인 플랫폼이라서 그런지 제 스스로 스승이라는 인식을 못하고 있었는데, 인프런에서 매년 보내주는 선물 덕분에 인지하게 됐고, 그 이후로 수강생 분들에게 열심히 답변해 드리면서 있었던 이야기 예요. 다음으로 시간을 더 쏟았더니 생긴 1점 수강평이고요.답글을 달 때마다 제 마음 상태를 확인하는 버릇이 생기고, 완성도가 낮은 수업은 없느니만 못하다고 생각을 하게 됐던 이야기가 있었습니다.그리고 부업으로써 지식공유 활동이 저에게 가져다 준 변화예요.제가 지식공유자 하길 참 잘했다고 생각했던 일들을 말씀 드렸는데, 사실 이것도 부업이라 많은 도전을 해보지 못한 상태였습니다. 정말 진짜는 전업이고요. 지금 워밍업 스터디도 그렇지만 강의를 오픈한 이후 다양한 시도에 대해 이야기 드렸어요. 질의 응답제가 임기응변에 약합니다. 그래서 깊게 생각 못하고 답변을 드릴 수도 있는데, 그러면 오해가 생길 수 있으니까 질문을 하시고 의도한 대답이 아니면, 따로 또 질문을 달라고 요청 드렸어요.다양한 질문이 있었지만, 역시나 취업에 대한 고민이 많았는데, 참 모두가 힘든 시기 입니다.바로 갈 수 있는 중소기업 VS 될 때까지 중견 기업 이상을 도전지원자 입장에서는 기회 비용을 생각하기 때문에 당연히 고민이 되는 부분입니다.하지만 면접관 입장에서 생각해보면 지원자가 많은 관계로 경력이 더 있는 사람을 뽑게 되겠죠. 그래서 전 바로 갈 수 있는 중소기업이 있으면 가는 더 낫다는 입장입니다. 단, 추후 중견 기업으로 갈 기술 지원 분야를 중소기업에서 경험 할 수 있어야 해요. 그렇다고 했을 때, 예전엔 중소기업을 가면 중견기업 가기 어렵다는 말을 했지만, 지금 같은 시기엔 면접관들도 기업들에 TO가 별로 없다는 걸 알고 있고, 그래서 중소기업이라도 들어가서 경험을 해 본 사람에게 플러스 점수를 줄 수 밖에 없다고 생각해요. 여기까지 제가 준비한 1차 중간 점검 이였는데, 부디 다음 한 주를 잘 버틸 힘이 생겼길 바라면서, 다음 2차 온라인 미팅 때 또 봐요!!워밍업 클럽 스터디-DevOps 화이팅!! - 일프로 드림

데브옵스 · 인프라워밍업DevOps쿠버네티스kuberentes일프로코치데브옵스인프라

데브옵스, OOO와 OOOO를 잡아야 한다는데?

안정적이고 효율적인 서비스 운영을 위한 방법을 찾고 적용하는 데브옵스는 오늘날 많은 팀에서 도입하고 있는 개발 방법론입니다. 데브옵스 엔지니어링에 대한 수요는 늘고 있지만, 서비스 규모는 점점 더 크고 복잡해지는데다 새로운 기술 역시 꾸준히 등장하는 만큼 진입 장벽이 높게 느껴지기 마련인데요.데브옵스의 핵심 요소는 크게 (1) 인프라 관리 (2) 딜리버리 (3) 모니터링 세 가지로 나뉩니다. 이 중에서도 인프라와 딜리버리 파이프라인 구축은 코드 생성 - 테스트 - 배포 - 운영에 이르는 흐름을 하나의 관리 프로세스로 관리하고 효율을 높이는 과정에서 중심축 역할을 합니다.복잡한 비즈니스의 민첩성과 확장성을 높이고, 개발과 운영을 유기적으로 만들 수 있게 ‘일하는 방식’을 달리하는 데브옵스. 성공적인 데브옵스 도입을 위해서는 이러한 핵심 역량을 중심으로 팀에 맞는 전략을 찾아가는 것이 중요합니다.•••주니어 데브옵스 엔지니어가 되기 위한 핵심 역량을 빠르게 완성하고 싶으신가요?지금 인프런 프리즘 [DevOps 기본 입문 로드맵]을 통해 학습해보세요. https://www.inflearn.com/roadmaps/658•••인프런 프리즘 브랜드 스토리 읽어보기 >>

데브옵스 · 인프라DevOps데브옵스인프런프리즘InflearnPrism신입개발자취업AWS인프라딜리버리CICD

Howon Jeong

[인프런 워밍업 클럽 4기] DevOps 발자국 4주차

이번 주차는 Argo CD를 이용한 배포와 Blue/Green, Canary 배포 전략을 간단하게 사용할 수 있는 방법을 공부하고 실습했다. Argo CD는 GitOps 기반으로 관련된 Release Repo에서 수정이 발생하면 주기적으로 데이터를 가져와 운영 중인 서버와 비교하는 일을 자동으로 해줌. Git Repo와 kube-apiserver와도 연결이 되어 있기 때문에, CD 역할을 하면서 각 Resource의 상태를 그래프를 이용해 표시해줘서 이 부분은 Jenkins보다 좋았던 것 같다. 게다가, Argo CD의 ImageUpdater를 통해 Docker Hub의 Image가 업데이트 되는 것을 감지하여 Applications에 Annotations을 주는 것으로 특정 Image가 정해둔 패턴에 맞추어 업데이트가 되면 미리 설정해둔 배포 전략에 맞추어 자동으로 업그레이드가 진행되는 툴이었다. 솔직히, Deployment를 이용한 Blue/Green과 Canary 배포는 강의를 듣고 실습하면서 이것을 실전에 적용해볼 생각을 하니 조금 막막했다.. ㅎㅎ 하지만, Argo Rollouts를 이용한 방식은 너무 간편했고 미리 YAML 파일만 잘 짜두면 클릭 한 번으로 귀찮은 모든 일들이 이루어졌다. (Argo 그는... 신이야)복습 시간을 조금 가지고, 다시 일프로 강사님의 Sprint3과 4를 수강할 생각인데, 아직까지 지상편이라는 생각과 강사님이 첫 강의에서 보여주신 사진 때문에 조금 무섭긴 하다(저기서 익숙한 애들보다 처음 보는 애들이 더 많은 것 같다.. ㅎㅎ)드디어, 모든 강의가 끝나고 워밍업 클럽이 끝났다 !!k8s를 공부해야지.. 항상 생각했지만, 막막함에 계속 미루고 있었는데, 인프런의 워밍업 클럽 덕분에 좋은 강사님을 만나게 되어서 정말 좋은 경험이라고 생각한다

DevOpsInfra워밍업클럽

인프런 워밍업 클럽 4기 DevOps - 2주차 발자국

전체적으로 느낀 점Kubernetes는 단순히 "컨테이너를 관리하는 도구"가 아니라, 전체 인프라의 상태를 코드로 정의하고 자동화하는 시스템이라는 걸 알게 되었다. 복잡하게 보였던 구성 요소들이 실제로는 잘 분리된 역할을 가지고 있다는 점이 인상 깊었고, 배울수록 실전에서 유용하겠다는 확신이 들었다. 배운 내용 요약 컨트롤 플레인과 클러스터 구조Control Plane은 클러스터의 두뇌로, 모든 오브젝트를 정의하고 감시하고 조율한다.etcd는 상태 저장소, Scheduler는 파드를 노드에 배치, Controller Manager는 상태를 지속적으로 유지.워커 노드는 kubelet, kube-proxy, containerd 등의 구성 요소로 작동하며, 컨테이너 실행은 Kubernetes가 직접 하는 게 아니라 런타임에게 요청한다는 구조가 흥미로웠다. 오브젝트 vs 컨트롤러오브젝트는 Pod, Service, PVC, ConfigMap처럼 기능 단위의 리소스컨트롤러는 이들을 자동화·유지·복구하는 역할 (Deployment, HPA 등)두 개념을 명확히 나눈 덕분에 Kubernetes의 확장성과 유연성이 보였다. ConfigMap과 SecretConfigMap: 설정값을 파드 외부에서 관리 → 환경별로 유연하게 구성 가능Secret: 민감정보 저장 (Base64 인코딩, 메모리 마운트)특히 Secret이 노드 메모리에 저장되고, 수정 시 kubelet이 주기적으로 반영하는 구조는 실제 운영환경에서 고려할 보안 요소가 많다는 걸 보여줌 Service서비스는 파드 IP가 변해도 고정된 접근점을 제공하는 추상화 계층ClusterIP, NodePort, LoadBalancer, ExternalName 타입마다 용도가 다르고,내부 DNS 기반의 이름 접근(서비스 디스커버리)은 마이크로서비스 아키텍처의 핵심 Probe (Liveness, Readiness, Startup)컨테이너가 살아있는지(Liveness), 준비됐는지(Readiness), 시작 중인지(Startup) 체크 가능Kubernetes가 단순 배포 도구가 아닌, 운영과 회복 기능까지 내장하고 있다는 걸 실감함설정에 따라 서비스 유입 제한, 자동 재시작 등 운영자가 손 쓸 필요 없는 자동화 처리가 가능 HPA (Horizontal Pod Autoscaler)설정된 기준(CPU 등)에 따라 파드 수를 자동으로 조절이상적인 스케일링과 현실적인 지연 시나리오를 비교하면서, HPA는 전능한 도구가 아니라 보조적인 수단임을 인지하게 됨 

데브옵스 · 인프라인프런워밍업클럽4기발자국DevOps

crispin

워밍업 클럽 4기 DevOps - 미션 1

워밍업 클럽 4기 DevOps 미션 1 (쿠버네티스 설치 구간별 상태 확인) 쿠버네티스 설치 환경💻 pc: mac book m3 pro(AArch64, 12 core, 18gb, 500gb)🐧 linux: rocky9🔨 tools: lima-vm 왜 lima-vm 을 사용했나?Apple Silicon 맥 에서 Virtual Box 를 사용하는데 제약이 있고, 그외 다른 선택지가 있긴한데(UTM 등) VM이 필요한 작업에서 많이 활용하기도 했었고 docker 또한 lima-vm 을 활용해서 사용하고 있기 때문에 사용하게 되었습니다. Apple Silicon 맥에서 VM 을 빠르게 기동해서 활용하는데 있어 좋은 툴이라 생각합니다.설치 구간별 상태 확인(맥북을 사용해서 4부터 시작)4. Rocky Linux 기본 설정타임존 설정 확인 (명령어: timedatectl)5. kudeadm 설치 전 사전 작업1. 방화벽 해제 확인 (명령어: systemctl status firewalld) lima-vm 을 활용해서 linux 설치 시 별도의 설정을 해주지 않으면 방화벽을 포함하지 않고 설치가 된다.스왑 비활성화 확인6. 컨테이너 런타임 설치iptables 세팅 명령어cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF # 재부팅하지 않고 sysctl 파라미터 적용하기 sudo sysctl --system docker engin (containerd.io) 만 설치명령어yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 결과containerd 설치 확인 (명령어: systemctl status containerd )설치 가능한 버전의 containerd.io 리스트 확인cri 활성화 설정 확인 (명령어: cat /etc/containerd/config.toml | grep SystemdCgroup)kubelet cgroup 확인 (configmap)(명령어: kubectl get -n kube-system cm kubelet-config -o yaml | grep cgroupDriver)kubelet cgroup 확인 (kubelet)(명령어: cat /var/lib/kubelet/config.yaml | grep cgroupDriver)7. kubeadm 설치repo 설정 확인(명령어: yum repolist enabled)8. kubeadm 으로 클러스터 생성클러스터 초기화(명령어: kubectl get node && kubectl cluster-info && kubectl get pods -n kube-system)kubectl 사용 설정(명령어: cat ~/.kube/config)CNI Plugin 설치 (calico 대신 flannel 설치)(명령어: kubectl get configmap kube-flannel-cfg -n kube-flannel -o yaml | grep Network)9. 쿠버네티스 편의 기능 설치kubectl 기능 설정 확인마무리 및 소감실무에서는 주로 GKE나 EKS 같은 클라우드 기반 Kubernetes 서비스를 사용했기 때문에, 직접 리눅스 환경에 Kubernetes를 설치해본 경험은 이번이 처음이었습니다. Apple Silicon 맥북 위에 VM을 띄우고 설치를 진행했는데, 강사님의 가이드를 따르기보다는 개인적인 고집으로 다른 툴을 사용하거나 아키텍처를 변경하면서 설치 과정이 생각보다 순탄하지는 않았습니다. 결국 반나절 정도 삽질을 했던 것 같네요.설치 과정에서 사용한 명령어나 겪었던 문제들, 해결 방법 등을 모두 이 글에 담기에는 내용이 너무 길어질 것 같고, 인프런 블로그 에디터가 개인적으로 불편하게 느껴졌던 점들(코드 블록, 번호 목록 등)도 있어서, 해당 내용은 복습하면서 개인 블로그에 따로 정리해볼 예정입니다.

데브옵스 · 인프라워밍업클럽4기DevOps

David

[인프런 워밍업 클럽 4기 - DevOps] 미션 2. Probe 응용과제

응용 과제Application 로그를 통한 probe 동작 분석#사전 작업#kubectl patch -n anotherclass-123 hpa api-tester-1231-default -p '{"spec":{"minReplicas":1}}' Grafana 접속 후 Pod 로그 화면 설정Pod 삭제Application Log 확인마스터 노드에서 실행// 1번 API - 외부 API 실패 curl http://192.168.56.30:31231/hello // 2번 API // 외부 API 실패 curl http://192.168.56.30:31231/hello // 내부 API 성공 kubectl exec -n anotherclass-123 -it api-tester-1231-7459cd7df-2hdhk -- curl localhost:8080/hello kubectl exec -n anotherclass-123 -it <my-pod-name> -- curl localhost:8080/hello // 3번 API - 외부 API 성공 curl http://192.168.56.30:31231/hello // 4번 API // 트래픽 중단 - (App 내부 isAppReady를 False로 바꿈) curl http://192.168.56.30:31231/traffic-off // 외부 API 실패 curl http://192.168.56.30:31231/hello // 트래픽 재개 - (App 내부 isAppReady를 True로 바꿈) kubectl exec -n anotherclass-123 -it api-tester-1231-7459cd7df-2hdhk -- curl localhost:8080/traffic-on // 5번 API - 장애발생 (App 내부 isAppLive를 False로 바꿈) curl http://192.168.56.30:31231/server-error 응용 1. startupProbe가 실패 되도록 설정해서 Pod가 무한 재기동 상태가 되도록 설정해 보세요.[결과]응용 2. 일시적 장애 상황(App 내부 부하 증가)가 시작 된 후, 30초 뒤에 트래픽이 중단되고, 3분 뒤에는 App이 재기동 되도록 설정해 보세요.설정 후 API 요청하면 성공하지만 그 이후에는 차단응용 3. Secret 파일(/usr/src/myapp/datasource/postgresql-info.yaml)이 존재하는지 체크하는 readinessProbe를 만들어 보세요.해당 Pod 내부에 파일이 존재하기 때문에 실패 로그는 확인 불가 

데브옵스 · 인프라DevOpsSRE일프로Probek8smsa

워밍업 클럽 4기 DevOps - 1주차 발자국

DevOps 1주차 회고우선 이번 주는 1주차라서 반드시 복습까지 하고자 하였지만 목요일부터 있는 정보처리학회 준비를 위해 강의만 다 듣자는 목표를 가졌다. 하지만 다 듣지는 못했다. 초과학기임에도 18학점을 듣고, 연구실 생활도 하니 많이 버겁지만 하루하루 밀려나지 않기 위해 열심히 하려고 했다.다음 주 부터는 전공 시험 준비를 해야 할 것 같아서 사실상 이번 스터디에서 매일 복습을 하기란 힘들 것 같다는 생각을 한다. 모든 미션과 복습을 해내면 좋겠지만 가장 중요한 강의는 반드시 수강하고, 미션은 강좌 진행에 있어 필수가 되기 때문에 바빠서 복습을 조금 미루더라도 강의를 듣고 미션을 수행하는 것은 반드시 해야겠다. 물론 연구실이 클라우드 보안 연구실이라서 쿠버네티스를 다른 방법(Proxmox, 교내 클라우드)으로는 구축해봤지만 이게 어떻게 된거지? 라는 의문을 항상 달고 있었기 때문에, 시험기간과 빡빡한 연구실 생활 속에서도 잠깐 쉴 시간을 쪼개서 필수 항목은 해야겠다. 학회를 가서도 느낀거지만 나는 안하지만 다른 사람들은 정말 열심히 한다는 것이다. 핑계를 대면 끝도 없으니 최소한이라도 하는게 맞는 것 같다.  부디 다음 주 회고는 "해냈다"라는 말이 나오길  

데브옵스 · 인프라워밍업DevOps일프로

인프런 워밍업 클럽 4기 DevOps - 1주차 발자국

배운 개념 요약네임스페이스쿠버네티스 리소스를 논리적으로 구분해 관리하기 위한 단위실습 중 네임스페이스를 활용해 강의별 리소스를 격리해 관리한 것이 특히 인상 깊었음삭제 시 모든 내부 오브젝트도 삭제되지만 PV는 클러스터 레벨이라 별도 관리 필요디플로이먼트, 레플리카셋, 파드디플로이먼트 생성 → 내부적으로 레플리카셋 생성 → 파드 복제본 유지이름 지정 방식, 라벨-셀렉터의 역할을 실습하며 자연스럽게 익힘파드가 죽으면 자동 재생성되는 구조에서 쿠버네티스의 자가치유 개념을 체감함 컨테이너 설정 및 ENV 구성ConfigMap과 Secret을 사용한 환경 변수 주입 방식이 매우 유연하다는 인상실무에서 .env를 쿠버네티스에서는 어떻게 대체하는지를 명확히 이해함 프로브(Probe)스타트업/레디니스/라이브니스 프로브의 차이점을 실습을 통해 구체적으로 파악특히 Readiness Probe가 실패하면 트래픽을 차단하는 방식이 운영 환경에서 유용하다고 느낌 볼륨(PV/PVC)과 마운트PV는 클러스터에서 생성, PVC는 네임스페이스에서 요청둘 사이 연결을 셀렉터로 명확히 지정해야만 동작한다는 점을 실습으로 확인서비스(Service)파드와 클라이언트를 연결하는 핵심 요소라벨-셀렉터를 통해 다이나믹하게 연결된다는 점이 매우 직관적이고 강력HPA (Horizontal Pod Autoscaler)실습을 통해 CPU 부하에 따라 자동으로 파드 수를 조정하는 과정을 경험단순히 개수만 조정하는 게 아니라, 쿨타임(600초)을 두어 확장을 제어하는 구조까지 확인함느낀 점쿠버네티스는 단순히 "배포 도구"가 아니라, 운영에 최적화된 추상화 플랫폼이라는 인식을 하게 되었다.초반에는 오브젝트 간의 관계가 복잡해 보였지만, 실습을 반복하며 레이블과 셀렉터를 중심으로 이해하면 구조가 단순해진다는 점을 깨달음각 오브젝트는 독립적인 것처럼 보이지만 사실은 서로 긴밀히 연결된 구조이며, 이 연결을 정확히 설계해야 안정적인 운영이 가능하다는 점을 실감

DevOps인프런워밍업클럽4기발자국

rhkdtjd_12

[쿠버네티스] 실무에서 느껴 본 쿠버네티스가 정말 편한 이유-일프로 부족할때 (TS러버)

해당 블로그는 [쿠버네티스 어나더 클래스] 강의에 일부 내용입니다. 복습을 위한 자료 입니다.강의 링크 :https://inf.run/f2xSR1. 쿠버네티스 표준 생태계로 편해진 IT 인프라 구축 CNCF 생태계는 쿠버네티스 기반으로 구성된 표준화된 오픈소스 도구들을 제공합니다.이 안에서 Graduated → Incubating → Sandbox → Archived 순으로 성숙도가 나뉘며,공식 멤버 여부와 GitHub 스타 수 등을 참고해 실무에 적합한 도구를 선택할 수 있습니다.생태계 안의 도구를 활용하면 기술 선택의 불확실성을 줄이고,애플리케이션 추가/제거 시에도 자동 연동되는 모니터링 시스템 등으로 개발-운영 연계가 훨씬 자연스럽고 편리합니다.실제 실습 시, 단순히 Pod 하나를 띄웠는데 Grafana에서 메트릭이 자동 노출되는 경험처럼 초기 설정 걱정 없이도 많은 기본 구성이 자동화되어 있습니다.2. 쿠버네티스 기능으로 편해진 서비스 안정화Traffic Routing: 다수의 Pod에 트래픽을 자동 분산Self-Healing: Pod 장애 발생 시 자동 재기동AutoScaling: CPU 등 리소스 사용량에 따라 자동으로 Pod 수 조절RollingUpdate: 무중단 업데이트 및 실패 시 자동 롤백 처리Readiness Probe: 준비되지 않은 Pod는 트래픽을 받지 않음→ 기존 VM 기반 환경에서는 수동 작업이 필요했지만, 쿠버네티스는 이를 자동화하여빠른 배포와 장애 대응을 가능하게 해줍니다.3. 인프라 환경 관리의 코드화 쿠버네티스는 설정을 YAML 파일 등으로 관리하기 때문에 모든 인프라 변경 사항이 기록으로 남고 추적 가능합니다.환경별 배포 파일 분리, 사전 준비, 재사용이 가능해 반복 작업 감소와 품질 향상에 기여합니다.코드 기반 관리는 인프라 이력 관리를 가능하게 하고, 기존의 수작업 중심 관리에서 벗어나 자동화된 DevOps 환경 구축이 가능합니다.IaS(Infrastruture as a Code)라고 들어만 봤지 이렇게 강력한지 몰랐습니다. 기업들이 왜 쿠버네티스를 선호하고 대세인지 공부를 하면 할 수록 점점 깨닫게 되는것 같네요.

데브옵스 · 인프라쿠버네티스DevOps

kndh2914

인프런 워밍업 클럽 4기 - DevOps 1주차 발자국

[1주차 강의 수강]1주차 기간동안 쿠버네티스의 역사와 이해하고 제대로 활용하기 위해서 관련 키워드부터 용어들을 알게되는 시간을 가졌다. 또한 섹션 하나하나 마다 좋은 강의들이 있어 이해하는데 다소 어렵지 않았을 뿐더러 실습시간이 포함이 되어있어 눈으로 읽는것 보다 컨테이너를 Pod를 포함하여 전체적인 쿠버네티스를 만들어보고 삭제해보는 시간을 가졌기에 머리로 이해하는데 훨씬 수월해졌다. 회고: 1주차 강의를 퇴근하고 들으면서 다소 피곤하면서 들었던 적이 몇번은 있었지만 그럼에도 매 강의마다 좋은 정보와 조언 그리고 수강생분들이 재밌게 접근할 수 있도록 커리큘럼을 만들었기에 피곤함이 많이 사라지곤 했다. 다음주부터는 2주차 강의를 수강을 하게 된다. 2주차부터는 더욱 더 좋은 컨디션으로 강의 수강에 임할것이다.[미션]링크: https://du-hyeon.notion.site/2-4-20122449e85a80f18d5be4b504858dbb?pvs=4회고: 밑바닥부터 설치를 진행하였고 k8s 구축하는 명령어를 입력할 때마다 무슨 의미이고 이게 어떠한 결과가 일어나는지 몰랐지만 반복의 반복 계속해서 복습하였고 이 명령어가 왜 이 상황에서 일어나야 하는지 알게 되었다. 역시 한번 만에 이해하는 것은 신이 아닌 이상 인간으로써는 복습만이 살 길이라는 것을 알게 되는 시간 이였다.

데브옵스 · 인프라일프로k8sDevOps인프런

rhkdtjd_12

[인프런 워밍업 클럽 4기] DevOps 발자국 1주차 - 일프로 부족할때 (TS러버)

 강의 수강1. 컨테이너 한방정리CentOS 종료와 Rocky Linux의 등장에 대해서 흥미로웠다.OS의 발전으로 chroot → cgroups를 통해서 가상화 기술이 발전한 부분이 재밌었다.2. 쿠버네티스 무게감있게 설치하기글로써 정리하기 보다 강의 내용을 몇번 반복하면서 보면서 해당 전체 쿠버네티스 세팅을 연습 하는게 중요한것 같다.이해를 바탕으로 강의를 여러번 보면서 세팅하는 감을 익히는것이 중요하고 이해를 충분히 해야 하는게 다른 여러 환경에서 똑같은 셋업을 했을때 발생하는 여러 트러블 슈팅들을 해결할 수 있을것 같다.3. 실무에서 쿠버네티스가 정말 편한 이유기존 서버 운영은 설치, 구성, 배포가 수동이었지만 쿠버네티스는 YAML만 작성하면 동일한 환경을 빠르게 구성할 수 있어 운영 효율성과 자동화가 뛰어나다.또한, 롤링 업데이트, 헬스 체크, 오토스케일링 같은 기능으로 실무에서 매우 유용하게 사용된다.4. Object 그려보며 이해하기Deployment, ReplicaSet, Pod의 관계를 시각적으로 정리하면 각 오브젝트가 어떤 역할을 하고 어떻게 연결되는지 명확히 이해할 수 있다.결국 쿠버네티스는 선언적 방식으로 원하는 상태(State)를 정의하고, 컨트롤러가 이를 자동으로 유지하도록 구성된다. 미션해결 과정 요약Mac OS 환경에서 중간에 yum update시에 namespace 설정이 없어서 도메인을 ip로 변환하지 못하여서 패키지를 다운 받지 못하는 문제가 있긴 했으나 그 이외에는 가이드대로 막힘없이 모두 잘 설정 되어 있었다!미션 해결 회고강사님의 한땀 한땀 깊은 주석을 달아주셨던 모든 명령어를 다 이해하고 어느정도 어떻게 세팅을 해야하는지에 대한 이해를 하려면 반복 복습이 지속적으로 필요할것 같다! 

데브옵스 · 인프라쿠버네티스DevOps

rhkdtjd_12

[인프런 워밍업 클럽 4기 - DevOps] 미션 1. 쿠버네티스 설치 구간별 상태 확인

[1-1] 내 PC 네트워크 확인[1-2] 내 PC 자원 확인[1-3] UTM 설치 버전 확인[2-1] UTM VM 확인[3-1] Rocky Linux 버전 확인[3-2] Hostname 확인[3-3], [3-4] Network 확인[3-5] 자원(cpu, memory) 확인[4] Rocky Linux 기본 설정타임존 설정 확인[5] kubeadm 설치 전 사전작업방화벽 해제 확인스왑(swap) 비활성화 확인[6] 컨테이너 런타임 설치[6-1] 컨테이너 런타임 설치 전 사전작업iptables 세팅[6-2] 컨테이너 런타임 (containerd 설치)[6-2-1] containerd 패키지 설치 (option2)[6-2-1-1] docker engine (containerd.io)만 설치docker repo 설정 확인containerd 설치 확인설치 가능한 버전의 containerd.io 리스트 확인[6-3] 컨테이너 런타임 (CRI활성화)cri 활성화 설정 확인kubelet cgroup 확인 (configmap)kubelet cgroup 확인 (kubelet)[7] kubeadm 설치repo 설정 확인 SELinux 설정 확인kubelet, kubeadm, kubectl 패키지 설치설치 가능한 버전의 kubeadm 리스트 확인[8] kubeadm으로 클러스터 생성[8-1] 클러스터 초기화 (Pod Network 세팅)클러스터 상태 확인[8-2] kubectl 사용 설정인증서 설정 확인[8-3] CNI Plugin 설치 (calico)calico pod 설치 및 pod network cidr 적용 확인[8-4] Master에 pod를 생성 할 수 있도록 설정Master Node에 Taint 해제 확인[9] 쿠버네티스 편의 기능 설치[9-1] kubectl 자동완성 기능kubectl 기능 설정 확인[9-2] Dashboard 설치dashboard 설치 확인[9-3] Metrics Server 설치metrics server 설치 확인

데브옵스 · 인프라DevOps

David

[SPG-박상준] 1주차 발자국

26일 OT 이후 [미션1] 쿠버네티스 설치 구간별 상태 확인만 진행된 상태이지만 발자국을 남겨본다. 인프런에서 강의 구매 후 절반 정도 진행을 하고 있었고 스터디 팀을 하는 것이 귀찮기도 했지만 전원 완주 팀에 Sprint4 무료 쿠폰이라는 달콤한 보상이 있었기에 신청하게 되었다.우리 SPG(Senior Pod Group) 팀은 대부분 고연차 경력을 가지고 현업에 계신 분들로 구성이 되어 있기 때문에 개인 공부를 위한 실습은 하겠지만 문서화하고 기록에 남기는 일은 정말 쉽지 않은 것을 알고 있다. (나 또한..) 각설하고 [미션1] 과정은 한차례 진행했었기 때문에 신규로 다시 구성을 했었고 쿠버네티스 설치에 필요한 환경설정은 여러 번 재구축 해보기 위해 스크립트로 작성하여 진행했다. 환경설정 또한 이전 단계 설정을 하고 검증 단계를 걸쳐서 완료되지 않으면 넘어가지 않도록 작성해서 설정이 빠지는 것을 방지했다.[환경설정 코드]#!/bin/bash # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로그 함수 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 검증 실패 시 종료 함수 exit_on_error() { log_error "$1" log_error "스크립트를 종료합니다." exit 1 } # 사용자 확인 함수 confirm_continue() { read -p "다음 단계로 진행하시겠습니까? (y/n): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "사용자가 중단했습니다." exit 0 fi } echo "========================================" echo "Kubernetes 기본 환경설정 스크립트 시작" echo "========================================" # ============================================ # 1. 시스템 기본 설정 # ============================================ log_info "======== [1단계] 시스템 기본 설정 ========" log_info "타임존을 Asia/Seoul로 설정 중..." timedatectl set-timezone Asia/Seoul timedatectl set-ntp true chronyc makestep log_info "필수 패키지 설치 중..." yum install -y yum-utils iproute-tc yum update openssl openssh-server -y log_info "hosts 파일 설정 중..." if ! grep -q "k8s-master" /etc/hosts; then cat << EOF >> /etc/hosts 192.168.56.30 k8s-master EOF fi log_info "======== [1단계] 검증 시작 ========" # 타임존 검증 current_timezone=$(timedatectl show --property=Timezone --value) if [ "$current_timezone" = "Asia/Seoul" ]; then log_success "타임존 설정 완료: $current_timezone" else exit_on_error "타임존 설정 실패: $current_timezone" fi # NTP 동기화 검증 ntp_status=$(timedatectl show --property=NTPSynchronized --value) if [ "$ntp_status" = "yes" ]; then log_success "NTP 동기화 완료" else log_warning "NTP 동기화 미완료 (시간이 필요할 수 있음)" fi # 필수 패키지 검증 if command -v tc >/dev/null 2>&1; then log_success "tc 패키지 설치 완료" else exit_on_error "tc 패키지 설치 실패" fi # hosts 파일 검증 if grep -q "192.168.56.30 k8s-master" /etc/hosts; then log_success "hosts 파일 설정 완료" else exit_on_error "hosts 파일 설정 실패" fi log_success "======== [1단계] 시스템 기본 설정 완료 ========" confirm_continue # ============================================ # 2. 보안 설정 # ============================================ log_info "======== [2단계] 보안 설정 ========" log_info "방화벽 해제 중..." systemctl stop firewalld systemctl disable firewalld log_info "SELinux 설정 중..." setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config log_info "======== [2단계] 검증 시작 ========" # 방화벽 상태 검증 firewall_status=$(systemctl is-active firewalld) if [ "$firewall_status" = "inactive" ]; then log_success "방화벽 해제 완료" else exit_on_error "방화벽 해제 실패: $firewall_status" fi # 방화벽 부팅 시 비활성화 검증 firewall_enabled=$(systemctl is-enabled firewalld) if [ "$firewall_enabled" = "disabled" ]; then log_success "방화벽 부팅시 비활성화 완료" else exit_on_error "방화벽 부팅시 비활성화 실패: $firewall_enabled" fi # SELinux 현재 상태 검증 selinux_current=$(getenforce) if [ "$selinux_current" = "Permissive" ]; then log_success "SELinux 현재 상태: $selinux_current" else exit_on_error "SELinux 설정 실패: $selinux_current" fi # SELinux 설정 파일 검증 selinux_config=$(grep "^SELINUX=" /etc/selinux/config | cut -d'=' -f2) if [ "$selinux_config" = "permissive" ]; then log_success "SELinux 영구 설정 완료: $selinux_config" else exit_on_error "SELinux 영구 설정 실패: $selinux_config" fi log_success "======== [2단계] 보안 설정 완료 ========" confirm_continue # ============================================ # 3. 시스템 리소스 설정 # ============================================ log_info "======== [3단계] 시스템 리소스 설정 ========" log_info "Swap 비활성화 중..." swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab log_info "======== [3단계] 검증 시작 ========" # Swap 상태 검증 swap_status=$(swapon --show) if [ -z "$swap_status" ]; then log_success "Swap 비활성화 완료" else exit_on_error "Swap 비활성화 실패: $swap_status" fi # fstab에서 swap 주석 처리 검증 swap_in_fstab=$(grep -v "^#" /etc/fstab | grep swap) if [ -z "$swap_in_fstab" ]; then log_success "fstab에서 swap 영구 비활성화 완료" else exit_on_error "fstab에서 swap 영구 비활성화 실패" fi log_success "======== [3단계] 시스템 리소스 설정 완료 ========" confirm_continue # ============================================ # 4. 네트워크 설정 # ============================================ log_info "======== [4단계] 네트워크 설정 ========" log_info "커널 모듈 설정 중..." cat <<EOF |tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF modprobe overlay modprobe br_netfilter log_info "네트워크 파라미터 설정 중..." cat <<EOF |tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system log_info "======== [4단계] 검증 시작 ========" # 커널 모듈 검증 if lsmod | grep -q overlay; then log_success "overlay 모듈 로드 완료" else exit_on_error "overlay 모듈 로드 실패" fi if lsmod | grep -q br_netfilter; then log_success "br_netfilter 모듈 로드 완료" else exit_on_error "br_netfilter 모듈 로드 실패" fi # 네트워크 파라미터 검증 iptables_call=$(sysctl net.bridge.bridge-nf-call-iptables | cut -d'=' -f2 | tr -d ' ') if [ "$iptables_call" = "1" ]; then log_success "iptables 설정 완료" else exit_on_error "iptables 설정 실패: $iptables_call" fi ip6tables_call=$(sysctl net.bridge.bridge-nf-call-ip6tables | cut -d'=' -f2 | tr -d ' ') if [ "$ip6tables_call" = "1" ]; then log_success "ip6tables 설정 완료" else exit_on_error "ip6tables 설정 실패: $ip6tables_call" fi ip_forward=$(sysctl net.ipv4.ip_forward | cut -d'=' -f2 | tr -d ' ') if [ "$ip_forward" = "1" ]; then log_success "IP 포워딩 설정 완료" else exit_on_error "IP 포워딩 설정 실패: $ip_forward" fi log_success "======== [4단계] 네트워크 설정 완료 ========" # ============================================ # 최종 검증 및 완료 # ============================================ log_info "======== 최종 기본 환경설정 검증 ========" log_info "기본 환경설정 상태 요약:" echo "----------------------------------------" echo "1. 타임존: $(timedatectl show --property=Timezone --value)" echo "2. 방화벽: $(systemctl is-active firewalld)" echo "3. SELinux: $(getenforce)" echo "4. Swap: $(if [ -z "$(swapon --show)" ]; then echo "비활성화"; else echo "활성화"; fi)" echo "5. IP 포워딩: $(sysctl net.ipv4.ip_forward | cut -d'=' -f2 | tr -d ' ')" echo "6. 커널 모듈 overlay: $(if lsmod | grep -q overlay; then echo "로드됨"; else echo "로드안됨"; fi)" echo "7. 커널 모듈 br_netfilter: $(if lsmod | grep -q br_netfilter; then echo "로드됨"; else echo "로드안됨"; fi)" echo "----------------------------------------" log_success "========================================" log_success "Kubernetes 기본 환경설정이 완료되었습니다!" log_success "이제 컨테이너 런타임과 Kubernetes 패키지를" log_success "설치할 준비가 되었습니다." log_success "========================================" log_info "다음 단계:" log_info "1. 컨테이너 런타임 (containerd) 설치" log_info "2. Kubernetes 패키지 (kubelet, kubeadm, kubectl) 설치" log_info "3. 클러스터 초기화" [설치 코드]#!/bin/bash # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' NC='\033[0m' # No Color # 로그 함수 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${PURPLE}[STEP]${NC} $1" } # 검증 실패 시 종료 함수 exit_on_error() { log_error "$1" log_error "스크립트를 종료합니다." exit 1 } # 사용자 확인 함수 confirm_continue() { read -p "다음 단계로 진행하시겠습니까? (y/n): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "사용자가 중단했습니다." exit 0 fi } # 대기 시간 함수 wait_for_service() { local service_name=$1 local max_wait=$2 local count=0 log_info "${service_name} 서비스 시작 대기 중..." while [ $count -lt $max_wait ]; do if systemctl is-active --quiet $service_name; then log_success "${service_name} 서비스가 정상적으로 시작되었습니다." return 0 fi sleep 2 count=$((count + 1)) echo -n "." done echo return 1 } echo "================================================" echo "Kubernetes 컨테이너 런타임 및 클러스터 설치 시작" echo "================================================" # ============================================ # 1. 컨테이너 런타임 설치 (containerd) # ============================================ log_step "======== [1단계] 컨테이너 런타임 설치 ========" log_info "Docker 저장소 추가 중..." yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo log_info "containerd 설치 중..." yum install -y containerd.io-1.6.21-3.1.el9.aarch64 log_info "systemd 데몬 재로드 중..." systemctl daemon-reload log_info "containerd 서비스 활성화 및 시작 중..." systemctl enable containerd systemctl start containerd # containerd 서비스 시작 대기 if ! wait_for_service "containerd" 15; then exit_on_error "containerd 서비스 시작 실패" fi log_info "containerd 기본 설정 생성 중..." containerd config default > /etc/containerd/config.toml log_info "SystemdCgroup 활성화 중..." sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml log_info "containerd 서비스 재시작 중..." systemctl restart containerd # containerd 재시작 후 대기 if ! wait_for_service "containerd" 15; then exit_on_error "containerd 서비스 재시작 실패" fi log_info "======== [1단계] 검증 시작 ========" # containerd 서비스 상태 검증 containerd_status=$(systemctl is-active containerd) if [ "$containerd_status" = "active" ]; then log_success "containerd 서비스 실행 중" else exit_on_error "containerd 서비스 실행 실패: $containerd_status" fi # containerd 부팅 시 활성화 검증 containerd_enabled=$(systemctl is-enabled containerd) if [ "$containerd_enabled" = "enabled" ]; then log_success "containerd 부팅시 활성화 완료" else exit_on_error "containerd 부팅시 활성화 실패: $containerd_enabled" fi # SystemdCgroup 설정 검증 if grep -q "SystemdCgroup = true" /etc/containerd/config.toml; then log_success "SystemdCgroup 설정 완료" else exit_on_error "SystemdCgroup 설정 실패" fi # containerd 버전 확인 containerd_version=$(containerd --version 2>/dev/null | cut -d' ' -f3) if [ -n "$containerd_version" ]; then log_success "containerd 버전: $containerd_version" else exit_on_error "containerd 버전 확인 실패" fi # containerd 실행 테스트 if ctr version >/dev/null 2>&1; then log_success "containerd 실행 테스트 성공" else exit_on_error "containerd 실행 테스트 실패" fi log_success "======== [1단계] 컨테이너 런타임 설치 완료 ========" confirm_continue # ============================================ # 2. Kubernetes 패키지 설치 # ============================================ log_step "======== [2단계] Kubernetes 패키지 설치 ========" log_info "Kubernetes 저장소 추가 중..." cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF log_info "Kubernetes 패키지 설치 중..." log_info "- kubelet (노드 에이전트)" log_info "- kubeadm (클러스터 초기화 도구)" log_info "- kubectl (클러스터 관리 도구)" yum install -y \ kubelet-1.27.2-150500.1.1.aarch64 \ kubeadm-1.27.2-150500.1.1.aarch64 \ kubectl-1.27.2-150500.1.1.aarch64 \ --disableexcludes=kubernetes log_info "kubelet 서비스 활성화 중..." systemctl enable kubelet log_info "======== [2단계] 검증 시작 ========" # kubelet 서비스 활성화 검증 kubelet_enabled=$(systemctl is-enabled kubelet) if [ "$kubelet_enabled" = "enabled" ]; then log_success "kubelet 부팅시 활성화 완료" else exit_on_error "kubelet 부팅시 활성화 실패: $kubelet_enabled" fi # Kubernetes 패키지 설치 검증 및 버전 확인 if command -v kubelet >/dev/null 2>&1; then kubelet_version=$(kubelet --version | cut -d' ' -f2) log_success "kubelet 설치 완료 - 버전: $kubelet_version" else exit_on_error "kubelet 설치 실패" fi if command -v kubeadm >/dev/null 2>&1; then kubeadm_version=$(kubeadm version -o short) log_success "kubeadm 설치 완료 - 버전: $kubeadm_version" else exit_on_error "kubeadm 설치 실패" fi if command -v kubectl >/dev/null 2>&1; then kubectl_version=$(kubectl version --client -o yaml 2>/dev/null | grep gitVersion | cut -d'"' -f4) log_success "kubectl 설치 완료 - 버전: $kubectl_version" else exit_on_error "kubectl 설치 실패" fi # 버전 일관성 검증 if [[ "$kubelet_version" == *"1.27.2"* ]] && [[ "$kubeadm_version" == *"1.27.2"* ]] && [[ "$kubectl_version" == *"1.27.2"* ]]; then log_success "모든 Kubernetes 패키지 버전 일관성 확인 (v1.27.2)" else exit_on_error "Kubernetes 패키지 버전 불일치" fi log_success "======== [2단계] Kubernetes 패키지 설치 완료 ========" confirm_continue # ============================================ # 3. 클러스터 초기화 # ============================================ log_step "======== [3단계] 클러스터 초기화 ========" log_info "클러스터 초기화 설정:" log_info "- Pod 네트워크 CIDR: 20.96.0.0/16" log_info "- API 서버 주소: 192.168.56.30" log_info "- Kubernetes 버전: v1.27.2" log_warning "클러스터 초기화는 시간이 소요될 수 있습니다 (약 2-5분)..." log_info "kubeadm으로 클러스터 초기화 중..." kubeadm init \ --pod-network-cidr=20.96.0.0/16 \ --apiserver-advertise-address=192.168.56.30 \ --kubernetes-version=v1.27.2 if [ $? -ne 0 ]; then exit_on_error "클러스터 초기화 실패" fi log_success "클러스터 초기화 완료!" log_info "kubectl 사용을 위한 설정 중..." mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config log_info "======== [3단계] 검증 시작 ========" # kubectl 설정 파일 검증 if [ -f "$HOME/.kube/config" ]; then log_success "kubectl 설정 파일 생성 완료" else exit_on_error "kubectl 설정 파일 생성 실패" fi # 클러스터 연결 테스트 log_info "클러스터 연결 테스트 중..." if kubectl cluster-info >/dev/null 2>&1; then log_success "클러스터 연결 테스트 성공" else exit_on_error "클러스터 연결 테스트 실패" fi # 노드 상태 확인 log_info "노드 상태 확인 중..." node_status=$(kubectl get nodes --no-headers | awk '{print $2}') if [[ "$node_status" == *"Ready"* ]] || [[ "$node_status" == *"NotReady"* ]]; then log_success "마스터 노드 등록 완료 (상태: $node_status)" if [[ "$node_status" == *"NotReady"* ]]; then log_warning "노드가 NotReady 상태입니다. Pod 네트워크 설치가 필요합니다." fi else exit_on_error "노드 상태 확인 실패" fi log_success "======== [3단계] 클러스터 초기화 완료 ========" confirm_continue # ============================================ # 4. Pod 네트워크 설치 (Calico) # ============================================ log_step "======== [4단계] Pod 네트워크 설치 (Calico) ========" log_info "Calico Pod 네트워크 설치 중..." log_info "- Calico는 Pod 간 네트워크 통신을 가능하게 합니다" log_info "- 설치 후 노드가 Ready 상태가 됩니다" kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico.yaml if [ $? -ne 0 ]; then exit_on_error "Calico 기본 설치 실패" fi kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/calico-3.26.4/calico-custom.yaml if [ $? -ne 0 ]; then exit_on_error "Calico 커스텀 설정 실패" fi log_success "Calico Pod 네트워크 설치 완료" log_info "마스터 노드에서 Pod 실행 허용 설정 중..." kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane- if [ $? -ne 0 ]; then log_warning "마스터 노드 taint 제거 실패 (이미 제거되었을 수 있음)" else log_success "마스터 노드에서 Pod 실행 허용 설정 완료" fi log_info "======== [4단계] 검증 시작 ========" log_info "Pod 네트워크 구성 요소 확인 중..." log_info "Calico Pod들이 Running 상태가 될 때까지 대기합니다 (최대 3분)..." # Calico Pod 상태 확인 (최대 3분 대기) for i in {1..18}; do calico_pods=$(kubectl get pods -n kube-system -l k8s-app=calico-node --no-headers 2>/dev/null | grep -c "Running") if [ "$calico_pods" -gt 0 ]; then log_success "Calico Pod 실행 중 ($calico_pods개)" break fi if [ $i -eq 18 ]; then log_warning "Calico Pod 상태 확인 시간 초과" fi echo -n "." sleep 10 done # 노드 상태 재확인 (Pod 네트워크 설치 후) log_info "노드 Ready 상태 확인 중..." for i in {1..12}; do node_status=$(kubectl get nodes --no-headers | awk '{print $2}') if [[ "$node_status" == *"Ready"* ]] && [[ "$node_status" != *"NotReady"* ]]; then log_success "노드가 Ready 상태입니다!" break fi if [ $i -eq 12 ]; then log_warning "노드가 아직 NotReady 상태입니다. 시간이 더 필요할 수 있습니다." fi echo -n "." sleep 10 done log_success "======== [4단계] Pod 네트워크 설치 완료 ========" # ============================================ # 5. 편의 기능 설치 # ============================================ log_step "======== [5단계] 편의 기능 설치 ========" log_info "kubectl 자동완성 기능 설치 중..." yum -y install bash-completion log_info "kubectl 별칭 및 자동완성 설정 중..." echo "source <(kubectl completion bash)" >> ~/.bashrc echo 'alias k=kubectl' >> ~/.bashrc echo 'complete -o default -F __start_kubectl k' >> ~/.bashrc log_info "Kubernetes Dashboard 설치 중..." kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/dashboard-2.7.0/dashboard.yaml log_info "Metrics Server 설치 중..." kubectl create -f https://raw.githubusercontent.com/k8s-1pro/install/main/ground/k8s-1.27/metrics-server-0.6.3/metrics-server.yaml log_success "======== [5단계] 편의 기능 설치 완료 ========" # ============================================ # 최종 검증 및 완료 # ============================================ log_step "======== 최종 클러스터 상태 검증 ========" log_info "전체 클러스터 상태 요약:" echo "================================================" # 클러스터 정보 log_info "클러스터 정보:" kubectl cluster-info --request-timeout=10s 2>/dev/null || log_warning "클러스터 정보 조회 실패" echo "----------------------------------------" # 노드 상태 log_info "노드 상태:" kubectl get nodes -o wide 2>/dev/null || log_warning "노드 상태 조회 실패" echo "----------------------------------------" # 시스템 Pod 상태 log_info "시스템 Pod 상태:" kubectl get pods -n kube-system 2>/dev/null || log_warning "시스템 Pod 상태 조회 실패" echo "----------------------------------------" # 서비스 상태 요약 log_info "핵심 서비스 상태:" echo "- containerd: $(systemctl is-active containerd)" echo "- kubelet: $(systemctl is-active kubelet)" echo "================================================" log_success "========================================" log_success "Kubernetes 클러스터 설치가 완료되었습니다!" log_success "========================================" log_info "다음 명령어로 클러스터 상태를 확인할 수 있습니다:" echo " kubectl get nodes" echo " kubectl get pods -A" echo " kubectl cluster-info" log_info "kubectl 자동완성을 사용하려면 새 터미널을 열거나 다음 명령어를 실행하세요:" echo " source ~/.bashrc" log_info "이제 Kubernetes 클러스터를 사용할 준비가 완료되었습니다!" # join 명령어 추출 및 출력 log_info "======== Worker 노드 추가 정보 ========" log_info "Worker 노드를 추가하려면 다음 명령어를 사용하세요:" if [ -f /tmp/kubeadm-join-command ]; then cat /tmp/kubeadm-join-command else log_info "다음 명령어로 join 토큰을 다시 생성할 수 있습니다:" echo " kubeadm token create --print-join-command" fi이제 2개의 스크립트로 언제든 쿠버네티스를 재구축할 수 있게 되었다.

데브옵스 · 인프라SPG일프로k8sDevOpsSRE

David

[인프런 워밍업 클럽 4기 - DevOPs] 미션 1. 쿠버네티스 설치 구간별 상태 확인

설치 환경칩 : Apple M4 Mac mini메모리 : 16GBmacOS : Sequoia 15.5가상플랫폼 : UTM UTM 설치는https://mac.getutm.app/ 에서 최신 버전을 다운로드 했다.워밍업 스터디가 시작되기 전 강의를 먼저 구매 후 공부중이였기 때문에 이미 한차례 설치를 했지만 추가적으로 복습 겸 설치를 진행 했다. [OS 설치]UTM 실행 -> 새 가상머신 만들기 선택 -> Start(Virtualize 선택) -> Linux 선택 -> 부팅 이미지 (Rocky 9.2)-> 메모리 4096 MB, CPU 4 Cores , 용량은 32GB, 공유 폴더는 선택 안함, -> Summary에서 이름은 ks-master [UTM ›네트워크 설정][Rocky Linux 설정]언어 : 한국어 (대한민국)[시스템]파티션 설정은 자동 구성으로 두고 완료를 선택한다.[KDUMP]Default 값은 활성화 되어 있지만 체크를 해지한다.[네트워크 및 호스트 이름]설정을 누른 후 내용 작성을 진행한다.[사용자 설정 - root 비밀번호]모든 설정이 완료되면 설치 시작(B)를 눌러 설치를 시작한다. (약 4분 소요)...(설치 과정 생략) [iterm을 통한 원격 접속]발생한 메시지는 동일한 IP를 가진 k8s-master 정보가 이미 있기 때문에 호스트 키 불일치를 감지해서 발생했다.이런 경우에는 ssh-keygen -R 명령을 통해 특정 호스트 키만 삭제하고 재접속을 하면 된다.[쿠버네티스 설치 전 환경설정]설치 전 미리 설정이 되어 있는 부분만 별도 스크립트로 작성 및 검증을 하고 쿠버네티스 설치로 넘어간다. 스크립트를 작성한 이유는 재사용성을 위해서 작성했다.[쿠버네티스 설치]

데브옵스 · 인프라KubernetesDevOpsMSAk8s인프런SRE일프로

rhkdtjd_12

[쿠버네티스] Object 그려보며 이해하기-일프로 부족할때 (TS러버)

해당 블로그는 [쿠버네티스 어나더 클래스] 강의에 일부 내용입니다. 복습을 위한 자료 입니다.강의 링크 :https://inf.run/f2xSR1. 쿠버네티스 Object 쿠버네티스는 다양한 Object(리소스)를 통해 앱을 구성하며, 이들을 구분하고 연결하기 위해 Label / Selector 체계를 사용합니다.part-of : 전체 서비스를 대표하는 이름component : 해당 서비스 내에서의 역할name : 앱의 이름instance : 동일 앱의 식별자 (버전별, 목적별)version : 앱의 버전managed-by : 배포 도구(ex. kubectl, helm)이러한 Label들은 selector와 매칭되어 Deployment, Service, HPA 등의 Object 간 연결에 사용됩니다.네이밍 규칙은 공식적으로 정해진 건 없지만, namespace + instance명 기반으로 구성하면중복을 방지하고 유지보수에 유리합니다.2. Deployment 기반 인프라 구성 흐름Deployment → ReplicaSet → Pod → Service↘︎ ConfigMap / Secret / PVCDeployment는 업데이트 전략과 replicas 수를 정의하며,ReplicaSet은 Pod 복제본을 관리하고, Pod가 꺼지면 자동으로 다시 생성합니다.Pod 내부에는 probe, resource, volume, envFrom 설정이 들어가며,필요한 외부 자원은 ConfigMap, Secret, PVC로 관리합니다.3. 쿠버네티스에서 자동화되는 기능Service - 여러 Pod를 하나의 네트워크 단위로 묶어 트래픽 라우팅HPA - CPU 부하에 따라 자동으로 Pod 수 증감 (min/max 설정 가능)Self-Healing - Pod가 죽으면 자동 재시작RollingUpdate - 무중단 배포 + 실패 시 롤백 가능코드 기반 관리 - yaml로 구성되어 변경 이력 추적, 재사용, 환경별 배포가 쉬움 

데브옵스 · 인프라쿠버네티스DevOps

채널톡 아이콘