kubernetes_service

μ„œλΉ„μŠ€: ν΄λΌμ΄μ–ΈνŠΈκ°€ νŒŒλ“œλ₯Ό κ²€μƒ‰ν•˜κ³  톡신을 κ°€λŠ₯ν•˜κ²Œ 함

  • μ„œλΉ„μŠ€

    • image

    • Pod μ§‘ν•©κ³Ό 같은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ“€μ— μ ‘κ·Όν•˜λŠ” 방법을 κΈ°μˆ ν•˜λŠ” API 객체

    • μΏ λ²„λ„€ν‹°μŠ€μ˜ μ„œλΉ„μŠ€λŠ” λ™μΌν•œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” νŒŒλ“œ 그룹에 지속적인 단일 접점을 λ§Œλ“€λ €κ³  ν•  λ•Œ μƒμ„±ν•˜λŠ” λ¦¬μ†ŒμŠ€λ‘œ 각 μ„œλΉ„μŠ€λŠ” μ„œλΉ„μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” λ™μ•ˆ μ ˆλŒ€ λ°”λ€Œμ§€ μ•ŠλŠ” IP μ£Όμ†Œμ™€ ν¬νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.

    • ν΄λΌμ΄μ–ΈνŠΈλŠ” ν•΄λ‹Ή IP와 포트둜 μ ‘μ†ν•œ λ‹€μŒ ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ§€μ›ν•˜λŠ” νŒŒλ“œ 쀑 ν•˜λ‚˜λ‘œ μ—°κ²°λ©λ‹ˆλ‹€.

    • Service의 Cluster IPλ₯Ό 톡해 μœ λ™μ μœΌλ‘œ μƒμ„±λ˜κ³  μ‚¬λΌμ§€λŠ” Pod에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ λ°©λ²•μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    • ClusterIP , NodePort , LoadBalancer νƒ€μž… μ œκ³΅ν•˜λ©° κΈ°λ³Έ μ˜΅μ…˜μ€ ν΄λŸ¬μŠ€ν„° λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” Cluster IPμž…λ‹ˆλ‹€.

    • μ—¬λŸ¬ Podλ₯Ό λ¬Άμ–΄ Healthyν•œ Pod둜 Traffic λΌμš°νŒ…ν•˜λŠ” λ‘œλ“œ λ°ΈλŸ°μ‹± κΈ°λŠ₯ μ œκ³΅ν•©λ‹ˆλ‹€.

    • ν΄λŸ¬μŠ€ν„°μ˜ Service CIDR μ€‘μ—μ„œ μ§€μ •λœ IP둜 생성 κ°€λŠ₯ν•©λ‹ˆλ‹€.

    • apiVersion: v1
      kind: Service
      metadata:
        name: kubia
      spec:
        ports:
        - port: 80
          targetPort: 8080
        selector:
          app: kubia
    • μ„œλΉ„μŠ€ 생성

      • kubectl expose둜 μ„œλΉ„μŠ€ 생성

        • expose λͺ…λ Ήμ–΄λŠ” λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ»¨νŠΈλ‘€λŸ¬μ—μ„œ μ‚¬μš©λœ 것과 λ™μΌν•œ νŒŒλ“œ μ…€λ ‰ν„°λ₯Ό μ‚¬μš©ν•΄ μ„œλΉ„μŠ€ λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ³  λͺ¨λ“  νŒŒλ“œλ₯Ό 단일 IP μ£Όμ†Œμ™€ 포트둜 λ…ΈμΆœν•©λ‹ˆλ‹€.

      • μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆμ— μ›κ²©μœΌλ‘œ λͺ…λ Ήμ–΄ μ‹€ν–‰

        • kubectl exec λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ κΈ°μ‘΄ νŒŒλ“œμ˜ μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ μ›κ²©μœΌλ‘œ μž„μ˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆμ˜ λ‚΄μš©, μƒνƒœ, ν™˜κ²½μ„ 검사할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

        • kubectl exec {k get pods의 νŒŒλ“œ} -- curl -s {http://10.111.249.153 - k get svc의 ν΄λŸ¬μŠ€ν„° IP}

          • λͺ…λ Ήμ–΄μ˜ 더블 λŒ€μ‹œ(--)λŠ” kubectl λͺ…령쀄 μ˜΅μ…˜μ˜ 끝을 μ˜λ―Έν•˜λ©° 더블 λŒ€μ‹œ λ’€μ˜ λͺ¨λ“  것은 νŒŒλ“œ λ‚΄μ—μ„œ 싀행돼야 ν•˜λŠ” λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.

  • ν΄λŸ¬μŠ€ν„° 외뢀에 μžˆλŠ” μ„œλΉ„μŠ€ μ—°κ²°

    • apiVersion: v1
      kind: Endpoints
      metadata:
        name: external-service
      subsets:
        - addresses:
          - ip: 11.11.11.11
          - ip: 22.22.22.22
          ports:
          - port: 80
    • image

    • μ„œλΉ„μŠ€ μ—”λ“œν¬μΈνŠΈ

      • μ„œλΉ„μŠ€λŠ” νŒŒλ“œμ— 직접 μ—°κ²°(link)λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹  μ—”λ“œν¬μΈνŠΈ λ¦¬μ†ŒμŠ€κ°€ κ·Έ 사이에 μžˆμŠ΅λ‹ˆλ‹€.

      • μ—”λ“œν¬μΈνŠΈ λ¦¬μ†ŒμŠ€λŠ” μ„œλΉ„μŠ€λ‘œ λ…ΈμΆœλ˜λŠ” νŒŒλ“œμ˜ IP μ£Όμ†Œμ™€ 포트 λͺ©λ‘μž…λ‹ˆλ‹€.

    • μ™ΈλΆ€ μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ 별칭 생성

      • ExternalName μ„œλΉ„μŠ€ 생성

        • μ™ΈλΆ€ μ„œλΉ„μŠ€μ˜ λ³„μΉ­μœΌλ‘œ μ‚¬μš©λ˜λŠ” μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€λ €λ©΄ μœ ν˜•(type) ν•„λ“œλ₯Ό ExternalName으둜 μ„€μ •ν•΄ μ„œλΉ„μŠ€ λ¦¬μ†ŒμŠ€λ₯Ό λ§Œλ“¬

  • μ™ΈλΆ€ ν΄λΌμ΄μ–ΈνŠΈμ— μ„œλΉ„μŠ€ λ…ΈμΆœ

    • μ™ΈλΆ€μ—μ„œ μ„œλΉ„μŠ€λ₯Ό μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” 방법

      • image

      • λ…Έλ“œν¬νŠΈλ‘œ μ„œλΉ„μŠ€ μœ ν˜• μ„€μ • : λ…Έλ“œν¬νŠΈ μ„œλΉ„μŠ€μ˜ 경우 각 ν΄λŸ¬μŠ€ν„° λ…Έλ“œλŠ” λ…Έλ“œ μžμ²΄μ—μ„œ 포트λ₯Ό κ²°κ³  ν•΄λ‹Ή 포트둜 μˆ˜μ‹ λœ νŠΈλž˜ν”½μ„ μ„œλΉ„μŠ€λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. 이 μ„œλΉ„μŠ€λŠ” λ‚΄λΆ€ ν΄λŸ¬μŠ€ν„° IP와 포트둜 μ•‘μ„ΈμŠ€ν•  수 μžˆμ„ 뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  λ…Έλ“œμ˜ μ „μš© ν¬νŠΈλ‘œλ„ μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

      • μ„œλΉ„μŠ€ μœ ν˜•μ„ λ…Έλ“œν¬νŠΈ μœ ν˜•μ˜ ν™•μž₯인 λ‘œλ“œλ°ΈλŸ°μ„œλ‘œ μ„€μ • : μΏ λ²„λ„€ν‹°μŠ€κ°€ μ‹€ν–‰ 쀑인 ν΄λΌμš°λ“œ μΈν”„λΌμ—μ„œ ν”„λ‘œλΉ„μ €λ‹λœ μ „μš© λ‘œλ“œλ°ΈλŸ°μ„œλ‘œ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‘œλ“œλ°ΈλŸ°μ„œλŠ” νŠΈλž˜ν”½μ„ λͺ¨λ“  λ…Έλ„μ˜ λ…Έλ“œν¬νŠΈλ‘œ μ „λ‹¬ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‘œλ“œλ°ΈλŸ°μ„œμ˜ IP둜 μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•©λ‹ˆλ‹€.

      • 단일 IP μ£Όμ†Œλ‘œ μ—¬λŸ¬ μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•˜λŠ” 인그레슀 λ¦¬μ†ŒμŠ€ λ§Œλ“€κΈ° : HTTP λ ˆλ²¨μ—μ„œ μž‘λ™ν•˜λ―€λ‘œ 4계측 μ„œλΉ„μŠ€λ³΄λ‹€ 더 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€

    • λ…Έλ“œν¬νŠΈ μ„œλΉ„μŠ€ μ‚¬μš©

      • image

      • apiVersion: v1
        kind: Service
        metadata:
          name: kubia-nodeport
        spec:
          type: NodePort
          ports:
          - port: 80
            targetPort: 8080
            nodePort: 30123
          selector:
            app: kubia
      • λ…Έλ“œν¬νŠΈ μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€λ©΄ μΏ λ²„λ„€ν‹°μŠ€λŠ” λͺ¨λ“  λ…Έλ“œμ— νŠΉμ • 포트λ₯Ό ν• λ‹Ήν•˜κ³ (λͺ¨λ“  λ…Έλ“œμ—μ„œ λ™μΌν•œ 포트 λ²ˆν˜Έκ°€ μ‚¬μš©λ¨) μ„œλΉ„μŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” νŒŒλ“œλ‘œ λ“€μ–΄μ˜€λŠ” 연결을 μ „λ‹¬ν•©λ‹ˆλ‹€.

      • 일반 μ„œλΉ„μŠ€(μ‹€μ œ μœ ν˜•μ€ ClusterIP)와 μœ μ‚¬ν•˜μ§€λ§Œ μ„œλΉ„μŠ€μ˜ λ‚΄λΆ€ ν΄λŸ¬μŠ€ν„° IP뿐만 μ•„λ‹ˆλΌ λͺ¨λ“  λ…Έλ“œμ˜ IP와 ν• λ‹Ήλœ λ…Έλ“œν¬νŠΈλ‘œ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

      • λ…Έλ“œν¬νŠΈ μ„œλΉ„μŠ€ 확인

        • $ kubectl get svc kubia-nodeport
          NAME             CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
          kubia-nodeport   10.111.254.223   <nodes>       80:30123/TCP   2m
        • EXTERNAL-IP에 라고 ν‘œμ‹œλΌ 있고 ν΄λŸ¬μŠ€ν„° λ…Έλ“œμ˜ IP μ£Όμ†Œλ‘œ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŒμ„ λ‚˜νƒ€λƒ„

    • μ™ΈλΆ€ λ‘œλ“œλ°ΈλŸ°μ„œλ‘œ μ„œλΉ„μŠ€ λ…ΈμΆœ

      • image

      • ν΄λΌμš°λ“œ κ³΅κΈ‰μžμ—μ„œ μ‹€ν–‰λ˜λŠ” μΏ λ²„λ„€ν‹°μŠ€ ν΄λŸ¬μŠ€ν„°λŠ” 일반적으둜 ν΄λΌμš°λ“œ μΈν”„λΌμ—μ„œ λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό μžλ™μœΌλ‘œ ν”„λ‘œλΉ„μ €λ‹ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

      • λ‘œλ“œλ°ΈλŸ°μ„œλŠ” 곡개적으둜 μ•‘μ„ΈμŠ€ κ°€λŠ₯ν•œ κ³ μœ ν•œ IPμ£Όμ†Œλ₯Ό κ°€μ§€λ©° λͺ¨λ“  연결을 μ„œλΉ„μŠ€λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. λ‘œλ“œλ°ΈλŸ°μ„œμ˜ IP μ£Όμ†Œλ‘œ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 인그레슀 λ¦¬μ†ŒμŠ€λ‘œ μ„œλΉ„μŠ€ μ™ΈλΆ€ λ…ΈμΆœ

    • image

    • μΈκ·Έλ ˆμŠ€κ°€ ν•„μš”ν•œ 이유

      • λ‘œλ“œλ°ΈλŸ°μ„œ μ„œλΉ„μŠ€λŠ” μžμ‹ μ˜ 곡용 IP μ£Όμ†Œλ₯Ό κ°€μ§„ λ‘œλ“œλ°ΈλŸ°μ„œκ°€ ν•„μš”ν•˜μ§€λ§Œ, μΈκ·Έλ ˆμŠ€λŠ” ν•œ IP μ£Όμ†Œλ‘œ μˆ˜μ‹­ 개의 μ„œλΉ„μŠ€μ— 접근이 κ°€λŠ₯ν•˜λ„λ‘ μ§€μ›ν•΄μ€λ‹ˆλ‹€.

      • ν΄λΌμ΄μ–ΈνŠΈκ°€ HTTP μš”μ²­μ„ μΈκ·Έλ ˆμŠ€μ— 보낼 λ•Œ, μš”μ²­ν•œ ν˜ΈμŠ€νŠΈμ™€ κ²½λ‘œμ— 따라 μš”μ²­μ„ 전달할 μ„œλΉ„μŠ€κ°€ κ²°μ •λ©λ‹ˆλ‹€.

      • μΈκ·Έλ ˆμŠ€λŠ” λ„€νŠΈμ›Œν¬ μŠ€νƒμ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 계측(HTTP)μ—μ„œ μž‘λ™ν•˜λ©° μ„œλΉ„μŠ€κ°€ ν•  수 μ—†λŠ” μΏ ν‚€ 기반 μ„Έμ…˜ μ–΄ν”Όλ‹ˆν‹° λ“±κ³Ό 같은 κΈ°λŠ₯을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ„œλΉ„μŠ€ 문제 ν•΄κ²°

    • λ¨Όμ € μ™ΈλΆ€κ°€ μ•„λ‹Œ ν΄λŸ¬μŠ€ν„° λ‚΄μ—μ„œ μ„œλΉ„μŠ€μ˜ ν΄λŸ¬μŠ€ν„° IP에 μ—°κ²°λ˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λ €κ³  μ„œλΉ„μŠ€ IP둜 핑을 ν•  ν•„μš” μ—†μŠ΅λ‹ˆλ‹€.(μ„œλΉ„μŠ€μ˜ ν΄λŸ¬μŠ€ν„° IPλŠ” 가상 IPμ΄λ―€λ‘œ ν‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)

    • λ ˆλ””λ‹ˆμŠ€ ν”„λ‘œλΈŒλ₯Ό μ •μ˜ν–ˆλ‹€λ©΄ μ„±κ³΅ν–ˆλŠ”μ§€ ν™•μΈν•˜λΌ. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ νŒŒλ“œλŠ” μ„œλΉ„μŠ€μ— ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • νŒŒλ“œκ°€ μ„œλΉ„μŠ€μ˜ 일뢀인지 ν™•μΈν•˜λ €λ©΄ kubectl get endpointsλ₯Ό μ‚¬μš©ν•΄ ν•΄λ‹Ή μ—”λ“œν¬μΈνŠΈ 였브젝트λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

    • FQDNμ΄λ‚˜ κ·Έ 일뢀(myservice.mynamespace.svc.cluster.local λ˜λŠ” myservice.mynamespace)둜 μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•˜λ €κ³  ν•˜λŠ”λ° μž‘λ™ν•˜μ§€ μ•ŠλŠ” 경우, FQDN λŒ€μ‹  ν΄λŸ¬μŠ€ν„° IPλ₯Ό μ‚¬μš©ν•΄ μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • λŒ€μƒ ν¬νŠΈκ°€ μ•„λ‹Œ μ„œλΉ„μŠ€λ‘œ λ…ΈμΆœλœ ν¬νŠΈμ— μ—°κ²°ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • νŒŒλ“œ IP에 직접 μ—°κ²°ν•΄ νŒŒλ“œκ°€ μ˜¬λ°”λ₯Έ ν¬νŠΈμ— 연결돼 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • νŒŒλ“œ IP둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ•‘μ„ΈμŠ€ν•  수 μ—†λŠ” 경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‘œμ»¬ν˜ΈμŠ€νŠΈμ—λ§Œ λ°”μΈλ”©ν•˜κ³  μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

Reference

  • https://www.oreilly.com/library/view/kubernetes-in-action/9781617293726/

  • https://www.oreilly.com/library/view/cloud-native-devops/9781492040750/

Last updated