실전 과제 — 클러스터 구성
- 차트를 파일로만 뽑으라는 과제는
helm template으로 끝난다. CRD를 빼는 옵션은 차트마다 달라helm show values에서 찾는다. - CNI를 고르라는 과제는 요구 기능으로 가른다. NetworkPolicy를 적용해야 하면 Flannel은 답이 아니다.
- 노드 준비 과제는 “지금 적용”과 “재부팅 뒤에도 유지”를 둘 다 해야 끝난다.
- CRD의 필드 설명은
kubectl explain으로 읽고, 출력을 그대로 파일에 저장한다.
과제는 연습용으로 만든 시나리오이고 이름과 값은 예시다. 과제마다 조건 → 풀이 → 확인 → 함정 순서로 읽고, 원리는 링크한 개념 페이지에서 확인한다. 호스트 접속과 네임스페이스 확인은 문제마다 반복하는 3단계를 따른다.
Helm 차트를 CRD 없이 파일로 렌더하기
섹션 제목: “Helm 차트를 CRD 없이 파일로 렌더하기”과제
- External Secrets Operator의 공식 차트 저장소
https://charts.external-secrets.io를eso라는 이름으로 등록한다. - 차트 버전 2.10.0을 네임스페이스
external-secrets기준으로 렌더해~/eso.yaml에 저장한다. - CRD는 클러스터에 이미 설치되어 있으므로 결과에 넣지 않는다.
풀이
-
저장소를 등록하고 버전이 있는지 본다.
터미널 창 helm repo add eso https://charts.external-secrets.iohelm repo updatehelm search repo eso/external-secrets --versions | head -5 -
CRD를 끄는 값을 찾는다. 키 이름은 차트마다 다르다.
터미널 창 helm show values eso/external-secrets --version 2.10.0 | grep -n -i crd# 57:installCRDs: true -
버전·네임스페이스·값을 지정해 렌더하고 파일로 보낸다.
터미널 창 helm template external-secrets eso/external-secrets \--version 2.10.0 \--namespace external-secrets \--set installCRDs=false > ~/eso.yaml -
결과를 확인한다.
터미널 창 grep -c 'kind: CustomResourceDefinition' ~/eso.yaml # 0grep -m1 'helm.sh/chart' ~/eso.yaml # external-secrets-2.10.0grep -m1 'namespace:' ~/eso.yaml # external-secrets
두 방법의 차이는 차트의 CRD를 넣고 빼기에서 본다.
NetworkPolicy를 지원하는 CNI 골라 설치하기
섹션 제목: “NetworkPolicy를 지원하는 CNI 골라 설치하기”과제
- 클러스터에 CNI가 없어 노드가
NotReady다. 지문이 제시한 Flannel과 Calico 중 하나를 골라 설치한다. - 설치한 CNI는 NetworkPolicy를 자체적으로 적용할 수 있어야 한다.
- 두 후보의 매니페스트 주소는 지문에 주어진다.
풀이
-
요구 기능으로 후보를 가른다. Flannel은 NetworkPolicy를 적용하지 않으므로 Calico를 고른다.
-
클러스터의 Pod 대역을 확인한다. CNI 쪽 설정과 맞아야 한다.
터미널 창 kubectl get configmap kubeadm-config -n kube-system \-o jsonpath='{.data.ClusterConfiguration}' | grep podSubnet -
오퍼레이터 매니페스트를
create로 넣는다.<주소>는 지문의 값이다.터미널 창 kubectl create -f <tigera-operator 매니페스트 주소>kubectl get pods -n tigera-operator -
Installation리소스를 넣는다. 오퍼레이터는 이 리소스를 보고 Calico를 설치한다. Pod 대역을 2단계 값으로 맞춘 뒤 적용한다. 전체 순서는 CNI 설치의 예와 같다. -
Calico Pod과 노드 상태를 확인한다.
터미널 창 kubectl get pods -n calico-systemkubectl get nodes # Ready
CNI별 NetworkPolicy 지원 여부는 CNI — 누가 네트워크를 만드는가의 표에 있다.
cri-dockerd 설치와 커널 파라미터 설정으로 노드 준비하기
섹션 제목: “cri-dockerd 설치와 커널 파라미터 설정으로 노드 준비하기”과제
- 노드에 Docker Engine이 설치되어 있다. 홈 디렉터리의
cri-dockerd.deb패키지를 설치한다. - cri-dockerd 서비스를 지금 시작하고, 부팅 때도 자동으로 시작되게 한다.
- 다음 커널 파라미터를 1로 설정하고 재부팅 뒤에도 유지되게 한다.
net.ipv4.ip_forward,net.bridge.bridge-nf-call-iptables,net.bridge.bridge-nf-call-ip6tables
풀이
-
패키지를 설치한다.
dpkg -i는 저장소를 거치지 않고 로컬.deb파일을 설치한다.터미널 창 sudo dpkg -i ~/cri-dockerd.deb -
서비스를 켜고 부팅 등록까지 한다.
enable은 부팅 등록,--now는 지금 시작이다.터미널 창 sudo systemctl enable --now cri-docker.servicesystemctl is-enabled cri-docker.service # enabledsystemctl is-active cri-docker.service # active -
브리지 관련 키가 생기도록 커널 모듈을 올린다.
터미널 창 sudo modprobe br_netfilter -
파라미터를 파일에 쓰고 적용한다. 키 이름은 지문에서 그대로 옮긴다.
터미널 창 cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.ipv4.ip_forward = 1net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1EOFsudo sysctl --system -
현재 값을 확인한다.
터미널 창 sysctl net.ipv4.ip_forward net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables
cri-dockerd가 필요한 이유는 Docker Engine을 쓸 때 — cri-dockerd, 파라미터의 뜻은 노드 준비에서 본다.
설치된 CRD 목록과 필드 문서를 파일로 저장하기
섹션 제목: “설치된 CRD 목록과 필드 문서를 파일로 저장하기”과제
- 클러스터에 설치된 Gateway API의 CRD 목록을
~/gateway-crds.txt에 저장한다. - HTTPRoute의
spec.hostnames필드 문서를~/httproute-hostnames.txt에 저장한다.
Gateway API CRD가 설치된 클러스터를 전제로 한다. 다른 오퍼레이터의 CRD로 바꿔도 방법은 같다.
풀이
-
CRD 이름에 들어 있는 API 그룹으로 걸러 저장한다. CRD 이름은
<복수형>.<그룹>형식이다.터미널 창 kubectl get crd | grep gateway.networking.k8s.io > ~/gateway-crds.txt -
필드 문서를
explain으로 뽑아 저장한다.터미널 창 kubectl explain httproute.spec.hostnames > ~/httproute-hostnames.txt -
두 파일을 열어 내용이 들어갔는지 본다.
터미널 창 cat ~/gateway-crds.txthead ~/httproute-hostnames.txt# GROUP: gateway.networking.k8s.io# KIND: HTTPRoute# VERSION: v1# FIELD: hostnames <[]string>
CRD를 조회하는 명령은 설치된 CRD 살펴보기에 모아 두었다.