1. NodePort
-
모든 노드를 대상으로 외부 접속 가능한 포트를 예약
-
Default NodePort 범위 : 30000~32767
-
ClusterIP를 생성 후 NodePort를 예약
※ 문제1: Access the Service from outside the Cluster via NodePort
- 작업 클러스터 : k8s
- 'front-end' deployment의 nginx 컨테이너를 expose하는 'front-end-nodesvc'라는 새 service를 만듭니다.
- Front-end로 동작중인 Pod에는 node의 30200 포트로 접속되어야 합니다.
- 구성 테스트 curl k8s-worker1:30200 연결 시 nginx 홈페이지가 표시되어야 합니다.
- 작업 클러스터 확인
- 이름이 front-end인 deployment 동작 확인
- 이름이 front-end인 deployment에 Port가 80, targetPort가 80, 타입이 NodePort인 front-end-nodesvc Service를 yaml 형태로 파일 생성 및 vi 에디터 편집 실행
- nodePort를 추가하여 front-end-nodesvc.yaml 파일 수정 및 저장
- front-end-nodesvc.yaml 파일 apply 후 service 조회
- 만든 service가 잘 통신하는지 30200 포트로 요청(통신이 잘 됨)
2. Network Policy
-
Kubernetes가 지원하는 Pod 통신 접근제한
-
일종의 방화벽으로 Pod로 트래픽이 들어오고(Inbound), 나가는(Outbound)것을 설정하는 정책
-
Ingress 트래픽 : Inbound 정책, 들어오는 트래픽을 허용할 것인지를 정의
-
Egress 트래픽 : Outbound 정책, 트래픽이 나갈 수 있는 허용 범위 정의
-
트래픽 컨트롤 정의
-
ipBlock : CIDR IP 대역으로, 특정 IP 대역에서만 트래픽이 들어오도록 지정할 수 있다.
-
podSelector : label을 이용하여, 특정 label을 가지고 있는 Pod들에서 들어오는 트래픽만 받을 수 있음. 예를 들어, DB Pod의 경우에는 API server로 부터 들어오는 트래픽만 받는 것과 같은 정책 정의가 가능
-
namespaceSelector : 특정 namespace로 부터 들어오는 트래픽 만을 받는 기능. 운영 로깅 서버의 경우에는 운영 환경 namespace에서만 들어오는 트래픽을 받거나, 특정 서비스 컴포넌트의 namespace에서의 트래픽만 들어오게 컨트롤이 가능. 내부적으로 새로운 서비스 컴포넌트를 오픈했을 때, 베타 서비스를 위해서 특정 서비스나 팀에게만 서비스를 오픈하고자 할 때 유용하게 사용할 수 있음
-
Protocol & Port : 특정 Protocol 또는 Port로 설정된 트래픽만 허용되는 포트를 정의할 수 있음
3. Network Policy: LAB
(참고 URL : https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)
- app: web 레이블을 가진 Pod에 특정 namespace의 Pod들만 접근 허용(namespace: dev이고 label이 purpose=development인 곳에서 접근 불가, namespace: prod이고 label이 purpose=production인 곳에서 접근 가능)
- 이름이 webpod인 파드(image:nginx, port:80, labels:app=web)가 잘 생성이 되는지 yaml 형태로 확인
- 이름이 webpod인 파드 생성 후 확인
- 이름이 dev, prod인 namespace 생성 및 각각의 namespace에 label 옵션 추가
- web-allow-prod.yaml 파일 생성하여 네트워크 정책 관련 부분 작성 후 저장
- web-allow-prod.yaml 파일 apply 후 네트워크 정책 적용된 부분 확인
- 임시로 namespace가 dev인 파드 하나를 생성하여 파드에 접속 후 앞에서 만들었던 pod에 접속 요청(namespace가 dev이면 접근이 불가능)
- 임시로 namespace가 prod인 파드 하나를 생성하여 파드에 접속 후 앞에서 만들었던 pod에 접속 요청(namespace가 prod이면 접근이 가능)
※ 문제2: NetworkPolicy
(참고 URL : https://kubernetes.io/docs/concepts/services-networking/network-policies/#networkpolicy-resource)
- 작업 클러스터 : hk8s
- default namespace에 다음과 같은 pod를 생성하세요.
- name: poc
- image: nginx
- port: 80
- label: app=poc
- "partition=customera"를 사용하는 namespace에서만 poc의 80포트로 연결할 수 있도록 default namespace에 'allow-web-from-customera'라는 network Policy를 설정하세요. 보안 정책상 다른 namespace의 접근은 제한합니다.
- 작업 클러스터 확인
- 이름이 poc인 pod 생성 후 생성 확인
- Label중 partition이 할당된 namespaces 조회
- yaml 파일 생성 및 편집 실행
- 네트워크 정책 관련 정보 작성 후 저장
- yaml 파일 apply
- 임시로 namespace가 customera인 pod를 생성하여 접속 후 앞서 만들었던 이름이 poc인 pod에 접속 요청(네트워크 정책에서 partition=customera는 연결 가능하도록 설정하였기 때문에 접속 가능)