반응형

/etc/kubernetes/pki/

  • 클러스터 레벨 인증서 저장소 (클러스터 전체에서 사용하는 공통 인증서)
  • 즉, Control Plane 컴포넌트들을 위한 인증서와 키 보관

주요 파일들은 다음과 같다.

  • ca.crt, ca.key: 클러스터 루트 CA
  • apiserver.crt, apiserver.key: API 서버 인증서
  • apiserver-kubelet-client.crt: API 서버가 kubelet 과 통신할 때 사용
  • front-proxy-ca.crt, front-proxy-client.crt: 프론트 프록시용
  • etcd/서브디렉토리: etcd 관련 인증서들

/var/lib/kubelet/pki/

  • 노드별 kubelet 전용 인증서 저장소 (각 노드마다 고유한 내용)
  • 해당 특정 노드의 kubelet 만을 위한 인증서

주요 파일들은 다음과 같다.

  • kubelet.crt, kubelet.key - 해당 노드 kubelet의 서버 인증서
  • kubelet-client-current.pem - kubelet이 API 서버에 클라이언트로 접근할 때 사용

 

그렇다면 /var/run/secrets/kubernetes.io 폴더는 어떤 폴더일까요? 다음에 기재됩니다.

반응형

'인프라 > 쿠버네티스' 카테고리의 다른 글

helm 명령어 정리  (0) 2025.07.01
Kubernetes Network Policy  (0) 2025.06.23
cgroup 의 이해  (1) 2025.06.06
kubernetes 테스트 환경 구축  (0) 2025.06.03
쿠버네티스 정의 / 구조 / 실행 흐름  (0) 2024.07.20
반응형

helm 명령어 도움

helm 가이드

helm completion

helm 자동완성

source <(helm completion bash)

 

레포지토리 조회 / 삭제 / 추가

로컬에 등록된 저장소 내부에서 검색

helm search repo

hub 검색

helm search hub

레포지토리 URL 추가

helm repo add {name} {url}

레포지토리 리스트 확인

helm repo list

 

레포지토리 업데이트

helm repo update

 

Chart 설치 / 삭제 / 조회

Chart 설치

helm install {차트 이름} {설치 대상 차트}

Chart 삭제

helm uninstall {차트 이름}

Chart 조회

helm list

Chart 상태 확인

helm status
반응형
반응형

 

문제

app 네임스페이스에서 나가는 모든 traffic을 차단 

apiVersion: networking.k8s.io/v1    
kind: NetworkPolicy                 
metadata:                           
  name: deny-out                    # 네트워크 정책의 이름은 'deny-out'
  namespace: app                    # 적용될 네임스페이스는 'app'
spec:                               
  podSelector: {}                   # 모든 파드를 대상으로 하는 선택자
  policyTypes:                      
    - Egress                        # 아웃바운드(밖으로 나가는) 트래픽에만 적용

 

app 네임스페이스의 모든 파드에 대해 포트 53을 사용하는 TCP 및 UDP 아웃바운드 트래픽만을 허용

apiVersion: networking.k8s.io/v1  
kind: NetworkPolicy                 # 네트워크 정책 리소스 종류
metadata:                           
  name: deny-out                    # 네트워크 정책의 이름
  namespace: app                    # 적용될 네임스페이스
spec:                               
  podSelector: {}                   # 모든 파드를 대상으로 하는 선택자
  policyTypes:                      
  - Egress                          # 아웃바운드(밖으로 나가는) 트래픽에 적용
  egress:                           
  - ports:                          
    - port: 53                      # 포트 53을 사용하는 TCP 트래픽 허용
      protocol: TCP                 
    - port: 53                      # 포트 53을 사용하는 UDP 트래픽 허용
      protocol: UDP

 


 

특정 pod가 메타데이터 서버로 접근 못하게끔하는 네트워크 정책

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: metadata-server                # 정책 이름: metadata-server
  namespace: default                   # 적용 네임스페이스: default
spec:
  podSelector:
    matchLabels:
      trust: nope                      # 레이블 'trust: nope'을 가진 파드 대상
  policyTypes:
    - Egress                           # 아웃바운드 트래픽 제어
  egress:
    - to:
        - ipBlock:
            cidr: 0.0.0.0/0            # 모든 IP 범위 대상 (인터넷 전체)
            except: 
            - 1.1.1.1/32               # 1.1.1.1 주소를 제외

 

default 네임스페이스 내에서 'trust: nope' 레이블을 가진 모든 파드가 1.1.1.1 주소를 제외한 모든 대상으로의 아웃바운드 트래픽을 허용한다.


 

How many network policies do you see in the environment? ( Network Policy 조회 )

- kubectl get networkpolicies

Create a network policy to allow traffic from the Internal application only to the payroll-service and db-service.(Network Policy 생성하기, internal 레이블을 가진 파드는 mysql 파드의 3306 포트 및 payroll 파드의 8080 포트로만 접근할 수 있게 만들기)

 

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - {}
  egress:
    - to:
      - podSelector:
          matchLabels:
            name: mysql
      ports:
        - protocol: TCP
          port: 3306
    - to:
      - podSelector:
          matchLabels:
            name: payroll
      ports:
        - protocol: TCP
          port: 8080
    - ports:
      - port: 53
        protocol: UDP
      - port: 53
        protocol: TCP
반응형

반응형

 

Cgroup (Container Group)

  • 다수의 Process가 포함되어 있는 Process Group
  • 해당 Process Group 이 사용할 Resource (CPU, Memory, Disk, Network) 사용량 제한

컨테이너 상에서 Cgroup

  • Container가 생성된다면 생성된 Container의 Process들을 담당하는 Container Cgroup이 생성
  • Container의 모든 Process들은 해당 Container Cgroup에 소속 (추가 생성되는 프로세스 포함)

컨테이너 관리도구가 Cgroup 제어하는 방법

Cgroup을 제어하는 방법은 cgroupfs을 이용하는 방법과 systemd에서 제공하는 API를 사용하는 방법 2가지가 존재

 

Cgroupfs을 이용하는 방법

  • Linux에서 Cgroup을 제어할 때 사용하는 방식
  • Linux Kernel 내부에 관리하고 있는 특수 파일 시스템
  • systemd는 cgroupfs을 /sys/fs/cgroup 하위 경로에 Mount
  • cgroup 이 Resource Type 별로 존재
  • cgroupfs 경로에 Directory를 생성하여 cgroup 생성 (Directory 구조처럼 Tree 형태)

systemd에서 제공하는 API를 사용하는 방법

  • Linux의 Init Process로써 Daemon Process 제어 역할과 더불어 Cgroup을 제어하는 역할도 수행
  • systemd는 생성한 Unit의 Cgroup을 기본적으로 /sys/fs/cgroup/memory/system.slice 경로의 하위에 생성
  • systemd의 Unit은 systemd가 제어하는 Daemon Process
  • systemd-run --unit=myunit sleep infinity 명령어로 unit 생성 가능

cgroup driver 분석

  • group Driver는 cgroupfs Driver와 systemd Driver 로 구성
  • cgroupfs Driver는 자신이 직접 cgroupfs을 통해서 Cgroup을 제어
  • systemd Driver는 systemd를 통해서 Cgroup을 제어
  • 어떤 Cgroup Driver를 사용할지는 kubelet과 Docker Daemon에 각각 결정. 두 Cgroup Driver는 반드시 동일해야 함
반응형
반응형

구성

마스터 노드와 워커 노드, 사설 DNS 노드로 구성한다.

 

IP 대역

192.168.0.0/24 bridge

 

사설 dns 노드

  • 스펙 (cpu 1코어 / ram 2GB(2048) / 25GB) 
  • apt update
  • apt install bind9 bindutils -y
  • vim /etc/bind/named.conf.options
options {
	directory "/var/cache/bind";
    
    listen-on { any; };
    allow-query { 192.168.0.0/24; };
    
    recursion yes;
    allow-recursion { 192.168.0.0/24; };
    
    forwarders {
    	8.8.8.8;
        8.8.4.4;
    }
    dnssec-validation no;
    listen-on-v6 { none; };
}

 

  • vim /etc/bind/named.conf.local
zone "demo.test" {
	type master;
    file "/etc/bind/zones/demo.test";
};
  • mkdir /etc/bind/zones
  • vim /etc/bind/zones/demo.test
$TTL	60
@	IN	SOA	ns.demo.test.	admin.demo.test.	(
                    3			; Serial
                    120			; Refresh
                    60			; Retry
                    2419200		; Expire
                    60 )		; Negative Cache TTL
;
@	IN	NS	ns
NS	IN	A	192.168.0.8
*	IN	A	192.168.0.3

 

마스터 노드

  • cpu 2코어 / ram 4GB(4096)

워커 노드

  • cpu 4코어 / ram 8GB(8192)
  • 마스터노드 clone 후 ip 변경
    • vim /etc/netplan/50-cloud-init.yaml 에서 ip 수정 && hostnamectl set-hostname worker --static

 

마스터 노드 && 워커노드 공통 구성

  • https://v1-32.docs.kubernetes.io/docs/setup/production-environment/container-runtimes/#prerequisite-ipv4-forwarding-optional
  • containerd 설치
    • wget https://github.com/containerd/containerd/releases/download/v버전/containerd-버전-linux-아키텍처.tar.gz
    • wget tar Cxzvf /usr/local containerd-버전-linux-아키텍처.tar.gz
    • wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service -P /usr/local/lib/systemd/system/
    • [ 참고 ] https://github.com/containerd/containerd/blob/main/docs/getting-started.md
  • runc 설치
    • wget https://github.com/opencontainers/runc/releases/download/v버전/runc.아키텍처 -O /usr/local/sbin/runc
      • https://github.com/opencontainers/runc/releases 에서 runc 버전 및 아키텍처 확인
    • chmod 755 /usr/local/sbin/runc
    • systemctl restart containerd

 

  • containerd 설정
    • mkdir -p /etc/containerd
    • containerd config default > /etc/containerd/config.toml
    • (선택) https://v1-32.docs.kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd-systemd
    • 스왑 메모리 설정
      •  /etc/fstab swap 부분 주석 처리
      • 재부팅 이후 swapon --show 결과 없음 확인
      • [ 참고 ] https://v1-32.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#swap-configuration
  • kubectl kubeadm kubelet 설치
    • [ 참고 ] https://v1-32.docs.kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#swap-configuration

 

마스터 노드 구성

 

  • kubeadm init --apiserver-advertise-address 192.168.0.2 --service-cidr="10.254.0.0/16" --pod-network-cidr="10.100.0.0/16"
  • mkdir -p $HOME/.kube
  • cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • chown $(id -u):$(id -g) $HOME/.kube/config

워커 노드 연결

  • kubeadm join 마스터노드:6443 --token 토큰값 \
            --discovery-token-ca-cert-hash sha256:해시값

편의성 제공

  • https://v1-32.docs.kubernetes.io/docs/reference/kubectl/quick-reference/#kubectl-autocomplete

 

CNI 설치

  • https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico
반응형

'인프라 > 쿠버네티스' 카테고리의 다른 글

/etc/kubernetes/pki/ vs /var/lib/kubelet/pki/ 차이점  (0) 2025.07.02
helm 명령어 정리  (0) 2025.07.01
Kubernetes Network Policy  (0) 2025.06.23
cgroup 의 이해  (1) 2025.06.06
쿠버네티스 정의 / 구조 / 실행 흐름  (0) 2024.07.20

+ Recent posts