도커 컨테이너 네트워킹
- Container Network Model
- docker0
1. virtual ethernet bridge : 172.17.0.0/16
2. L2 통신기반
3. container 생성 시 veth 인터페이스 생성(sandbox)
4. 모든 컨테이너는 외부 통신을 docker0 통해 진행
5. container running 시 172.17.X.Y 로 IP 주소 할당
컨테이너 네트워크 인터페이스(CNI)
- 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준
master 노드에서 컨테이너 인터페이스 확인
- weave-net 은 노드 당 하나씩 생성(master 1개, 노드 2개)
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx ingress-nginx-controller-6c56945c75-hn2b8 1/1 Running 0 14m
kube-system coredns-565d847f94-k9kvr 1/1 Running 24 (22m ago) 70d
kube-system coredns-565d847f94-tdhmn 1/1 Running 24 (22m ago) 70d
kube-system etcd-master.example.com 1/1 Running 27 (22m ago) 70d
kube-system kube-apiserver-master.example.com 1/1 Running 27 (22m ago) 70d
kube-system kube-controller-manager-master.example.com 1/1 Running 27 (22m ago) 70d
kube-system kube-proxy-6529g 1/1 Running 25 (22m ago) 70d
kube-system kube-proxy-skhgb 1/1 Running 26 (2m57s ago) 70d
kube-system kube-proxy-x5gsk 1/1 Running 23 (2d23h ago) 70d
kube-system kube-scheduler-master.example.com 1/1 Running 27 (22m ago) 70d
kube-system weave-net-bwqrp 2/2 Running 52 (20m ago) 70d
kube-system weave-net-r8v7n 2/2 Running 49 (2d23h ago) 70d
kube-system weave-net-t92nl 2/2 Running 54 (2m57s ago) 70d
kubectl get daemonsets.apps -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-proxy 3 3 1 3 1 kubernetes.io/os=linux 70d
kube-system weave-net 3 3 1 3 1 <none> 70d
kube-proxy, weave-net은 데몬셋 타입으로 동작하기 때문에 노드당 하나씩 추가
kubectl get daemonsets.apps -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system kube-proxy 3 3 1 3 1 kubernetes.io/os=linux 70d
kube-system weave-net 3 3 1 3 1 <none> 70d
kube-proxy
- kube-proxy default mode는 iptables
nginx 웹 서버 3개 web 이름으로 실행
cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
kubectl apply -f deployment.yaml
deployment.apps/web created
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-5cfbcf5f65-db654 1/1 Running 0 72s 10.44.0.4 node2.example.com <none> <none>
web-5cfbcf5f65-vjmbj 1/1 Running 0 72s 10.44.0.2 node2.example.com <none> <none>
web-5cfbcf5f65-vnmxq 1/1 Running 0 72s 10.44.0.3 node2.example.com <none> <none>
kubectl apply -f svc.yaml
service/webui-svc created
curl 10.44.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
webui를 가진 pod를 서비스로 묶음 (webui pod들을 하나의 IP로 묶어서 관리)
cat svc.yaml
apiVersion: v1
kind: Service
metadata:
name: webui-svc
spec:
clusterIP: 10.96.100.100
selector:
app: webui
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl describe svc
kubernetes webui-svc
kubectl describe svc
kubernetes webui-svc
kubectl describe svc webui-svc
Name: webui-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=webui
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.96.100.100
IPs: 10.96.100.100
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.44.0.2:80,10.44.0.3:80,10.44.0.4:80
Session Affinity: None
Events: <none>
10.96.100.100 으로 접속이 들어오면 각 pod로 연결이 되고, 이 작업은 kube-proxy에서 한다.
kube-proxy는 각 노드에서 하나씩 동작되고, 접속이 들어오면 각 kube-proxy에게 10.96.100.100이 들어오면 각 pod에게 연결될 수 있도록 iptables Rule을 만들어 달라고 요청함.
kube-proxy는 커널에게 요청하여 iptables Rule을 만들어 달라고 하고, 커널은 iptables Rule을 만들어서 각 pod에 연결 될 수 있게 만든다.
iptables Rule은 pod가 3개인 경우 각 pod에게 각각 33%씩 통신할 수 있도록 로드밸런싱 할 수 있도록 되어 있다.
노드에서 iptables를 확인
10.96.100.100 IP, 80 Port로 접근하면 KUBE-SVC-7SIYQBMMK7OI4QAT 으로 점프
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
KUBE-SVC-7SIYQBMMK7OI4QAT 으로 도착하면 랜덤으로 33%로 KUBE-SEP-HC6EDMVUCUVBAG2Z
그 다음은 67%의 50%로 KUBE-SEP-BXCQPKXPFJVZYAEZ
그 다음 나머지 확률로 KUBE-SEP-VWM6ELDBVUXU3FPA
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.44.0.2:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-HC6EDMVUCUVBAG2Z
-A KUBE-SVC-7SIYQBMMK7OI4QAT -m comment --comment "default/webui-svc -> 10.44.0.3:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-BXCQPKXPFJVZYAEZ
-A KUBE-SVC-7SIYQBMMK7OI4QAT -m comment --comment "default/webui-svc -> 10.44.0.4:80" -j KUBE-SEP-VWM6ELDBVUXU3FPA
iptables Rule의 경우 랜덤하게 각각 동일하게 pod로 연결되기 때문에 로드밸런싱이 가능하다.
kube-porxy는 API로 서비스를 만들면 그 서비스의 진입점 엔드포인트 지점을 iptables rule 로 커널에게 요청
kube-porxy는 워커 노드마다 하나씩 있고 iptables rule은 각각의 노드에 구성
"kube-proxy는 외부에서 통신을 할 수 있도록 포트를 Listen 해주고, iptables rule을 관리"
kube-proxy 동작 방식
- 3가지 모드 : User space mode, iptables mode, IPVS mode
[참고]
- 유투브 따배쿠 강의
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Autoscaling (0) | 2023.02.09 |
---|---|
[Kubernetes] DNS (0) | 2023.02.09 |
[Kubernetes] Persistent Volume V & Persistent Volume Claim (0) | 2023.02.02 |
[kubernetes] Kubernetes 스토리지 (0) | 2023.01.30 |
[Kubernetes] Kubernetes 권한 (0) | 2023.01.29 |