[kubernetes] 쿠버네티스 오브젝트 (2)

쿠버네티스 > 인그레스

develop, kubernetes
written byzuhern1zuhern

in

2021. 04. 04


공부하는 책
알면 더 쉬운 도커 쿠버네티스 복습을 위해 요약한 것.
kubernetes.io
kubernetes basic

목표

kubernetes 책 3장 내용 숙지

  • 쿠버네티스 오브젝트
  • 쿠버네티스의 구성 요소를 가볍게 알아보자

3.3 쿠버네티스의 오브젝트

  • 쿠버네티스는 모든 요소를 yaml 파일로 생성하여 관리

3.3.5 인그레스

  • 인그레스는 클러스터 외부에서 클러스터 내부 서비스로 접속하도록 해 준다.
  • 인그레스의 구성 요소로 인그레스 리소스, 인그레스 컨트롤러가 있다.
  • 단일 파드를 노출하는 것은 kubectl expose 명령어를 사용하는 것과 효과가 비슷하지만 이외의 복잡한 상황에서는 인그레스가 더 많은 기능을 제공한다.
  • 종류

    • GCE 용 ingress-gce
    • NGINX 용 ingress-nginx

3.3.5.1 ingress-nginx 설치

참조
https://kubernetes.github.io/ingress-nginx/deploy/
요 링크… 이거 아닌듯… 나중에 참조

# 설치
% kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml                   
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
...

그리고 인그레스 컨트롤러 또한 외부에 노출

%kubectl expose deploy nginx-ingress-controller --type=NodePort -n ingress-nginx                                                 
service/nginx-ingress-controller exposed
% kubectl get svc -n ingress-nginx
NAME                       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
nginx-ingress-controller   NodePort   10.106.203.235   <none>        80:31580/TCP,443:31210/TCP   11s

http://localhost:31580/ 접속
404 화면 뜨면 성공 (인그레스만 설치되었을 뿐 실제로 서비스를 실행한 파드에 연결되지 않았기 때문)

3.3.5.2 hello world

서비스까지

% kubectl run nodejs-app --image zuhern/kubernetes-test-homepage --port=3000
pod/nodejs-app created
# 내꺼로 하면 에러난다.. public 인데 왜 안되냐, 아 도커hub..
% kubectl run nodejs-app --image uphiller/nodejs-hello-world --port=3000
pod/nodejs-app created
# 확인
% kubectl get pod                                                       
NAME                          READY   STATUS    RESTARTS   AGE
nodejs-app                    1/1     Running   0          8s
# (추가) 이전에 동일한 이름으로 만든 서비스 삭제
% kubectl delete service nodejs-app
service "nodejs-app" deleted
# 서비스 생성 (인그레스를 통해 외부 노출할 것이기 대문에 --type=NodePort 사용 안함)
zuhern@zuherns-MacBookPro kubernetes % kubectl expose pod nodejs-app    
service/nodejs-app exposed

인그레스 예제소스

# ingress 설정
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nodejs-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com                        # host
    http:
      paths:
      - path: /nodejs                        # path
        backend:                             # target service
          serviceName: nodejs-app 
          servicePort: 3000
# 인그레스 생성
% kubectl apply -f ingress/nodejs-ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
ingress.extensions/nodejs-ingress created
# 확인
% kubectl get ingress
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME             CLASS    HOSTS         ADDRESS   PORTS   AGE
nodejs-ingress   <none>   foo.bar.com             80      21s

3.3.5.2 hello world!

  1. kubectl get ingress로 조회하여 /etc/hosts에 인그레스에 설정한 host인 foo.bar.com 등록
  2. kubectl get svc -n ingress-nginx 조회로 나온 80:31580/TCP 의 31580을 포트로
  3. /etc/hosts에 인그레스에 설정한 path인 nodejs를 경로에 추가
  4. 1,2,3 조합하여 http://foo.bar.com:31580/nodejs 도출
  5. curl http://foo.bar.com:31580/nodejs 하거나 브라우저로 확인