18. 쿠버네티스_편리한 운영을 위한 오픈소스 솔루션 소개
이번 장에서는 쿠버네티스 관리에 사용할 수 있는 다양한 오픈소스 도구를 소개합니다.
쿠버네티스는 강력한 컨테이너 오케스트레이션 능력으로 인해 다양성과 확장성이 탁월합니다. 하지만 종종 강력함은 복잡함을 동반하기도 합니다. 오픈소스를 사용하여 이러한 복잡한 작업을 좀 더 편리하게 할 수 있습니다.
1. 다양한 Krew 플러그인 리스트
kubectl krew는 쿠버네티스의 커맨드라인 인터페이스인 kubectl을 위한 플러그인 관리자입니다. krew는 쿠버네티스의 활용성을 더욱 확장하고 사용자의 경험을 향상시키는 데 중점을 둡니다.
플러그인은 말 그대로 간단히 1줄의 명령어를 입력(플러그)만으로 여러 도구를 설치, 삭제, 업그레이드를 할 수 있습니다.
krew를 사용하면 플러그인을 검색, 설치, 관리하는 과정이 간단해집니다. 명령어 한 줄로 새로운 플러그인을 발견하고 설치할 수 있으며, 이는 쿠버네티스 환경을 더 빠르고 쉽게 사용자화할 수 있게 해줍니다.
krew는 오픈 소스 커뮤니티에 의해 지원되며, 지속적으로 성장하고 있는 플러그인 생태계를 가지고 있습니다. 이를 통해 사용자들은 다양한 요구 사항에 맞는 플러그인을 찾을 수 있습니다.
krew를 사용하여 쿠버네티스 클러스터 관리가 더욱 효율적이고 간소화됩니다. 일상적인 작업을 자동화하고, 복잡한 명령어를 단순화하여 작업 시간을 절약할 수 있습니다.
설치는 brew를 이용하여 간단합니다.
(필자는 이미 설치되어 있어 출력이 다를 수 있습니다.)
(jerry-test:karpenter)~$ brew install krew ==> Downloading https://formulae.brew.sh/api/formula.jws.json (생략) Warning: krew 0.4.4 is already installed and up-to-date. To reinstall 0.4.4, run: brew reinstall krew
24년 1월 현재 200개가 넘는 다양한 플러그인 도구를 지원하여 필요에 따라 적절하게 선택하면 큰 도움이 됩니다. 필자가 실제 쿠버네티스 관리하면서 잘 사용하고 있는 ‘Krew’ 플러그인 리스트입니다. 아래 도구는 쿠버네티스 플러그인을 편리하게 관리할 수 있는 ‘Krew’를 이용하여 설치합니다.
(jerry-test:default)~$ k krew list PLUGIN VERSION cnpg v1.21.0 ctx v0.9.5 deprecations v1.6.0 df-pv v0.3.0 get-all v1.3.8 krew v0.4.4 neat v2.0.3 ns v0.9.5 stern v1.26.0 view-secret v0.11.0
실제 명령어를 입력하면 해당 명령어에 대한 사용법을 아실 수 있어 실습은 생략하고 설명으로 대체하겠습니다.
cnpg(Cloud Native PostgreSQL) : Kubernetes 클러스터 내에서 PostgreSQL 데이터베이스 관리를 위한 플러그인으로, 데이터베이스 관리 작업을 간소화합니다.
ctx : 쿠버네티스 컨텍스트를 쉽게 전환할 수 있게 해주는 도구로, 다중 클러스터 환경에서 유용합니다. 다중 클러스터를 관리한다고 하면 ‘ns’, ‘kube-ps1’과 더불어 3대 핵심 도구(^^)입니다.
deprecations : 클러스터 업그레이드 작업 시 클러스터의 구성 파일이나 매니페스트에서 이전 API 버전을 식별하는 데 도움을 주는 도구입니다.
df-pv : Persistent Volumes(PV)의 디스크 사용량을 확인할 수 있어 스토리지 관리에 유용합니다. kubectl 네이티브로 포함되어야지 않을까 생각합니다.
get-all : 한 번의 명령으로 여러 쿠버네티스 리소스를 한꺼번에 조회할 수 있는 플러그인입니다. 기존 ‘k get all’ 명령어에 부족한 리소스까지 출력할 수 있습니다.
krew : 쿠버네티스 플러그인 관리자로, 다양한 플러그인을 쉽게 검색하고 설치할 수 있습니다.
neat : YAML 매니페스트 출력을 깔끔하게 정리하여, 필수적이지 않은 정보를 제거합니다.
ns : 쿠버네티스 네임스페이스를 빠르게 전환할 수 있는 도구로, 네임스페이스 관리를 간편하게 해줍니다.
stern :기존 ‘k log’ 명령어로는 단일 파드의 로그만 검색할 수 있는데, stern을 사용하면 여러 파드의 로그를 실시간으로 집계하고 스트리밍하는 데 사용되며, 로그 관리에 매우 유용합니다.
view-secret : 추가 encoding 작업없이 쿠버네티스 시크릿을 쉽게 조회하고 해석할 수 있습니다.
이 외 쿠버네티스 관리 환경을 더욱 편리하게 하는 다양한 Krew 플러그인이 있습니다. 각자 운영 환경에 맞게 적합한 것을 선택하여 사용하는 것을 추천합니다.
2. Polaris를 이용한 컨테이너, 파드 보안 취약점 확인
클라우드 네이티브 환경에서 보안은 가장 중요한 고려 사항 중 하나입니다. 쿠버네티스는 강력하고 유연한 컨테이너 오케스트레이션 툴이지만, 잘못 구성된 클러스터는 심각한 보안 취약점으로 이어질 수 있습니다. Polaris는 쿠버네티스 클러스터의 구성을 검사하고, 보안상의 개선사항을 추천하여 클러스터를 더 안전하게 만들어주는 오픈 소스 도구입니다.
쿠버네티스의 보안 취약점을 확인하고 개선하는 용도로 ‘kubescape’ 등 다양한 도구가 있지만 ‘Polaris’는 손쉽게 사용할 수 있고 발견된 취약점을 조치하기 쉽도록 GUI를 제공하여 사용하기 편리합니다.
폴라리스는 쿠버네티스의 Best Practices에 대한 명확한 지침을 제공하며, 클러스터 관리자가 이를 따를 수 있도록 지원합니다. 가독성이 높은 보고서를 제공하여, 개선사항을 쉽게 식별하고 우선 순위를 정할 수 있습니다. 또한 Polaris는 Jenkins, CircleCI 등과 같은 CI/CD 파이프라인과 통합되어, 코드 배포 전에 보안 체크를 자동으로 수행할 수 있습니다.
애플리케이션 설치 시 주로 해당 솔루션 제공 업체의 헬름 차트를 이용하여 설치합니다. 하지만 이러한 공식 헬름 차트도 보안 측면에서 부족한 부분이 있습니다. 폴라리스는 모범 사례 기준으로 12개 이상의 검사를 실시합니다.
그럼 실습으로 알아보겠습니다. 헬름 기반으로 Polaris를 설치합니다.
(jerry-test:kubecost)polaris$ helm repo add fairwinds-stable https://charts.fairwinds.com/stable "fairwinds-stable" has been added to your repositories (jerry-test:kubecost)polaris$ helm pull fairwinds-stable/polaris (jerry-test:kubecost)polaris$ tar xvfz polaris-5.16.0.tgz (jerry-test:kubecost)polaris$ rm -rf polaris-5.16.0.tgz (jerry-test:kubecost)polaris$ mv polaris polaris-5.16.0 (jerry-test:kubecost)polaris$ cd polaris-5.16.0/ (jerry-test:kubecost)polaris-5.16.0$ cp values.yaml ci/my-values.yaml
기본 제공되는 Values.yaml 파일에서 아래와 같이 리소스 관련 설정만 변경하여 my-values.yaml 파일을 생성합니다.
dashboard: resources: requests: cpu: 10m memory: 512Mi
Polaris 네임스페이스에 설치를 시작합니다.
(jerry-test:kubecost)polaris-5.16.0$ helm install polaris --namespace polaris --create-namespace -f ci/my-values.yaml . NAME: polaris LAST DEPLOYED: Sun Nov 5 01:12:13 2023 NAMESPACE: polaris STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: ** Please be patient while the chart is being deployed ** Enjoy Polaris and smooth sailing! To view the dashboard execute this command: kubectl port-forward --namespace polaris svc/polaris-dashboard 8080:80 Then open http://localhost:8080 in your browser.
설치가 완료되면 정상적으로 파드가 실행됩니다.
(jerry-test:kubecost)polaris-5.16.0$ k ns polaris Context "jerry-test" modified. Active namespace is "polaris". (jerry-test:polaris)polaris-5.16.0$ k get pod NAME READY STATUS RESTARTS AGE polaris-dashboard-677d5f7488-lmbhp 1/1 Running 0 51s polaris-dashboard-677d5f7488-xzfnm 1/1 Running 0 51s
‘port-forward’ 명령어를 이용하여 폴라리스 대시보드에 접속합니다.
(jerry-test:polaris)polaris-5.16.0$ k get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE polaris-dashboard ClusterIP 172.20.50.177 <none> 80/TCP 10m (jerry-test:polaris)polaris-5.16.0$ k port-forward svc/polaris-dashboard 8080:80 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080
- Score
Best Practice 대비 전체 클러스터 구성 내역을 쉽게 점수로 환산하여 보여줍니다. 권고 사항에 따라 수정하면 점수가 상승합니다. - Passing/Warning/Dangerous Checks
폴라리스는 위험도를 등급 별로 나누어서 현재 구성의 취약점을 구분합니다. 불가피한 예외 설정을 제외하고 위험(dangerous) 단계 취약점은 수정하는 것을 권고합니다.
이제 설치한 애플리케이션의 취약점을 확인할 수 있어, 세부 취약점 별로 필요한 조치를 취할 수 있습니다.
아래 예제는 Redis 애플리케이션의 취약점과 조치 방법 예제입니다.
추가 링크를 확인하면 자세한 조치 방법을 확인할 수 있습니다.
3. 터미널에서 쿠버네티스를 마스터하는 법: K9s 소개
OpenLens와 더불어 로컬 환경에서 쿠버네티스 관리 콘솔 용도로 많이 사용하는 K9s 입니다.
K9s는 간편한 CLI 인터페이스를 지원하여 복잡한 쿠버네티스 명령어를 간소화하고 사용자가 클러스터를 쉽고 빠르게 관리할 수 있게 해줍니다. 그리고 클러스터의 실시간 상태를 모니터링할 수 있어, 팟(Pod), 노드, 서비스 등의 상태를 실시간으로 확인할 수 있습니다.
‘kubectl’ 명령어에 익숙하지 않은 개발자들은 클러스터 내의 애플리케이션 로그를 쉽게 확인하고, 문제 해결 및 디버깅을 위한 로그 분석이 용이하여 자주 사용하는 편입니다.
K9s 설치하는 방법입니다. ‘brew’ 사용하여 손쉽게 설치 가능합니다.
(jerry-test:default)~$ brew install derailed/k9s/k9s Running `brew update --auto-update`... ==> Auto-updated Homebrew! Updated 4 taps (derailed/k9s, aws/tap, homebrew/core and homebrew/cask). ==> New Formulae ain bomber dicebear invoice noir python-docopt scikit-image apkleaks certgraph dockerfile-language-server libjuice orbuculum python-mako signmykey appstream certsync frozen libsail osctrl-cli raven tailspin authz0 cfripper gittuf mediamtx phylum-cli redwax-tool tlrc bao der-ascii graphqlviz modsurfer presenterm regclient vet ==> New Casks clibor deveco-studio gstreamer-development gstreamer-runtime keymapp metamer mitmproxy music-decoy orka3 You have 29 outdated formulae installed. k9s 0.27.4 is already installed but outdated (so it will be upgraded). ==> Fetching derailed/k9s/k9s ==> Downloading https://github.com/derailed/k9s/releases/download/v0.28.0/k9s_Darwin_arm64.tar.gz ==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/167596393/64f86002-bb1b-41f0-9f83-89fba643aaf2?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231109%2Fus-east-1%2Fs3%2 ############################################################################################################################################################################################################################################## 100.0% ==> Upgrading derailed/k9s/k9s 0.27.4 -> 0.28.0 🍺 /opt/homebrew/Cellar/k9s/0.28.0: 5 files, 65.3MB, built in 3 seconds ==> Running `brew cleanup k9s`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). Removing: /opt/homebrew/Cellar/k9s/0.27.4... (5 files, 64.2MB) Removing: /Users/jerry/Library/Caches/Homebrew/k9s--0.27.4.tar.gz... (17.9MB)
필자는 클러스터 업그레이드, 노드 Drain 작업 시 전체 파드의 현재 상태를 파악하는 용도로 많이 사용합니다.
아래와 같이 파드 모니터링 화면에서 ‘0’를 입력하면 특정 네임스페이스가 아닌 전체 네임스페이스 파드의 현황을 확인할 수 있습니다.
이어지는 화면에서 <Shift> + ‘s’ 키를 입력하면 아래와 같이 아래와 같이 현재 상태(‘STATUS’)를 기준으로 파드를 정렬할 수 있습니다. 이 후 ‘k drain’ 명령어로 특정 노드를 Drain 하면 변화하는 파드의 상태를 확인할 수 있습니다. 특정 파드가 실행이 되지 않거나 Pending 되는 상태를 파악할 수 있어 작업의 정상 종료 유무를 편리하게 파악할 수 있습니다.
K9s는 쿠버네티스 클러스터 관리를 효율적으로 만들어 주는 강력한 도구로, 복잡한 클러스터 환경에서의 작업을 단순화하고 속도를 높여주어 많이 사용하는 도구입니다.
4. 쿠버네티스 자원 사용량 확인 – Metrics-Server
쿠버네티스를 사용하면 필수로 같이 사용하는 Metrics-Server의 설치 방법을 간단히 알아봅니다. Metrics-Server는 HPA 적용 시 파드의 자원 사용량에 필요한 사전 요소이기도 합니다.
Metrics-Server 설치는 매니페스트 YAML 파일로 설치도 가능하지만 향후 관리 편의를 위하여 헬름을 이용하여 설치하는 것을 권고합니다.
(jerry-test:default)foo$ helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/ "metrics-server" has been added to your repositories (jerry-test:default)metrics-server-3.10.0$ helm pull metrics-server/metrics-server
(jerry-test:kube-system)metrics-server-3.11.0$ helm install metrics-server -f ci/ci-values.yaml . NAME: metrics-server LAST DEPLOYED: Thu Nov 9 16:04:13 2023 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: *********************************************************************** * Metrics Server * *********************************************************************** Chart version: 3.11.0 App version: 0.6.4 Image tag: registry.k8s.io/metrics-server/metrics-server:v0.6.4 ***********************************************************************
kube-system 네임스페이스에 metrics-server 파드가 정상으로 실행됩니다.
(jerry-test:kube-system)metrics-server-3.11.0$ k get pod --selector app.kubernetes.io/name=metrics-server NAME READY STATUS RESTARTS AGE metrics-server-966ddf79d-4z7mj 1/1 Running 0 73s
이 후 노드와 파드의 cpu, memory 리소스 사용량을 ‘k top’ 명령어로 편리하게 파악할 수 있습니다.
(jerry-test:kube-system)metrics-server-3.11.0$ k top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% ip-10-110-22-92.ap-northeast-2.compute.internal 110m 5% 2543Mi 35% ip-10-110-29-227.ap-northeast-2.compute.internal 119m 6% 1041Mi 71% ip-10-110-32-197.ap-northeast-2.compute.internal 39m 2% 677Mi 46%
(jerry-test:kube-system)metrics-server-3.11.0$ k top pods NAME CPU(cores) MEMORY(bytes) aws-load-balancer-controller-847fd69fdd-m5sgx 3m 28Mi aws-load-balancer-controller-847fd69fdd-mhtz2 1m 20Mi aws-node-8n5xr 4m 59Mi aws-node-pl56t 4m 63Mi aws-node-sljqx 4m 53Mi coredns-7598c7588c-pbflr 2m 18Mi coredns-7598c7588c-scfnh 2m 18Mi ebs-csi-controller-7f8787d56d-9tpl5 3m 59Mi ebs-csi-controller-7f8787d56d-d857m 4m 56Mi ebs-csi-node-gjkqt 2m 32Mi ebs-csi-node-q49sb 1m 21Mi ebs-csi-node-x9tnj 1m 32Mi external-dns-5555f6796f-zltdz 1m 18Mi kube-proxy-b5tm2 1m 19Mi kube-proxy-c7l5w 1m 21Mi kube-proxy-d2mfw 1m 15Mi metrics-server-966ddf79d-4z7mj 3m 17Mi
이상으로 이번 장에서 쿠버네티스 환경에서 편리하게 사용할 수 있는 오픈 소스 도구를 알아보았습니다.
해당 기술 블로그에 질문이 있으시면 언제든지 문의해 주세요. 직접 답변해 드립니다.
k8sqna@jennifersoft.com