- Facts
: 배운것 - 헤드리스 서비스 / kube-proxy / 인그레스 - Findings
:
헤드리스 서비스
- 클러스터 IP가 없는 서비스
- 로드밸런싱이 필요 없거나 단일 서비스 IP가 필요없을 때 사용
- 엔드포인트 : 헤드리스 서비스에 셀렉터를 서정하면 쿠버네티스 API로 확인
kube-proxy
- 쿠버네티스에서 서비스를 만들었을 떄 클러스터 IP나 노드 포트로 접근할 수 있게 만들어 실제 조작을 하는 컴포넌트
userspace 모드 클라이언트에서 서비스의 클러스터 IP를 통해 어떤 요청을 하면 iptables을 거쳐서 kube-proxy가 요청을 받고 서비스의 클러스터 IP는 연결되어야 하는 적절한 파드로 연결 iptables 모드 kube-proxy가 iptables를 관리하는 역할로 직접 클라이언트에서 트래픽을 받지 않고 요청 처리 성능이 좋다 IPVS 모드 리눅스 커널에 있는 L4 로드밸런싱 기술로 커널 공간에서 동작하고 데이터 구조를 해시 테이블로 저장하기 때문에 iptables 모드보다 빠르고 좋은 성능
인그레스
- 주로 크러스터 외부에서 안에 있는 파드에 접근할 떄 사용하는 방법으로 주로 L7 영역의 통신을 담당해서 처리
- 클러스터 외부에서 안으로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙 모음
- ingress-nginx : 인그레스에 설정한 내용을 nginx 환경 설정으로 변경해서 nginx에 용
<수업 메모>
* Kubernetes 내부 DNS에 의한 자원의 이름 변환 규칙
- [파드명].[서비스명].[네임스페이스명].[리소스 종류].cluster.local
- [서비스명].[네임스페이스명].[리소스 종류].cluster.local
* 클러스터 내에서 자원의 네트워크 정보를 획득하는 방법
- coreDNS를 통한 이름변환
- 환경변수를 사용하는 방법
실습예제
<준비>
0. 현재 default 네임스페이스에 존재하는 모든 리소스를 삭제하시오
<파드>
1. 다음 설정에 따른 리소스를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 파드
파드 이름: nettool
파드 내 컨테이너 개수: 1
컨테이너 이미지: ghcr.io/c1t1d0s7/network-multitool
파드의 컨테이너에서 실행할 명령 : tail -f /dev/null
<컨트롤러 - 레플리케이션 컨트롤러>
2. 다음과 같은 구성의 레플리케이션 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 레플리케이션 컨트롤러
컨트롤러 이름: test-rc
파드 복제본 개수: 2
컨트롤러로 제어할 파드의 레이블 정보: app=app-rc
생성할 파드의 정보:
- 레이블: app=app1
- 컨테이너 이미지: ghcr.io/c1t1d0s7/go-myweb
- 컨테이너에서 오픈할 포트: 8080
<컨트롤러 - 디플로이먼트>
3. 다음과 같은 구성의 디플로이먼트 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 디플로이먼트
컨트롤러 이름: test-deploy
파드 복제본 개수: 3
컨트롤러로 제어할 파드의 레이블 정보: app=app-deploy
생성할 파드의 정보
- 레이블: app=app-deploy
- 컨테이너 이미지: ghcr.io/c1t1d0s7/go-myweb:v1.0
- 컨테이너에서 오픈할 포트: 8080
디플로이먼트 리소스의 배포 전략: 롤링업데이트
4. kubectl set image 명령을 사용하여 3번에서 생성한 디플로이먼트 리소스의 이미지를 다음 이미지로 업데이트하시오. 이 때 업데이트시 실행한 명령을 롤아웃 히스토리에 기록되도록 실행하시오.
새로운 이미지: ghcr.io/c1t1d0s7/go-myweb:v2.0
5. 이미지를 3.0 버전으로 업데이트 하기 위하여 YAML 파일을 수정하고 업데이트를 적용하시오. 이 때 롤아웃 히스토리에 다음과 같이 기록되도록 설정하시오.
- 기록할 내용: Web App Version 3
- 컨테이너 이미지: ghcr.io/c1t1d0s7/go-myweb:v3.0
6. 업데이트가 완료된 후, 4번 명령을 통해 업데이트 된 버전으로 롤백하시오.
<컨트롤러 - 스테이트풀셋>
7. 다음과 같은 구성의 스테이트풀셋 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 스테이트풀셋
컨트롤러 이름: test-sts
파드 복제본 개수: 3
컨트롤러로 제어할 파드의 레이블 정보: app=app-sts
생성할 파드의 정보
- 레이블: app=app-sts
- 컨테이너 이미지: ghcr.io/c1t1d0s7/go-myweb
- 컨테이너에서 오픈할 포트: 8080
8. 스테이트풀셋의 파드를 접근하기 위한 헤드리스 서비스를 생성하시오.
- 서비스 이름: test-svc-sts-headless
9. 1번에서 생성한 nettool 파드를 사용하여 헤드리스 서비스를 통해 스테이트풀셋 각 파드에 접근할 수 있는지 확인하시오.
kubectl exec -it nettool -- bash
<컨트롤러 - 데몬셋>
10. 다음과 같은 구성의 데몬셋 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 데몬셋
컨트롤러 이름: test-ds
파드를 배치할 노드: kube-node1, kube-node2
생성할 파드의 정보
- 레이블: app=app-ds
- 컨테이너 이미지: ghcr.io/c1t1d0s7/go-myweb
- 컨테이너에서 오픈할 포트: 8080
<컨트롤러 - 잡>
11. 다음과 같은 구성의 잡 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 잡
컨트롤러 이름: test-job
완료할 작업 회수: 10
병렬실행 개수: 3
생성할 파드의 정보
- 레이블: app=app-job
- 컨테이너 이미지: ghcr.io/c1t1d0s7/network-multitool
- 실행할 작업: sleep 10
<컨트롤러 - 크론잡>
12. 다음과 같은 구성의 잡 컨트롤러를 생성하기 위한 YAML 파일을 작성하고 리소스를 생성하시오.
종류: 크론잡
컨트롤러 이름: test-cjob
실행주기: 2분에 1회 실행 (이전 작업 완료 전에는 새로운 작업 시작 금지)
생성할 파드의 정보
- 레이블: app=app-cjob
- 컨테이너 이미지: ghcr.io/c1t1d0s7/network-multitool
- 실행할 작업: sleep 1000
<서비스 - 클러스터IP>
13. 2번에서 생성한 레플리케이션 컨트롤러를 통해 생성된 파드에 연결하는 서비스를 생성하시오.
- 클러스터 내부 연결 가능
- 외부 연결 필요하지 않음
- 서비스 이름: test-svc-rc
- 서비스 포트: 80
<서비스 - 노드포트>
14. 3번에서 생성한 디플로이먼트 컨트롤러를 통해 생성된 파드에 연결하는 서비스를 생성하시오.
- 클러스터 내부 연결 가능
- 클러스터 외부에서 클러스터 노드의 31111 포트로 서비스 연결
- 서비스 이름: test-svc-deploy
- 서비스 포트: 80
<서비스 - 로드밸런서>
15. 7번에서 생성한 스테이트풀셋 컨트롤러를 통해 생성된 파드에 연결하는 서비스를 생성하시오.
- 클러스터 내부 연결 가능
- 클러스터 외부에서 클러스터 노드의 32222 포트로 서비스 연결
- 서비스 이름: test-svc-sts-lb
- 서비스 포트: 80
<서비스 - ExternalName>
16. 다음 연결 정보를 가지고있는 ExternalName 리소스를 생성하시오
- 서비스 이름: test-external
- 연결할 대상: google.com
17. 1번에서 생성한 nettool 파드를 사용하여 test-external 리소스를 확인하시오
18. test-external 리소스의 연결대상을 naver.com으로 변경후 확인하시오.
<인그레스>
19. 인그레스를 생성하여 다음과 같이 연결되도록 설정하시오
www.myweb.com
- /app1 : test-svc-rc
- /app2 : test-svc-deploy
www.yourweb.com
- / : test-svc-sts-lb
'GOORM' 카테고리의 다른 글
GOORM: Kubernetes-42 (0) | 2022.01.05 |
---|---|
GOORM: Kubernetes-41 (0) | 2022.01.05 |
GOORM: Kubernetes-39 (0) | 2022.01.04 |
GOORM: Kubernetes-38 (0) | 2022.01.04 |
GOORM: Kubernetes-37 (0) | 2021.12.31 |
댓글