간단한 내용이지만 이 간단한 정보를 확인하는데 불필요한 삽질을 하였기에 도움이 될까 포스팅합니다.

서로 다른 노드에 있는 pod간 통신을 완성하기 위해서는 관련 기능을 제공하는 network plugin이 필요하다.
필자의 경우는 flannel plugin을 설치했다.

구글링하다 좋은 케이스를 찾았기에 공유

* 만약 잘못된 정보가 있으면 지적해주세요




그림을 보면 노드1에서 노드2로 다른 ip끼리 패킷을 보낼 때, 보내는 컨테이너의 출발지와 목적지를 가지고 있는 모습을 확인 할 수 있다.
그리고 flannel에서 패킷을 주고받는 node의 출발지와 목적지 정보를 UDP로 캡슐화해서 보내는 역할을 수행한다. 
이런 식으로 flannel plugin을 설치하여 컨테이너 간 통신을 할 수 있다.

테스트한 yaml파일은 아래와 같다.
$ cat cent.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - image: centos:7.2.1511
        name: test
        command: ["/bin/bash","-c","while true; do sleep 1000; done"]
        imagePullPolicy: IfNotPresent



$ cat mysql.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    name: mysql-pod
    context: docker-k8s-lab
spec:
  containers:
    -
      name: mysql
      image: mysql:5.7
      env:
        -
          name: "MYSQL_USER"
          value: "mysql"
        -
          name: "MYSQL_PASSWORD"
          value: "mysql"
        -
          name: "MYSQL_DATABASE"
          value: "sample"
        -
          name: "MYSQL_ROOT_PASSWORD"
          value: "supersecret"
      ports:
        -
          containerPort: 3306

yaml을 통해 centos, mysql을 실행하여 centos pod에서 mysql에 접속되는 지 테스트

pods 확인
$ kubectl get pods
mysql-pod                       1/1       Running   0          6m
test-6b5c774944-fqcdl           1/1       Running   0          17m


mysql을 설치해준다.
$ yum install mysql 

master서버에서 mysql pod의 ip주소 체크
$  kubectl describe pod test-6b5c774944-fqcdl
Name:               mysql-pod
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               jf-api/192.168.0.89
Start Time:         Tue, 03 Jul 2018 17:32:13 +0900
Labels:             context=docker-k8s-lab
                    name=mysql-pod
Annotations:        kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"context":"docker-k8s-lab","name":"mysql-pod"},"name":"mysql-pod","namespace":"d...
Status:             Running
IP:                 10.244.1.53
Containers:
  mysql:
    Container ID:   docker://ee63968f90c86a3062627a68c3830d425b1b385ebc61cc1c960e824411799f7e
    Image:          mysql:5.7
    Image ID:       docker-pullable://mysql@sha256:f030e84582d939d313fe2ef469b5c65ffd0f7dff3b4b98e6ec9ae2dccd83dcdf
    Port:           3306/TCP
    State:          Running
      Started:      Tue, 03 Jul 2018 17:32:16 +0900
    Ready:          True
    Restart Count:  0
    Environment:
      MYSQL_USER:           mysql
      MYSQL_PASSWORD:       mysql
      MYSQL_DATABASE:       sample
      MYSQL_ROOT_PASSWORD:  supersecret
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-dn4mq (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-dn4mq:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-dn4mq
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              9m    default-scheduler  Successfully assigned mysql-pod to jf-api
  Normal  SuccessfulMountVolume  9m    kubelet, jf-api    MountVolume.SetUp succeeded for volume "default-token-dn4mq"
  Normal  Pulled                 9m    kubelet, jf-api    Container image "mysql:5.7" already present on machine
  Normal  Created                9m    kubelet, jf-api    Created container
  Normal  Started                9m    kubelet, jf-api    Started container


centos접속 후 mysql 접속확인
$ kubectl exec -it test-6b5c774944-fqcdl /bin/sh

sh-4.2# mysql -h10.244.1.22 -umysql -pmysql -Dsample
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [sample]

이와 같이 pod간 커뮤니케이션을 flannel을 통해 할 수 있다는 것을 확인했다.!




 



'apps > docker' 카테고리의 다른 글

쿠버네티스란 무엇인가?  (0) 2018.08.18
도커란 무엇인가?  (0) 2018.08.04
flannel을 통한 pod간 통신  (2) 2018.07.03
도커에서 nodejs+mongodb 테스트  (0) 2018.07.01
kubernetes에서 gpu pod생성( nvidia-docker2 )  (2) 2018.05.30
centos7에서 nvidia driver설치하기  (0) 2018.05.28
  1. domwis 2020.12.07 23:36

    master 서버에서 mysql pod의 IP주소 확인 부분에서 아래 코드는 test 서버의 주소를 불러오는 것으로 되어있습니다.
    따라서 centos 접속해서 확인하는 부분에서 IP주소가 차이가 납니다.

    • 작성자 2021.05.06 12:32

      네 각 환경별로 Ip주소는 동일하지 않고 다르게 표시되는게 맞습니다.
      댓글 감사합니다. ^^

+ Recent posts