k8s- 5회차

박형준·2024년 5월 10일

*서비스 : pod 그룹의 단일 진입점을 제공하는것.

*서비스 타입 4가지
-ClusterIP (default) : Virtual-IP 생성해서 단일 진입점을 만듬.(lable이 동일한 파드 들을 묶음)
IP범위는 10.x.x.x/12 로 할당됨. IP는 클러스터 내부에서만 사용가능함.
-NodePort : IP가 생성 된 후 워크노드에 외부에서 접속 가능 하도록 포트 예약
-LoadBalancer : AWS, Azure 등 오픈스택에 적용.
-ExternalName : 클러스터 안에서 외부에 접속할때 사용할 도메인을 등록해서 사용하도록.( DNS )


ClusterIP

⇒default ClusterIP 확인 해보면 10.96.x.x ⇒ 새로 생성한것으로 변경 접속 해보기

  1. deploy-nginx.yaml 파일 생성 / 실행
    [root@master ~]# kubectl create -f deploy-nginx.yaml

app: "webui" 라벨을 가진 파드를 배포

  • vim deploy-nginx.yaml
  • Deployment를 정의하는 yaml 파일 작성
    ( Deployment는 "app: webui" 라벨을 가진 파드를 선택하도록 지정 )
  • kubectl create -f deploy-nginx.yaml

⇒ IP생성 2. clusterip-nginx.yaml 생성 / 실행

clusterIP 서비스 설정

  • vim clusterip-nginx.yaml
  • 쿠버네티스의 ClusterIP 서비스를 정의하는 yaml파일 작성
    ( 서비스의 clusterIP는 "10.100.100.100"으로 지정되어 있으며,
    이는 서비스에 할당된 가상 IP 주소를 나타냄 )
    ( 이 서비스는 "app: webui"라벨을 가진 파드를 대상으로 선택하도록 지정 )
    ( 포트 부분에서는 TCP 프로토콜을 사용하며, 포트 80에서 서비스를 노출 )
  • kubectl create -f clusterip-nginx.yaml

[root@master ~]# kubectl get svc ⇒ 생성된것 확인 및 접속
[root@master ~]# curl 10.100.100.100
⇒IP, Port, EndPonit IP(노드IP) 확인

생성된 서비스 확인

  • 서비스 확인 ( kubectl get service )
  • ClusterIP 서비스를 자세하게 확인
    ( Endpoints의 IP: pods의 IP, kubectl describe service clusterip-service )

[root@master ~]# curl 10.100.100.100 접속을 하면 1,2,3 중 누구에게 접속했는지 확인
동작중인 컨테이너 접속 후 index.html파일 수정 POD-1, POD-2, POD-3 각각 수정하고
다시 접속 curl 10.100.100.100

  • [root@master ~]# kubectl exec webui-5f67dcf6d-mkfwq -it -- /bin/bash
    • root@webui-5f67dcf6d-mkfwq:/# echo "POD-1" > /usr/share/nginx/html/index.html
    • root@webui-5f67dcf6d-mkfwq:/# exit
      ⇒ POD-2, POD=3 동일하게 수정하고 접속 해보기

curl 10.100.100.100으로 접속했을 때 어떤 pods인지 구분

  • Pod 1, 2, 3에 접속해서 html 파일 수정 ( echo "POD-1" > /usr/share/nginx/html/index.html )
  • 다시 접속 curl 10.100.100.100 하면 랜덤으로 열림

*파드 개수를 5개로 늘리고(scal) EndPoint IP 확인 하고 접속 해보기

  • [root@master ~]# kubectl scale deployment webui --replicas=5
    [root@master ~]# kubectl scale deployment webui --replicas=2

⇒ 모두 삭제

  • [root@master ~]# kubectl delete service --all
    [root@master ~]# kubectl delete deployment webui

deployment로 POD 개수를 5개 늘리기

  • kubectl describe service clusterip-service
  • Endpoints IP가 늘어나는 것을 확인

-NodePort

.포트범위 : 30000 ~ 32767(2진수) 를 사용함.
.ClusterIP 생성 후 포트를 예약해서 사용.

  • 포트를 예약을 하면 그룹안에 있는 지정된 노드의 포트가 자동으로 지정되어 열림.
    • nodePort 부분을 생략을 해도됨. (생략을 하면 기본 30000으로 지정됨 )

⇒ deploy-nginx.yaml 실행해서 nginx를 노드에 설치
⇒ nodeport-nginx.yaml 파일 생성 하고 실행 하고 포트 확인 까지

  • #kubectl create -f nodeport-nginx.yaml
    #kubectl get svc 로 포트 30200 확인

app: "webui" 라벨을 가진 파드를 배포

  • vim deploy-nginx.yaml
  • Deployment를 정의하는 yaml 파일 작성
    ( Deployment는 "app: webui" 라벨을 가진 파드를 선택하도록 지정 )
  • kubectl create -f deploy-nginx.yaml

nodeport 서비스

  • vim nodeport.yaml
  • nodeport를 설정하는 yaml 파일 생성 ( "NodePort" 유형으로 설정 )
    ( 클러스터 내에서의 IP 주소는 "10.100.100.200"이며, )
    ( "webui" 앱을 선택하기 위한 레이블 셀렉터가 지정 )
    ( 이는 클러스터 내부에서 사용되며, 외부로 노출하기 위한 노드 포트는 30200으로 설정 )
    • kubectl create -f nodeport.yaml
    • kubectl get svc로 서비스 확인

⇒ Node1, Node2 에서도 포트 30200이 등록 되었는지 확인

  • #netstat -napt | grep 30200
    #curl node1ip:30200 로 접속 테스트

노드의 포트번호 확인

  • curl 192.168.10.100:30200 으로 접속 확인
  • netstat -napt | grep 30200 로 포트번호 확인

*로드밸런스 : AWS에 리눅스,윈도우 ⇒ 도커/쿠버(로드밸런서)

⇒ load-nginx.yaml 파일 실행 하고 동작 확인

  • #kubectl create -f loac-nginx.yaml
    #kubectl get svc 아래와 같은 결과 값이 보여짐
    • 기존에 nodeport 에서 볼수 없는 pending 이 보이고 이부분이 AWS, Azure 에서 쿠버설치 후 실행시
      IP가 생성되어 보여지고 이 IP를 이용해서 외부에서도 접속 가능함.

로드 밸런서 설정

  • vim load-nginx.yaml
  • 로드 밸런서 내용을 지정하는 yaml 파일 작성 ( "LoadBalancer" 유형으로 설정 )
    • kubectl create -f load-nginx.yaml
    • "AWS Load Balancer Controller"와 같은 도구를 사용하여 외부 로드 밸런서를 생성하고 Kubernetes 서비스와 연결 가능

*ExternalName : 클러스트IP와 노드포트와는 성격이 다른 도메인을 가지고 설정.

⇒ 파일 생성 및 실행

  • #external-name.yaml
    • 도메인을 발급 받아서 google.com 부분에 등록해주면 됨.

#kubectl create -f external.yaml

⇒ 실행을 하면 external-IP 부분에 도메인이 보여짐.
⇒ 파드하나 실행 해서 테스트 해보기

  • [root@master ~]# kubectl run -it --image=centos:7 testnet -- /bin/bash
    /#curl externalname-service.default.svc.cluster.local

⇒ 구글의 HTML 이 보여짐.

external name 서비스 설정

  • vim external.yaml
  • externalName 서비스를 지정하는 yaml 파일 생성
    ( "externalname-svc"라는 이름을 가지는 ExternalName 타입의 서비스를 생성,
    이 서비스는 "google.com"이라는 외부 도메인을 가리킨다 )
    ( 이 서비스를 사용하면 클러스터 내부의 파드는 "externalname-svc"를 통해
    "google.com"으로 라우팅
    )
    • kubectl create -f external.yaml
    • kubectl get svc로 확인

external name를 사용해서 접속

  • 마스터에서 kubectl run testpod -it --image=centos:7 /bin/bash 로 접속
  • curl externalname-svc.default.svc.cluster.local로 호출

서비스 4가지 타입

  • ClusterIP : 그룹을 묶어서 하나의 진입점을 만들기(내부 통신만 가능)
  • NodePort : IP생성 후 외부에서 노드로 접속 하기 위한 포트 예약 (30000~32767)
  • 로드 밸런서 : 오픈 클라우드나 별도의 장비에 적용
  • ExternalName : 도메인을 이용해서 외부로 나가는 연결통로를 도메인을 이용해서 설정.

*ingress : 입구

https://kubernetes.io/docs/concepts/services-networking/ingress/

-샘플파일의 내용을 토대로 보면 메인페이지, 로그인, 결재시스템
⇒ 묶어서 관리(클러스트IP)
⇒ 외부와 연결

ingress
-인그레스를 통한 인증, 접속, ⇒ 인그레스 컨트롤러가 필요함.


#ingress-basic.yaml ⇒ 구글 드라이브에서 다운받아서 생성하고 실행/
파일 내용

  • host: foo.bar.com ⇒ s1(노드1)/s2(노드2) 로 연결
  • host: bar.foo.com ⇒ s2(노드2) 로 연결

#kubectl apply -f ingress-basic.yaml
ingress.networking.k8s.io/test created

ingress node 연결

  • vim ingress-basic.yaml
  • ingress node 연결을 지정하는 yaml 파일 작성
    ( 호스트 foo.bar.com에 대한 경로:
    /foos1로 시작하는 모든 요청은 서비스 s1의 포트 80으로 전달,
    /bars2로 시작하는 모든 요청은 서비스 s2의 포트 80으로 전달 )
    ( 호스트 bar.foo.com에 대한 경로:
    모든 요청은 /로 시작하며, 이러한 요청은 서비스 s2의 포트 80으로 전달 )
    ( Ingress를 통해 클러스터 외부에서 내부로의 트래픽을 어떻게 라우팅할지에 대한 규칙을 정의 )
    • kubectl create -f ingress-basic.yaml
    • kubectl describe ingress test로 확인 ( ingress controller 설치 확인 )

#git clone https://github.com/kubernetes/ingress-nginx.git ⇒ 설치
다시 한번 URL실행

#cd ingress-nginx/deploy/static/provider/cloud

ingress 예제 파일 다운로드 후

⇒ deploy.yaml 파일 실행 후 파일 수정 366번째 줄 LoadBalancer 를 NodePort로 수정 하고 실행
#kubectl apply -f deploy.yaml

⇒ 현재는 ingress가 설정이 안되서 404 Not Found 메시지가 출력됨.

deploy.yaml 수정

  • vim deploy.yaml
  • kubectl apply -f deploy.yaml
  • type: LoadBalancer를 NodePort로 변경
    • kubectl apply -f deploy.yaml
    • kubectl get deployments.apps -n ingress-nginx로 확인
    • kubectl get service -n ingress-nginx로 확인

호출

  • curl localhost:30655, curl localhost: 30343으로 확인
  • 아직 ingress 설정이 끝나지 않아서 error

#kubectl expose -n ingress-nginx deployment ingress-nginx-controller --name s1
service/s1 exposed

#vi /etc/hosts 파일 맨 아래 부분에 도메인 등록
127.0.0.1 foo.bar.com

서비스 등록과 호스트 등록

  • 서비스 등록 ( kubectl expose -n ingress-nginx deployment ingress-nginx-controller --name s1 )
  • 호스트 등록 ( /etc/hosts 파일 아래에 도메인 등록 )

도메인 접속

0개의 댓글