【IBM Cloud k8s 검증 메모】동일한 POD에 있는 2개의 컨테이너간에 제휴하는 방법

"Dockerfile을 작성하는 모범 사례"에서 "대부분의 경우 하나의 컨테이너에서 하나의 프로세스 만 실행해야합니다. 애플리케이션을 여러 컨테이너로 분리하면 수평 스케일 및 컨테이너 재사용이 간단 해집니다. 서비스와 서비스에 종속성이 있다면 컨테이너 링크를 사용합니다. 유일하게 가까운 것은 "Communicate Between Containers in the Same Pod Using a Shared Volume"[2]밖에 발견할 수 없었다.

그래서, 동일한 POD내에서, 2개의 컨테이너가 통신하는 경우의 방법에 관한 메모입니다.

포드 정보



포드의 개요를 검토해 보면 다음과 같이 기술되었습니다. [4]
포드는 애플리케이션 컨테이너(경우에 따라 여러 컨테이너), 스토리지 리소스, 고유한 네트워크 IP 및 컨테이너 실행 방법을 관리하는 옵션을 캡슐화합니다. Pod는 Kubernetes 애플리케이션의 단일 인스턴스입니다. 단일 컨테이너 또는 긴밀하게 결합되어 리소스를 공유하는 소수의 컨테이너로 구성됩니다."

이 표현을 PHP의 어플리케이션 실행 환경의 일부로 옮겨놓으면 다음과 같은 그림이 됩니다. 이 중에서 이번 주목하는 것은 빨간색 화살표 부분의 실현 방법입니다.



해결책



각 컨테이너에 IP 주소가 부여되는 것이 아니라, Pod에서 같은 IP 주소가 된다면, 그와 동시에 localhost도 공유하고 있는 것입니다. 즉, Web Container의 localhost에서 AP Container의 php-fpm도 포트를 열고 요청을 기다리고 있습니다.

실제로 AP Container에 들어가서 net-tools를 설치하고 netstat로 검사하면 Web Container의 TCP 80번 포트가 보입니다.
$ kubectl exec -it frontend-deploy-1665229993-12gd0 -c app bash
root@frontend-deploy-1665229993-12gd0:/var/www# netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6/nginx: master pro
tcp6       0      0 :::9000                 :::*                    LISTEN      13/php-fpm.conf)

그래서, nginx측의 설정으로, 원래, docker 커멘드의 --link 옵션으로 접속처 컨테이너를 지정한 부분을, 다음과 같이 localhost에 변경하는 것으로, 접속이 가능하게 됩니다.

/etc/nginx/conf.d/default.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass localhost:9000;    <--- ここの部分は、--link で与えた名前からlocalhostへ変更する
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

k8s yaml 파일



다음 파일은 kubectl에 제공하는 Deployment YAML 파일의 해당 부분입니다. 영구 볼륨을 공유하는 부분 이외에는 설정할 필요가 없습니다.

s061_web_app_deployment.yml의 spec 부분 발췌
    spec:
      containers:
      - name: app
        image: registry.ng.bluemix.net/takara/app:v1
        env:
        - name: DB_USER
          value: root
        - name: DB_PASSWORD
          value: root
        resources: {}
        volumeMounts:
        - mountPath: /var/www
          name: www-vol
          subPath: www
      - name: web
        image: registry.ng.bluemix.net/takara/web:v2
        ports:
        - containerPort: 80
        resources: {}
        volumeMounts:
        - mountPath: /var/www
          name: www-vol
          subPath: www
      restartPolicy: Always
      volumes:
      - name: www-vol
        persistentVolumeClaim:
          claimName: mysql-claim1

참고 자료



[1] Dockerfile을 작성하는 모범 사례 htp // // cs. 도 c r. jp / 엔기네 / 우세 r 구이 데 / 엔 g 낫게 / 도 c 케 r 후우 _ 베 stp 등 c 치세. HTML
[2] Communicate Between Containers in the Same Pod Using a Shared Volume htps : // 곰팡이 s. 이오 / 드 cs / 타 sks / 아세스 s 아 p- 카치 온 - c ぅ s r/
[3] The containers in same pod shares the localhost, so you need not link containers, just use localhost:containerPort. h tps : // s t c ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 27103763 / 쿠베 r 네 테 s - 곤푸 쿠라 치온 - ぃん k 콘 네 rs # 코멘 t65978824_31768361
[4] Pod Overview htps : // 곰팡이 s. 이오 / 드 cs / こせ pts /

좋은 웹페이지 즐겨찾기