Viya 4 에서 Python 을 붙이는 방법은 두 가지이고 둘을 섞어 쓰는 것이 아니라 하나를 고르는 것이다.
| 방식 | 내용 |
|---|---|
SAS Configurator for Open Source (sas-pyconfig) |
배포 과정에서 Job 이 Python 을 소스 빌드하고 지정한 패키지를 설치해 PVC 에 올린다 |
| 외부 Python 볼륨 | 별도로 만든 Python 트리를 외부 스토리지에 두고 마운트한 뒤 경로를 지정한다 |
SAS 는 전자를 권장한다. 다만 폐쇄망에서는 소스 빌드와 패키지 설치가 모두 외부 네트워크를 요구하므로 준비할 것이 많다.
sas-bases/examples/configuration/pyconfig 아래 예제를 site-config 로 복사해 고친다. 주요 파일은 둘이다.
| 파일 | 역할 |
|---|---|
change-configuration.yaml |
Python 버전, 설치할 패키지 목록, pip 옵션 |
python-transformer.yaml |
Python 볼륨을 어느 컨테이너의 어느 경로에 마운트할지 |
마운트 경로는 전 컨테이너에서 같아야 한다. Compute · CAS · MAS 중 한 곳만 /python 이고 나머지는 /opt/sas/viya/home/sas-pyconfig 같은 식으로 어긋나면 "어디서는 되고 어디서는 안 되는" 상태가 된다.
MAS 에서 Python 모델을 돌린다면 Java 정책 허용 목록도 같은 경로를 가리켜야 한다.
SAS_JAVA_POLICY_ALLOW_DM_PYPATH=/opt/sas/viya/home/sas-pyconfig/default_py/bin/python3
설치할 패키지는 wheel 파일로 미리 받아 두고 로컬 경로를 pip 옵션으로 지정한다. 의존성까지 전부 필요하다.
pip download --only-binary=:all: --python-version 3.10 \
--platform manylinux2014_x86_64 -d ./wheels -r requirements.txt
pip download 는 대상 플랫폼과 파이썬 버전을 명시하지 않으면 빌드 머신 기준으로 받아 버린다. 컨테이너와 같은 조건을 지정해야 한다.
sas-pyconfig Job 은 사용자 패키지를 설치하기 전에 pip · setuptools · wheel 같은 기본 도구를 정렬하는 단계를 먼저 돈다. 폐쇄망이면 이 단계에서 외부로 나가려다 실패한다.
원본 대화에서는 이 단계를 끄는 설정이 없다고 결론지었으나, 이는 공식 문서로 확인되지 않았다 (확인 필요). 실무적으로는 해당 도구들의 wheel 도 함께 로컬 wheel 디렉터리에 넣어 두면 업그레이드 단계가 로컬에서 해결된다. 이쪽이 안전하다.
업그레이드 단계가 실패해도 Python 자체는 만들어지는 경우가 있다. 다만 Job 이 실패 상태로 남고 지정한 패키지가 설치되지 않으므로 정상 구성으로 보면 안 된다.
Viya 버전과 컨테이너 아키텍처가 같다면, 한 환경에서 만든 sas-pyconfig PVC 의 Python 트리를 그대로 옮겨 쓸 수 있다.
rsync -aH --numeric-ids \
/nfs/src/sas-pyconfig/Python-3.10.x.<build> /nfs/dst/sas-pyconfig/
rsync -aH --numeric-ids /nfs/src/sas-pyconfig/wheels /nfs/dst/sas-pyconfig/
cd /nfs/dst/sas-pyconfig
ln -sfn Python-3.10.x.<build> default_py
옮긴 뒤 검증한다.
kubectl -n <namespace> exec -it <compute-pod> -- \
/opt/sas/viya/home/sas-pyconfig/default_py/bin/python3 --version
kubectl -n <namespace> exec -it <compute-pod> -- \
/opt/sas/viya/home/sas-pyconfig/default_py/bin/python3 -m pip list
이 방식으로 갈 때는 sas-pyconfig Job 을 다시 돌릴 필요가 없다. 나중에 Python 버전을 바꿀 때만 다시 돌린다.
Python 트리를 담은 PVC 를 여러 파드에서 공유하면서 읽기 전용(readOnly: true)으로 마운트하면, 다른 파드에서 pip list 만 해도 실패할 수 있다.
PermissionError: [Errno 13] Permission denied
pip 는 조회만 해도 캐시나 임시 파일을 쓰려 하기 때문이다. 마운트 모드를 풀지 않고 넘기려면 쓰기 경로를 다른 곳으로 돌린다.
export PIP_CACHE_DIR=/tmp/pipcache
export PYTHONPYCACHEPREFIX=/tmp/pycache
python3 -m pip list --no-cache-dir
import sys 의 경로가 같고 RWX PVC 인데도 ModuleNotFoundError 가 나는 경우는 대개 이 읽기 전용 마운트 때문이다.