Zeppelin on Kubernetes with Connections
1. Installation
1.1 Installing Zeppelin on Kubernetes
먼저 zeppelin-server.yaml 을 다운로드 받습니다.
$ curl -s -O https://raw.githubusercontent.com/apache/zeppelin/master/k8s/zeppelin-server.yaml
다운 받은후 설정 버그를 수정합니다. (뭔가 업데이트가 잘 안되고 있네요)
- data.ZEPPELIN_K8S_CONTAINER_IMAGE (32줄)
apache/zeppelin-interpreter:0.10.0
->apache/zeppelin:0.10.0
- spec.template.spec.containers.image (118줄)
apache/zeppelin-server:0.10.0
->apache/zeppelin:0.10.0
Image Bug를 수정후 만약 EKS 를 사용중이고, LoadBalancer를 달려고 한다면 Service 부분을 찾아서 다음과 같이 수정합니다.
kind: Service
apiVersion: v1
metadata:
name: zeppelin-server
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
- name: rpc # port name is referenced in the code. So it shouldn't be changed.
port: 12320
selector:
app.kubernetes.io/name: zeppelin-server
아래와 같이 ZEPPELIN_RUN_MODE
를 추가합니다.
Kubernetes cluster 모드는 현재 불안정한게 많습니다.
아무래도 관리가 전혀 되고 있지 않은거 같습니다.
Kubernetes 환경에서는 뭔가 실행시 새로운 pod을 열게 됩니다.
문제는 bigquery 에 접속할때 필요한 authentication등이나 환경변수가 전혀 복사되지 않습니다.
이로 인해서 접속이 안되게 됩니다.
따라서 local 환경으로 작동시킵니다.
- ZEPPELIN_RUN_MODE: Run mode. ‘auto|local|k8s’. ‘auto’ autodetect environment. ‘local’ runs interpreter as a local process. k8s runs interpreter on Kubernetes cluster
apiVersion: v1
kind: ConfigMap
metadata:
name: zeppelin-server-conf-map
data:
ZEPPELIN_HOME: /opt/zeppelin
ZEPPELIN_RUN_MODE: local
$ kubectl apply -f zeppelin-server.yaml
1.2 Persistent Volume for Zeppelin
persistent volume 을 요청하는 부분을 작성합니다.
[생략]
spec:
serviceAccountName: zeppelin-server
volumes:
- name: zeppelin-server-conf-pv # persistent volume 요청
persistentVolumeClaim:
claimName: zeppelin-server-conf-pvc
- name: zeppelin-server-notebook-pv # persistent volume 요청
persistentVolumeClaim:
claimName: zeppelin-server-notebook-pvc
spec.template.spec.containers.volumeMounts
에 persistent volume을 연결 시킵니다.ㄴ
spec:
template:
spec:
serviceAccountName: zeppelin-server
containers:
volumeMounts:
- name: zeppelin-server-notebook-pv # configure this to persist notebook
mountPath: /opt/zeppelin/notebook
- name: zeppelin-server-conf-pv # configure this to persist Zeppelin configuration
mountPath: /opt/zeppelin/conf
맨 아래로 내려가서 다음을 추가합니다.
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: zeppelin-server-conf-pvc
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: gp2
volumeMode: Filesystem
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: zeppelin-server-notebook-pvc
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: gp2
volumeMode: Filesystem
마지막으로 권한을 수정합니다.
securityContext 를 추가 합니다.
spec:
template:
spec:
containers:
- name: zeppelin-server
image: apache/zeppelin:0.10.0
securityContext:
runAsUser: 0
잘되었는지 확인해 봅니다.
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS
zeppelin-server-conf-pvc Bound pvc-12345678-bb06-4b4b-bbdb-aa1234567890 1Gi RWO gp2
zeppelin-server-notebook-pvc Bound pvc-abcdefgh-a2de-4ea3-a433-bb0987654321 1Gi RWO gp2
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS
pvc-12345678-bb06-4b4b-bbdb-aa1234567890 1Gi RWO Delete Bound default/zeppelin-server-conf-pvc gp2
pvc-abcdefgh-a2de-4ea3-a433-bb0987654321 1Gi RWO Delete Bound default/zeppelin-server-notebook-pvc gp2
설치가 잘됐는지 확인해 봅니다.
$ kubectl exec -it <zeppelin-server-pod-name> -- sh
$ cat /proc/mounts | grep zeppelin
/dev/nvme2n1 /zeppelin/notebook ext4 rw,relatime 0 0
/dev/nvme3n1 /zeppelin/conf ext4 rw,relatime 0 0
1.3 BigQuery Setting
먼저 secret key 를 파일로 부터 생성해줍니다.
이름은 service account라는 뜻으로 gcp-sa-secret-key 로 만들어 줍니다.
.json 파일은 반드시 absolute path 이어야 합니다.
$ kubectl create secret generic gcp-sa-secret-key --from-file=<absolute path of gcp-sa.json>
$ kubectl get secret gcp-sa-secret-key -o yaml
해당 secret key를 volume으로 올려주기 위해서 zeppelin-server.yaml 파일을 다시 수정합니다.
kind: Deployment
를 찾고 spec.template.spec.volumes
에다가 다음을 추가 합니다.
- gcp-sa-credentials-volume: volume 이름
- gcp-secret.json:
kubectl get secret gcp-sa-secret-key -o yaml
실행한뒤..- data안에 key를 확인하면 됨
- 보통 파일이름이 그대로 들어감
[생략]
spec:
serviceAccountName: zeppelin-server
volumes:
- name: gcp-sa-credentials-volume
secret:
secretName: gcp-sa-secret-key
items:
- key: gcp-secret.json
path: gcp-sa-credentials.json
생성한 volume을 mount 시켜줍니다.
spec.template.spec.containers.volumeMounts
아래에다가 넣습니다.
- gcp-sa-credentials-volume: 우에서 생성한 volume 이름을 그대로 넣습니다.
spec:
template:
spec:
serviceAccountName: zeppelin-server
containers:
volumeMounts:
- name: gcp-sa-credentials-volume
mountPath: /etc/gcp
readOnly: true
환경변수를 설정합니다.
spec:
template:
spec:
serviceAccountName: zeppelin-server
containers:
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /etc/gcp/gcp-sa-credentials.json
실제 pod안에 들어가서 잘되는지 확인해 봅니다.
$ kubectl exec -it <zeppelin-server-pod-name> -- sh
# 잘되는지 확인
$ env | grep -i GOOGLE_APPLICATION_CREDENTIALS
$ cat /etc/gcp/gcp-sa-credentials.json
1.4 MariaDB
Interpreter 에서 JDBC 를 설정하면 됩니다.
- default.url:
jdbc:mariadb://127.0.0.1:3306
- default.user: 유저 이름
- default.password: 암호
- default.driver: org.mariadb.jdbc.Driver
- Dependencies
org.mariadb.jdbc:mariadb-java-client:2.7.3
이렇게 설정해주고.. 노트북에서는 %jdbc
로 사용합니다.