次の図の様に、ポッドのコンテナ間で、共有メモリの読み書きができることを確認した。結果は、ポッド内で、異なるコンテナ間で、System-V 共有メモリを利用して、データの受け渡しができることが確認できた。
サイドカーポッドのYAML
System-V 共有メモリへ書き込む writerコンテナと、読み取り readerコンテナを作成して、次のYAMLで、一つのポッドとして起動する。
apiVersion: v1
kind: Pod
metadata:
name: sidecar
spec:
containers:
- name: writer
image: maho/sidecar-ipc:w.4
volumeMounts:
- mountPath: /mnt
name: shared-vol
- name: reader
image: maho/sidecar-ipc:r.4
volumeMounts:
- mountPath: /mnt
name: shared-vol
volumes:
- name: shared-vol
emptyDir: {}
結果
コンテナは、異なっていても、二つのコンテナ間で共有メモリを利用して、データの受け渡しができることが確認できた。
(1) 共有メモリに書き込む前に、読み取り、結果な空の応答
imac:sidecar-ipc maho$ kubectl exec -it sidecar -c reader /reader.py
(2) 共有メモリに書き込み
imac:sidecar-ipc maho$ kubectl exec -it sidecar -c writer /writer.py
(3) 共有メモリから読み取り、書き込んだ内容が表示された
imac:sidecar-ipc maho$ kubectl exec -it sidecar -c reader /reader.py
takara aho maho !
コンテナのファイル
この検証で利用したコンテナをビルドするためのファイルです。
Writerコンテナ
FROM python:2
RUN pip install posix_ipc
COPY ./writer.py /writer.py
CMD [ "tail", "-f", "/dev/null" ]
writer.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from time import sleep
import mmap
import posix_ipc as ipc
s = ipc.SharedMemory('/shm', flags=ipc.O_CREAT, size=20, read_only=False)
mm = mmap.mmap(s.fd, s.size)
mm.seek(0)
mm.write(b'takara')
mm.write(b' aho maho')
mm.write(b' !\n')
s.close_fd()
Readerコンテナ
FROM python:2
RUN pip install posix_ipc
COPY ./reader.py /reader.py
CMD [ "tail", "-f", "/dev/null" ]
reader.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import mmap
from time import sleep
import posix_ipc as ipc
s = ipc.SharedMemory('/shm', flags=ipc.O_CREAT, size=20, read_only=False)
mm = mmap.mmap(s.fd, s.size)
mm.seek(0)
print mm.read(20)
print "\n"
参考資料
[1] http://note.crohaco.net/2017/python-posix-ipc-systemv-ipc/
[2] https://www.mirantis.co.jp/blog/multi-container-pods-and-container-communication-in-kubernetes/
[3] https://github.com/kubernetes/kubernetes/issues/28272