선릉역 1번 출구
kubernetes security 실습 본문
하나의 커다란 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