์ด ์ฃผ์ ์์๋ Cassandra Datastore ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ทจํ ์ ์๋ ์กฐ์น๋ฅผ ์ค๋ช
ํฉ๋๋ค. Cassandra๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐํ์ ์ํคํ
์ฒ์ cassandra
๊ตฌ์ฑ์์์์ ์คํ๋๋ ์๊ตฌ Datastore์
๋๋ค.
๋ฐํ์ ์๋น์ค ๊ตฌ์ฑ ๊ฐ์๋ ์ฐธ์กฐํ์ธ์.
Cassandra ํฌ๋๊ฐ ๋๊ธฐ์ค ์ํ๋ก ๋ฉ์ถฐ ์์
์ฆ์
์์ํ๋ฉด Cassandra ํฌ๋๊ฐ ๋๊ธฐ์ค ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
์ค๋ฅ ๋ฉ์์ง
kubectl
๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋ ์ํ๋ฅผ ๋ณด๋ฉด ํ๋ ์ด์์ Cassandra ํฌ๋๊ฐ Pending
์ํ๋ก ๋ฉ์ถฐ ์์ต๋๋ค. Pending
์ํ๋ Kubernetes๊ฐ ๋
ธ๋์์ ํฌ๋๋ฅผ ์์ฝํ ์ ์์์ ๋ํ๋
๋๋ค. ํฌ๋๋ ์์ฑ ๋ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl get pods -n namespace
NAME READY STATUS RESTARTS AGE
adah-resources-install-4762w 0/4 Completed 0 10m
apigee-cassandra-default-0 0/1 Pending 0 10m
...
๊ฐ๋ฅํ ์์ธ
ํฌ๋๊ฐ ๋๊ธฐ์ค ์ํ๋ก ๋ฉ์ถฐ ์๋ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ธ | ์ค๋ช |
---|---|
๋ฆฌ์์ค ๋ถ์กฑ | ํฌ๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ CPU ๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํฉ๋๋ค. |
๋ณผ๋ฅจ์ด ์์ฑ๋์ง ์์ | Pod๋ ์๊ตฌ ๋ณผ๋ฅจ์ด ์์ฑ๋ ๋๊น์ง ๋๊ธฐํฉ๋๋ค. |
์ง๋จ
์ค๋ฅ ์์ธ์ ํ์
ํ๊ธฐ ์ํด kubectl
์ ์ฌ์ฉํ์ฌ ํฌ๋๋ฅผ ์ค๋ช
ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl -n namespace describe pods pod_name
์:
kubectl describe pods apigee-cassandra-default-0 -n apigee
์ถ๋ ฅ์ ๋ค์ ๋ฌธ์ ์ค ํ๋๊ฐ ๋ํ๋ ์ ์์ต๋๋ค.
- ๋ฆฌ์์ค ๋ถ์กฑ์ด ๋ฌธ์ ๊ฐ ๋ ๊ฒฝ์ฐ CPU ๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
- Pod์ ๋ฐ์ธ๋ฉ๋์ง ์์ ์ฆ๊ฐ์ ์ธ PersistentVolumeClaim(PVC)์ด ์์์ ๋ํ๋ด๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋ ๊ฒฝ์ฐ Pod์์ ์๊ตฌ ๋ณผ๋ฅจ์ ๋ง๋ค ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฆฌ์์ค ๋ถ์กฑ
CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๊ฐ ์ถฉ๋ถํ๋๋ก Cassandra ๋ ธ๋ ํ์ ์์ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ ธ๋ ํ ํฌ๊ธฐ ์กฐ์ ์ ์ฐธ์กฐํ์ธ์.
์๊ตฌ ๋ณผ๋ฅจ์ด ์์ฑ๋์ง ์์
์๊ตฌ ๋ณผ๋ฅจ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จ๋๋ฉด PersistentVolumeClaim(PVC)์ ์ค๋ช ํ์ฌ ํด๋น ๋ฌธ์ ๊ฐ ์์ฑ๋์ง ์๋ ์ด์ ๋ฅผ ํ์ธํฉ๋๋ค.
- ํด๋ฌ์คํฐ์ PVC๋ฅผ ๋์ดํฉ๋๋ค.
kubectl -n namespace get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cassandra-data-apigee-cassandra-default-0 Bound pvc-b247faae-0a2b-11ea-867b-42010a80006e 10Gi RWO standard 15m ...
- ์คํจํ ํฌ๋์ PVC๋ฅผ ์ค๋ช
ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋ช
๋ น์ด๋ ํฌ๋
apigee-cassandra-default-0
์ ๋ฐ์ธ๋ฉ๋ PVC๋ฅผ ์ค๋ช ํฉ๋๋ค.kubectl apigee describe pvc cassandra-data-apigee-cassandra-default-0 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning ProvisioningFailed 3m (x143 over 5h) persistentvolume-controller storageclass.storage.k8s.io "apigee-sc" not found
์ด ์์์์๋ ์ด๋ฆ์ด
apigee-sc
์ธ StorageClass๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ธฐ๋ณธ StorageClass ๋ณ๊ฒฝ์ ์ค๋ช ๋ ๋๋ก ํด๋ฌ์คํฐ์ ๋๋ฝ๋ StorageClass๋ฅผ ๋ง๋ญ๋๋ค.
Pod ๋๋ฒ๊น ๋ ์ฐธ์กฐํ์ธ์.
Cassandra Pod๊ฐ CrashLoopBackoff ์ํ๋ก ๋ฉ์ถฐ ์์
์ฆ์
์์ํ๋ฉด Cassandra ํฌ๋๊ฐ CrashLoopBackoff ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
์ค๋ฅ ๋ฉ์์ง
kubectl
๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๋ ์ํ๋ฅผ ๋ณด๋ฉด ํ๋ ์ด์์ Cassandra ํฌ๋๊ฐ CrashLoopBackoff
์ํ๊ฐ ๋ฉ๋๋ค.
์ด ์ํ๋ Kubernetes๊ฐ ํฌ๋๋ฅผ ๋ง๋ค ์ ์์์ ๋ํ๋
๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl get pods -n namespace
NAME READY STATUS RESTARTS AGE
adah-resources-install-4762w 0/4 Completed 0 10m
apigee-cassandra-default-0 0/1 CrashLoopBackoff 0 10m
...
๊ฐ๋ฅํ ์์ธ
ํฌ๋๊ฐ CrashLoopBackoff
์ํ๋ก ๋ฉ์ถฐ ์๋ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ธ | ์ค๋ช |
---|---|
๋ฐ์ดํฐ ์ผํฐ๊ฐ ์ด์ ๋ฐ์ดํฐ ์ผํฐ์ ๋ค๋ฆ | ์ด ์ค๋ฅ๋ ์ด์ ํด๋ฌ์คํฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์๊ตฌ ๋ณผ๋ฅจ์ด Cassandra Pod์ ์์ผ๋ฉฐ ์ Pod๊ฐ ์ด์ ํด๋ฌ์คํฐ์ ์กฐ์ธํ ์ ์์์ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ํ์์ ๋ณดํต ๋นํ์ฑ ์๊ตฌ ๋ณผ๋ฅจ์ด ๋์ผํ Kubernetes ๋ ธ๋์ ์๋ ์ด์ Cassandra ํด๋ฌ์คํฐ์์ ์ง์๋ ๋ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ํด๋ฌ์คํฐ์์ Cassandra๋ฅผ ์ญ์ ํ๊ณ ๋ค์ ๋ง๋๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ ์ ์์ต๋๋ค. |
Truststore ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์ | ์ด ์ค๋ฅ๋ Cassandra Pod๊ฐ TLS ์ฐ๊ฒฐ์ ์์ฑํ ์ ์์์ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ํ์์ ์ ๊ณต๋ ํค์ ์ธ์ฆ์๊ฐ ์ ํจํ์ง ์๊ฑฐ๋ ๋๋ฝ๋๊ฑฐ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ ๋ ๋ฐ์ํฉ๋๋ค. |
์ง๋จ
Cassandra ์ค๋ฅ ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ๋ฌธ์ ์ ์์ธ์ ํ์ ํฉ๋๋ค.
- ํฌ๋๋ฅผ ๋์ดํ์ฌ ์คํจํ Cassandra ํฌ๋์ ID๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
kubectl get pods -n namespace
- ์คํจํ ํฌ๋์ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
kubectl logs pod_id -n namespace
ํด๊ฒฐ ๋ฐฉ๋ฒ
ํฌ๋ ๋ก๊ทธ์์ ๋ค์ ๋จ์๋ฅผ ํ์ธํฉ๋๋ค.
๋ฐ์ดํฐ ์ผํฐ๊ฐ ์ด์ ๋ฐ์ดํฐ ์ผํฐ์ ๋ค๋ฆ
์ด ๋ก๊ทธ ๋ฉ์์ง๊ฐ ํ์๋๋ ๊ฒฝ์ฐ:
Cannot start node if snitch's data center (us-east1) differs from previous data center
- ํด๋ฌ์คํฐ์ ๋นํ์ฑ ๋๋ ์ด์ PVC๊ฐ ์๋์ง ํ์ธํ๊ณ ์ญ์ ํฉ๋๋ค.
- ์๋ก ์ค์นํ ๊ฒฝ์ฐ PVC๋ฅผ ๋ชจ๋ ์ญ์ ํ๊ณ ์ค์ ์ ๋ค์ ์๋ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl -n namespace get pvc
kubectl -n namespace delete pvc cassandra-data-apigee-cassandra-default-0
Truststore ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์์
์ด ๋ก๊ทธ ๋ฉ์์ง๊ฐ ํ์๋๋ ๊ฒฝ์ฐ:
Caused by: java.io.FileNotFoundException: /apigee/cassandra/ssl/truststore.p12 (No such file or directory)
์ฌ์ ์ ํ์ผ์ ์ ๊ณต๋ ํค์ ์ธ์ฆ์๊ฐ ์ฌ๋ฐ๋ฅด๊ณ ์ ํจํ์ง ํ์ธํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cassandra: sslRootCAPath: path_to_root_ca-file sslCertPath: path-to-tls-cert-file sslKeyPath: path-to-tls-key-file
๋ ธ๋ ์ฅ์
์ฆ์
์์ํ๋ฉด Cassandra Pod๊ฐ ๋๊ธฐ์ค ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ ๊ธฐ๋ณธ ๋ ธ๋ ์ค๋ฅ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
์ง๋จ
- ์คํ๋๊ณ ์์ง ์์ Cassandra Pod๋ฅผ ํ์ธํฉ๋๋ค.
$ kubectl get pods -n your_namespace NAME READY STATUS RESTARTS AGE cassandra-default-0 0/1 Pending 0 13s cassandra-default-1 1/1 Running 0 8d cassandra-default-2 1/1 Running 0 8d
- ์์ปค ๋
ธ๋๋ฅผ ํ์ธํฉ๋๋ค. NotReady ์ํ์ธ ์์ปค ๋
ธ๋๋ ์คํจํ ๋
ธ๋์
๋๋ค.
kubectl get nodes -n your_namespace NAME STATUS ROLES AGE VERSION INTERNAL-IP gke-hybrid-cluster-apigee-data-178811f1-lv5j Ready <none> 34d v1.21.5-gke.1302 10.138.15.198 gke-hybrid-cluster-apigee-data-d63b8b8d-n41g NotReady <none> 34d v1.21.5-gke.1302 10.138.15.200 gke-hybrid-cluster-apigee-data-ec752c0b-b1cr Ready <none> 34d v1.21.5-gke.1302 10.138.15.199 gke-hybrid-cluster-apigee-runtime-ba502ff4-57mq Ready <none> 34d v1.21.5-gke.1302 10.138.15.204 gke-hybrid-cluster-apigee-runtime-ba502ff4-hwkb Ready <none> 34d v1.21.5-gke.1302 10.138.15.203 gke-hybrid-cluster-apigee-runtime-bfa558e0-08vw Ready <none> 34d v1.21.5-gke.1302 10.138.15.201 gke-hybrid-cluster-apigee-runtime-bfa558e0-xvsc Ready <none> 34d v1.21.5-gke.1302 10.138.15.202 gke-hybrid-cluster-apigee-runtime-d12de7df-693w Ready <none> 34d v1.21.5-gke.1302 10.138.15.241 gke-hybrid-cluster-apigee-runtime-d12de7df-fn0w Ready <none> 34d v1.21.5-gke.1302 10.138.15.206
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํด๋ฌ์คํฐ์์ ์ฃฝ์ Cassandra Pod๋ฅผ ์ญ์ ํฉ๋๋ค.
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool status
$ kubectl exec -it apigee-cassandra-default-0 -- nodetool removenode deadnode_hostID
- ์ฃฝ์ ๋
ธ๋์์ VolumeClaim์ ์ญ์ ํ์ฌ ์ดํผ๋ํฐ๋ก ์ธํด Cassandra Pod๊ฐ ์ฃฝ์ ๋
ธ๋์์ ๊ฐ๋๋์ง ์๋๋ก ํฉ๋๋ค.
kubectl get pvc -n your_namespace
kubectl delete pvc volumeClaim_name -n your_namespace
- ๋ณผ๋ฅจ ํ
ํ๋ฆฟ์ ์
๋ฐ์ดํธํ๊ณ ์๋ก ์ถ๊ฐ๋ ๋
ธ๋์ PersistentVolume์ ๋ง๋ญ๋๋ค. ๋ค์์ ๋ณผ๋ฅจ ํ
ํ๋ฆฟ ์์์
๋๋ค.
apiVersion: v1 kind: PersistentVolume metadata: name: cassandra-data-3 spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /apigee/data nodeAffinity: "required": "nodeSelectorTerms": - "matchExpressions": - "key": "kubernetes.io/hostname" "operator": "In" "values": ["gke-hybrid-cluster-apigee-data-d63b8b8d-n41g"]
- ๊ฐ์ ์ ํธ์คํธ ์ด๋ฆ/IP๋ก ๋ฐ๊พธ๊ณ ํ
ํ๋ฆฟ์ ์ ์ฉํฉ๋๋ค.
kubectl apply -f volume-template.yaml
๋๋ฒ๊น ์ ์ํ ํด๋ผ์ด์ธํธ ์ปจํ ์ด๋ ๋ง๋ค๊ธฐ
์ด ์น์
์์๋ cqlsh
์ ๊ฐ์ด Cassandra ๋๋ฒ๊น
์ ํธ๋ฆฌํฐ์ ์ก์ธ์คํ ์ ์๋ ํด๋ผ์ด์ธํธ ์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค. ์ด๋ฌํ ์ ํธ๋ฆฌํฐ๋ Cassandra ํ
์ด๋ธ์ ์ฟผ๋ฆฌํ ์ ์๊ณ ๋๋ฒ๊น
๋ชฉ์ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์ปจํ ์ด๋ ๋ง๋ค๊ธฐ
ํด๋ผ์ด์ธํธ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
- ์ปจํ
์ด๋์๋
apigee-cassandra-user-setup
Pod์ TLS ์ธ์ฆ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ด ์ธ์ฆ์ ์ด๋ฆ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'
์ด ๋ช ๋ น์ด๋ ์ธ์ฆ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด
apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls
์ ๋๋ค. - ์ ํ์ผ์ ์ด๊ณ ๋ค์ Pod ์ฌ์์ ์ฌ๊ธฐ์ ๋ถ์ฌ๋ฃ์ต๋๋ค.
apiVersion: v1 kind: Pod metadata: labels: name: cassandra-client-name # For example: my-cassandra-client namespace: apigee spec: containers: - name: cassandra-client-name image: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:1.7.6" imagePullPolicy: Always command: - sleep - "3600" env: - name: CASSANDRA_SEEDS value: apigee-cassandra-default.apigee.svc.cluster.local - name: APIGEE_DML_USER valueFrom: secretKeyRef: key: dml.user name: apigee-datastore-default-creds - name: APIGEE_DML_PASSWORD valueFrom: secretKeyRef: key: dml.password name: apigee-datastore-default-creds volumeMounts: - mountPath: /opt/apigee/ssl name: tls-volume readOnly: true volumes: - name: tls-volume secret: defaultMode: 420 secretName: your-secret-name # For example: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls restartPolicy: Never
.yaml
ํ์ฅ์ผ๋ก ํ์ผ์ ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉดmy-spec.yaml
์ ๋๋ค.- ํด๋ฌ์คํฐ์ ์ฌ์์ ์ ์ฉํฉ๋๋ค.
kubectl apply -f your-spec-file.yaml -n apigee
- ์ปจํ
์ด๋์ ๋ก๊ทธ์ธํฉ๋๋ค.
kubectl exec -n apigee cassandra-client -it -- bash
- ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Cassandra
cqlsh
์ธํฐํ์ด์ค์ ์ฐ๊ฒฐํฉ๋๋ค. ๋ช ๋ น์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ํํ๊ฒ ์ ๋ ฅํฉ๋๋ค.cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl
ํด๋ผ์ด์ธํธ ํฌ๋ ์ญ์
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Cassandra ํด๋ผ์ด์ธํธ Pod๋ฅผ ์ญ์ ํฉ๋๋ค.
kubectl delete pods -n apigee cassandra-client
์ถ๊ฐ ๋ฆฌ์์ค
Apigee ๋ฐ Apigee Hybrid ํ๋ ์ด๋ถ ์๊ฐ๋ฅผ ์ฐธ์กฐํ์ธ์.