코알못

[CKA] kubernetes Headless Service(core-dns 기능이용), kube Proxy 본문

ETC

[CKA] kubernetes Headless Service(core-dns 기능이용), kube Proxy

코린이s 2023. 9. 10. 13:03
728x90

Headless 서비스는 ClusterIP 설정 없이 서비스를 사용하는것으로 IP 필요 없이 Pod의 DNS(core dns에 저장) 호출가능하도록 한다.

# headless-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: headless-svc
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

생성한다.

$ kubectl create -f headless-svc.yaml 
service/headless-svc created

서비스를 확인 하면 Cluster IP가 할당 되지 않았다.

$ kubectl get svc
NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
headless-svc   ClusterIP   None         <none>        80/TCP    65s
kubernetes     ClusterIP   10.96.0.1    <none>        443/TCP   2m29s

서비스의 엔드 포인트를 확인해보면 엔드포인트는 3개가 정상적으로 묶여 있다.

$ kubectl get endpoints
NAME           ENDPOINTS                             AGE
headless-svc   10.5.1.2:80,10.5.1.3:80,10.5.1.4:80   16s

이제 IP 없이 dns 를 통해 호출하기위해 사용한다고 했으니 한번 dns 설정이 되어 있는지 확인 해보도록 한다.

우선 테스트를 위해 centos 파드를 띄워 접속한다.

$ kubectl run my-centos -it --image=centos:7
If you don't see a command prompt, try pressing enter.
[root@my-centos /]#

 DNS 설정을 확인한다. nameserver는 coredns 의 IP 이다.

[root@my-centos /]# cat /etc/resolv.conf 
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5

 

우리는 cluster ip 가 아닌 kubernetes code-dns의 DNS 기능을 이용하여 파드 통신을 하도록 하며

서비스명으로 통신할때 사용할 수 있다.

[root@my-centos /]# curl headless-svc
#1
[root@my-centos /]# curl headless-svc
#1
[root@my-centos /]# curl headless-svc
#1
[root@my-centos /]# curl headless-svc
#3
[root@my-centos /]# curl headless-svc
#3
[root@my-centos /]# curl headless-svc
#2
[root@my-centos /]# curl headless-svc
#1
[root@my-centos /]# curl headless-svc
#2

참고 사항으로 파드 생성시 core dns의 경우 [-로 구분된 pod ip].default.pod.cluster.local 로 DNS 등록을 하게 되며

아래와 같이 각 파드 호출도 가능하다.

[root@my-centos /]# curl 10-5-1-2.default.pod.cluster.local
#1
[root@my-centos /]# curl 10-5-1-2.default.pod.cluster.local
#1
[root@my-centos /]# curl 10-5-1-2.default.pod.cluster.local
#1
[root@my-centos /]# curl 10-5-1-2.default.pod.cluster.local
#1

이제 kube-proxy 에 대해 알아보자!

kube-proxy 는 서비스 API 요청시 iptables 규칙이 생성되며 파드와 통신 할 수 있도록 해주며

클라이언트가 노드, IP를 호출하면 kube-proxy가 받아서 iptables 룰 보고 파드를 연결해준다고 생각하면 된다.

아래 보면 nodeport 서비스가 생성 되어 있으며 노드의 IP, Port 호출시 해당 포트에 맞는 3개의 파드로 kube-proxy가 연결 시켜 주어 호출 되는것을 볼 수 있다.  

[node1 ~]$ kubectl get svc
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nodeport-service   NodePort    10.100.100.200   <none>        80:30200/TCP   7s
[node1 ~]$ kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS      AGE   IP          NODE    NOMINATED NODE   READINESS GATES
deploy-nginx-74bb667f4-8jgz6   1/1     Running   0             16m   10.5.1.10   node2   <none>           <none>
deploy-nginx-74bb667f4-lkt8q   1/1     Running   0             16m   10.5.1.9    node2   <none>           <none>
deploy-nginx-74bb667f4-zbbj6   1/1     Running   0             16m   10.5.1.11   node2   <none>           <none>
my-centos                      1/1     Running   1 (10m ago)   15m   10.5.1.12   node2   <none>           <none>
[node1 ~]$ kubectl get nodes -o wide
NAME    STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION      CONTAINER-RUNTIME
node1   Ready    control-plane   3h20m   v1.27.2   192.168.0.23   <none>        CentOS Linux 7 (Core)   4.4.0-210-generic   containerd://1.6.21
node2   Ready    <none>          3h4m    v1.27.2   192.168.0.22   <none>        CentOS Linux 7 (Core)   4.4.0-210-generic   containerd://1.6.21
[node1 ~]$ 
[node1 ~]$ curl 192.168.0.22:30200
#3
[node1 ~]$ curl 192.168.0.22:30200
#1
[node1 ~]$ curl 192.168.0.22:30200
#1
[node1 ~]$ curl 192.168.0.22:30200
#1

끝!

728x90
Comments