선릉역 1번 출구

kubernetes security 실습 본문

Computer/Docker

kubernetes security 실습

choideu 2024. 7. 25. 21:31

하나의 커다란 cluster 운영 시 생기는 문제점 多

└ kubernetes를 논리적으로 분할 = Namespace

 

namespace 정의

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace

구조가 간단함, 별도로 정의하여야 하는 속성은 없음

※ 네임스페이스가 삭제되면 해당 네임스페이스에 속한 모든 객체가 같이 삭제됨

 

Pod 생성 시 namespace 지정 방법

apiVersion: v1
kind: Pod
metadata:
  name: my-simple-pod
  namespace: dev
spec:
  containers:
  - name: my-container
  image: nginx

 

- 특정 Namespace의 Pod 조회

kubectl -n dev get pods

- 모든 Namespace의 Pod 조회

kubectl get pods --all-namespaces

타 Namespace 간의 통신을 Network Policy를 사용하여 제한 가능

 

NetworkPolicy

  • Ingress/Egress 규칙 지정 가능
  • Whitelist 방식으로, 지정하지 않은 대상은 모두 호출이 거부됨

ServiceAccount와 RBAC

Account  설명
User Account 사람이 사용하는 계정
Service Account 애플리케이션이나 프로세스가 사용하는 계정
- 실행중인 프로세스가 동적으로 쿠버네티스에 작업을 하거나, api 요청 권한을 받는 것
(정적으로 정의되는 yaml 파일에 대해서는 service account가 관여하지 않음)

 

Role

  • 어떤 객체에 대한 작업 권한의 집합
  • cluster role: 클러스터 전체에 영향을 주는 객체들에 대한 권한

※ 같은 Namespace에 위치하는 Account와 Role을 연결 할 수 있음


상황 1. namespace 생성 후 pod을 배치하고, 해당 namespace 삭제

 

① namespace yaml 파일 생성

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
  labels:
    profile: sample

 

② 해당 namespace에 pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: my-namespace-pod
  namespace: my-namespace
spec:
  containers:
  - name: nginx
    image: nginx

 

③ 해당 namespace에 위치한 pod 조회 후, namespace 삭제

  • -n 옵션 없이 get pod로 조회 시: -n default로 설정되어 조회 안됨
  • -n <namespace 명>으로 조회 시 my-namespace-pod 조회

  • namespace 삭제 시 해당 namespace에 위치한 pod도 같이 삭제

상황 2. Network Policy 설정

 

① 3개의 namespace와 Pod, 클러스터 내부 Pod 통신에 필요한 ClusterIP(Service) 생성

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  namespace: my-namespace
  labels:
    app: my-app
spec:
  containers:
  - name: nginx
    image: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: your-nginx-pod
  namespace: your-namespace
  labels:
    app: your-app
spec:
  containers:
  - name: nginx
    image: nginx
---
apiVersion: v1
kind: Pod
metadata:
  name: another-nginx-pod
  namespace: another-namespace
  labels:
    app: another-app
spec:
  containers:
  - name: nginx
    image: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: another-nginx-service
  namespace: another-namespace
spec:
  type: ClusterIP
  selector:
    app: another-app
  ports:
  - protocol: TCP
    port: 9080
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: your-nginx-service
  namespace: your-namespace
spec:
  type: ClusterIP
  selector:
    app: your-app
  ports:
  - protocol: TCP
    port: 9080
    targetPort: 80

 

② 각 Pod 끼리의 통신 접근 제한 정책 생성

apiVersion: networking.k8s.io/v1  # 네트워크 정책 API 버전
kind: NetworkPolicy  # 네트워크 정책 종류
metadata:
  name: my-netpol  # 네트워크 정책의 이름
  namespace: my-namespace  # 해당 네트워크 정책이 적용되는 네임스페이스
spec:
  podSelector:
    matchLabels:
      app: my-app  # podSelector를 통해 app=label이 my-app인 Pod들 선택
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: another-namespace  # egress rule을 통해 another-namespace로의 트래픽 허용

단, your-namespace이 통신될 수 있음(local에서 실습하는 경우 네트워크 플러그인이 정책을 지원하지 않아 통신 가능함)

'Computer > Docker' 카테고리의 다른 글

kubernetes network 실습  (0) 2024.07.25
Jib로 자바 컨테이너 빌드시 Credential 에러  (1) 2024.02.16
Docker Python  (0) 2022.12.03
Docker 프로세스  (0) 2022.11.27
Docker 웹서버 구축하기  (0) 2022.11.27
Comments