일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- hive
- Docker
- java
- 젠킨스
- SpringBoot
- Cluster
- vue
- 로그인
- Kafka
- 예제
- ec2
- fastcampus
- 클러스터
- Mac
- Zeppelin
- 레디스
- Jenkins
- login
- 설정
- 간단
- aws
- 자바
- gradle
- redash
- 머신러닝
- EMR
- 자동
- Redis
- config
- spring
- Today
- Total
코알못
[CKA] kubernetes Headless Service(core-dns 기능이용), kube Proxy 본문
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
끝!
'ETC' 카테고리의 다른 글
[pyspark] UNSUPPORTED_SUBQUERY_EXPRESSION_CATEGORY (0) | 2023.09.14 |
---|---|
[kubernetes] Ingress - IngressController 설치 (0) | 2023.09.10 |
[CKA] kubernetes Service (0) | 2023.09.10 |
[CKA] kubernetes Controller - JobController (0) | 2023.09.10 |
[CKA] kubernetes Controller - StatefulSet (0) | 2023.09.09 |