본문 바로가기

Kubernetes

[Kubernetes] Kubernetes Network

반응형

도커 컨테이너 네트워킹

 - 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