본문 바로가기

kubernetes, helm, rancher

kubernetes services

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

 

  • Kubernetes Service -> pod들은 각각의 ip를 가지는데, 특정 pod들에 집중되면 성능이 안좋으니 pod들을 하나의 ip로 묶어 load balancer를 등록한다.
    apiVersion: v1
    kind: Service
    metadata:
      name: webui-svc
    spec:
      clusterIP: 10.96.100.100
      selector:
        app: webui # deployment의 labels를 넣는다.
      ports:
      - protocol: TCP
        port: 80 # cluster ip로 들어가는 port
        targetPort: 80 # pod들의 port
    • Service Type : ClusterIP, NodePort, LoadBalancer, ExternalName
    • ClusterIP -> 가장 basic하며, pod들의 진입점을 설정한다음 균등하게 분배한다.
    • NodePort -> ClusterIP기능을 가지고 있으면서 특정 포트를 ClusterIP를 통해 열었을 때 pod들의 port도 같은 넘버로 모두 열린다. 특정 node로 요청했을 때 load balancer역할을 한다.
    • LoadBalancer -> node로 요청했을 때 실제 LB와 node을 연결해준다음 Load Balancer를 해주는 작업.(aws, azure, gcp같은 플랫폼에서만 쓸 수 있다.)
    • ExternalName -> dns 서비스처럼 특정 domain을 설정해주면 pod들이 외부와 통신할 때 domain을 설정한 domain으로 바꿔준다.
  • cluster ip를 지정하지 않으면 default로 10.96.0.0/12 범위에서 랜덤으로 할당. 보통 충돌 막기위해 랜덤으로 할당.
  • kubectl describe svc [svc name] -> ip와 port, endpoints(pod ip)들의 정보를 볼 수 있음.
  • NodePort -> 모든 노드를 대상으로 외부 접속 가능한 포트를 예약, default NodePort 범위는 30000-32767이며, ClusterIP를 생성 후 NodePort를 예약.
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  clusterIP: 10.100.100.200
  selector:
    app:sebui
  ports:
  - protocol: TCP
    port: 80 # service ip를 통해 나가는 port
    targetPort: 80 # pod의 port
    nodePort: 30200 # 생략가능. 생략하면 default port가 생성.
                    # 외부에서 특정 노드에 접근해서 다른 노드들에 load balance해준다.
  • load balancer는 public 클라우드에 쓰이며, nodeport를 예약 한 후 해당 nodeport로 load balance장비로 자동으로 연결해준다.

 

apiVersion: v1
kind: Service
...
spec:
  type: LoadBalancer
  ...
  externalIPs:
    - 80.11.12.10

 

  • 실제 장비 EXTERNAL-IP가 있어야 하며, 없으면 pending상태.
  • externalName은 클러스터 내부에서 외부로 통신하고자 할때 dns service를 해주는 기능.
  • externalName: domain.com 으로 설정하고, cluster pod내에서 curl [externalname-svc: externalName 이름].default.svc.cluster.local하면 domain.com으로 가게 된다.

 

...
spec:
  type: ExternalName
  externalName: google.com

 

  • Headless Service -> clusterIP가 없는 서비스이며 routing, load-balancer가 필요없는 서비스에 적합. DNS resolving service로 control plane의 coreDNS에 저장해서 [pod-ip-addr].namespace.pod.cluster.local을 통해 연결해주는 서비스. 

 

...
spec:
  type: ClusterIP
  clusterIP: None
  externalName: google.com
  ...

 

  • pod의 /etc/resolv.conf 파일을 보면 nameserver는 coredns ip인 것을 볼 수있으며, ex)curl 10-45-0-1.default.pod.cluster.local을 통해 dns resolving서비스를 지원해줘서 연결할 수 있게 된다.
  • kube-proxy -> kubernetes Service의 backend 구현. master, node들에 kube-proxy라는 namespace가 작동됨. 즉, clusterip로 접속하면 특정 service pod로 접근하도록 iptables가 만들어짐. 또한, nodeport로의 접근과 pod 연결을 iptables에 구성한다.