클러스터 네트워킹
도커 컨테이너 네트워킹
node1의 컨테이너 10.244.1.2와, node2의 컨테이너 10.244.2.2의 통신을 위해 CNI라는것이 필요.
만약 수동으로 설정한다면 네트웍 네임스페이스 만들고 브릿지 타입으로 설정하고 활성화 시키고 등등....해야하는 일이 엄청나게 많아진다.


kube-proxy
deployment로 replicas 3개 nginx 파드실행하고 service로 단일진입점 clusterIP: 10.96.100.100 만들면 curl 10.96.100.100 에 결과가 보인다. 이게 가능한 이유는 etcd에 단일진입점 10.96.100.100과, 이 아래 파드들의 endpoint IP를 관리하게 되는데 이 때, 각 노드의 kube-proxy가 iptables rule을 만들어서 연결시켜 주게 되는 것이다. |

# 위의 deployment replicas3개짜리와, 단일진입점 10.96.100.100 에 대해서
# nat 테이블을 볼 것이고, saved 모드로 조회
iptables -t nat -S |grep 10.96.100.100
-A KUBE-SERVICES -d 10.96.100.100/32 -p tcp -m comment --comment "default/webui-svc cluster IP" -m tcp --dport 80 -j KUBE-SVC-7SIYQBMMK7OI4QAT
iptables -t nat -S |grep KUBE-SVC-7SIYQBMMK7OI4QAT
-N KUBE-SVC-7SIYQBMMK7OI4QAT
-A KUBE-SERVICES -d 10.96.100.100/32 -p tcp -m comment --comment "default/webui-svc cluster IP" -m tcp --dport 80 -j KUBE-SVC-7SIYQBMMK7OI4QAT
-A KUBE-SVC-7SIYQBMMK7OI4QAT -m comment --comment "default/webui-svc -> 10.36.0.1:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-KYIH52JRZZ5DRNIF
-A KUBE-SVC-7SIYQBMMK7OI4QAT -m comment --comment "default/webui-svc -> 10.36.0.2:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-2YMOGVBITD26RR6I
-A KUBE-SVC-7SIYQBMMK7OI4QAT -m comment --comment "default/webui-svc -> 10.44.0.6:80" -j KUBE-SEP-YYJNHOIWJFEBP6NA
# 파드가 3개이니, 처음 진입시 33%로 거르고,
# 남은 67%의 50%로 거르고(33%), 다시 남은걸로 보내는식
# node port로 들어올때도 마찬가지로 iptables를 이용하여 로드밸런싱 된다.
쿠버네티스 DNS
coreDNS : Service 및 Pod용 DNS
외부dns가 아니라, pod 안에서 다른 pod를 찾을때 사용할 수 있는 DNS이다.
📎
DNS를 통해 Service와 Pod Access
{service_name}
.{namespace}
.svc.cluster.local{Pod-IP-Address}
.{namespace}
.pod.cluster.local#deployment(web)로 replicas 3개 nginx 파드실행하고
#service(svc-web)로 단일진입점 clusterIP: 10.96.100.100 만든다.
#curl 10.96.100.100 에 결과가 보인다.
#pod 안에서의 테스트를 위해, 바로 진입하는 centos 파드를 만들고
kubectl run client-pod --image=centos:7 -it --rm -- /bin/bash
[root@client-pod /]# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local #<--- 자동으로 뒷 주소를 붙여준다는 이야기이고
nameserver 10.96.0.10 # <--- nameserver가 10.96.0.10(coreDNS)으로 고정된 것을 볼 수 있다
options ndots:5
[root@client-pod /]# curl 10.96.100.100 #<-- ClusterIP로의 연결.. 되는구나
[root@client-pod /]# curl svc-web.default.svc.cluster.local #<-- ClusterIP로의 연결.. 되는구나
[root@client-pod /]# curl svc-web #<-- ClusterIP로의 연결.. 되는구나
[root@client-pod /]# curl 10-36-0-1.default.pod #<-- Pod들중 하나로의 연결.. 되는구나
❓dns를 coreDNS 쓰지않고 customDNS 가능할까? 가능하다
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 1.2.3.4 #<-- 네임서버 ip를 지정할 수 있고
searches:
- ns1.svc.cluster-domain.example #<-- search 옵션도 설정할 수 있다.
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0