diff --git a/docker/thingsboard-db-schema.env b/docker/thingsboard-db-schema.env index c8d2bd83d8..4b20f39a35 100644 --- a/docker/thingsboard-db-schema.env +++ b/docker/thingsboard-db-schema.env @@ -2,4 +2,5 @@ SKIP_SCHEMA_CREATION=false SKIP_SYSTEM_DATA=false -SKIP_DEMO_DATA=false \ No newline at end of file +SKIP_DEMO_DATA=false +CASSANDRA_URL=db \ No newline at end of file diff --git a/docker/thingsboard-db-schema/build_and_deploy.sh b/docker/thingsboard-db-schema/build_and_deploy.sh index d03413735d..428016c839 100755 --- a/docker/thingsboard-db-schema/build_and_deploy.sh +++ b/docker/thingsboard-db-schema/build_and_deploy.sh @@ -20,9 +20,13 @@ cp ../../dao/src/main/resources/schema.cql schema.cql cp ../../dao/src/main/resources/demo-data.cql demo-data.cql cp ../../dao/src/main/resources/system-data.cql system-data.cql -docker build -t thingsboard/thingsboard-db-schema:1.2.2 -t thingsboard/thingsboard-db-schema:latest . +docker build -t thingsboard/thingsboard-db-schema:k8test . docker login -docker push thingsboard/thingsboard-db-schema:1.2.2 -docker push thingsboard/thingsboard-db-schema:latest \ No newline at end of file +docker push thingsboard/thingsboard-db-schema:k8test + +# cleanup +rm schema.cql +rm demo-data.cql +rm system-data.cql \ No newline at end of file diff --git a/docker/thingsboard-db-schema/install_schema.sh b/docker/thingsboard-db-schema/install_schema.sh index f113b90a69..279711933c 100644 --- a/docker/thingsboard-db-schema/install_schema.sh +++ b/docker/thingsboard-db-schema/install_schema.sh @@ -16,7 +16,7 @@ # -until nmap db -p 9042 | grep "9042/tcp open" +until nmap $CASSANDRA_URL -p 9042 | grep "9042/tcp open" do echo "Wait for Cassandra..." sleep 10 @@ -24,7 +24,7 @@ done if [ "$SKIP_SCHEMA_CREATION" == "false" ]; then echo "Creating 'Thingsboard' keyspace..." - cqlsh db -f /root/schema.cql + cqlsh $CASSANDRA_URL -f /root/schema.cql if [ "$?" -eq 0 ]; then echo "'Thingsboard' keyspace was successfully created!" else @@ -34,7 +34,7 @@ fi if [ "$SKIP_SYSTEM_DATA" == "false" ]; then echo "Adding system data..." - cqlsh db -f /root/system-data.cql + cqlsh $CASSANDRA_URL -f /root/system-data.cql if [ "$?" -eq 0 ]; then echo "System data was successfully added!" else @@ -44,7 +44,7 @@ fi if [ "$SKIP_DEMO_DATA" == "false" ]; then echo "Adding demo data..." - cqlsh db -f /root/demo-data.cql + cqlsh $CASSANDRA_URL -f /root/demo-data.cql if [ "$?" -eq 0 ]; then echo "Demo data was successfully added!" else diff --git a/docker/thingsboard/build_and_deploy.sh b/docker/thingsboard/build_and_deploy.sh index 7c02de571c..d2d1e2cb76 100755 --- a/docker/thingsboard/build_and_deploy.sh +++ b/docker/thingsboard/build_and_deploy.sh @@ -18,9 +18,11 @@ cp ../../application/target/thingsboard.deb thingsboard.deb -docker build -t thingsboard/application:1.2.2 -t thingsboard/application:latest . +docker build -t thingsboard/application:k8test . docker login -docker push thingsboard/application:1.2.2 -docker push thingsboard/application:latest \ No newline at end of file +docker push thingsboard/application:k8test + +# cleanup +rm thingsboard.deb \ No newline at end of file diff --git a/docker/thingsboard/run_thingsboard.sh b/docker/thingsboard/run_thingsboard.sh index 877fed7fec..404cc8df9d 100755 --- a/docker/thingsboard/run_thingsboard.sh +++ b/docker/thingsboard/run_thingsboard.sh @@ -34,6 +34,9 @@ done # Copying env variables into conf files printenv | awk -F "=" '{print "export " $1 "='\''" $2 "'\''"}' >> /usr/share/thingsboard/conf/thingsboard.conf +# Set env variable for RPC address +echo "export RPC_HOST='"$(hostname -f)"'" | tee -a /usr/share/thingsboard/conf/thingsboard.conf + cat /usr/share/thingsboard/conf/thingsboard.conf echo "Starting 'Thingsboard' service..." diff --git a/kubernetes/cassandra.yaml b/kubernetes/cassandra.yaml new file mode 100644 index 0000000000..9333f4d939 --- /dev/null +++ b/kubernetes/cassandra.yaml @@ -0,0 +1,134 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: cassandra + name: cassandra +spec: + clusterIP: None + ports: + - port: 9042 + selector: + app: cassandra +--- +apiVersion: storage.k8s.io/v1beta1 +kind: StorageClass +metadata: + name: regular +provisioner: kubernetes.io/gce-pd +parameters: + type: pd-standard +--- +apiVersion: "apps/v1beta1" +kind: StatefulSet +metadata: + name: cassandra +spec: + serviceName: cassandra + replicas: 3 + template: + metadata: + labels: + app: cassandra + spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - cassandra + topologyKey: "kubernetes.io/hostname" + containers: + - name: cassandra + image: gcr.io/google-samples/cassandra:v12 + imagePullPolicy: Always + ports: + - containerPort: 7000 + name: intra-node + - containerPort: 7001 + name: tls-intra-node + - containerPort: 7199 + name: jmx + - containerPort: 9042 + name: cql + - containerPort: 9160 + name: thrift + resources: + limits: + cpu: "500m" + memory: 1Gi + requests: + cpu: "500m" + memory: 1Gi + securityContext: + capabilities: + add: + - IPC_LOCK + lifecycle: + preStop: + exec: + command: ["/bin/sh", "-c", "PID=$(pidof java) && kill $PID && while ps -p $PID > /dev/null; do sleep 1; done"] + env: + - name: MAX_HEAP_SIZE + value: 512M + - name: HEAP_NEWSIZE + value: 100M + - name: CASSANDRA_SEEDS + value: "cassandra-0.cassandra.default.svc.cluster.local" + - name: CASSANDRA_CLUSTER_NAME + value: "K8Demo" + - name: CASSANDRA_DC + value: "DC1-K8Demo" + - name: CASSANDRA_RACK + value: "Rack1-K8Demo" + - name: CASSANDRA_AUTO_BOOTSTRAP + value: "false" + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + readinessProbe: + exec: + command: + - /bin/bash + - -c + - /ready-probe.sh + initialDelaySeconds: 15 + timeoutSeconds: 5 + # These volume mounts are persistent. They are like inline claims, + # but not exactly because the names need to match exactly one of + # the stateful pod volumes. + volumeMounts: + - name: cassandra-data + mountPath: /cassandra_data + - name: cassandra-commitlog + mountPath: /cassandra_commitlog + # These are converted to volume claims by the controller + # and mounted at the paths mentioned above. + # do not use these in production until ssd GCEPersistentDisk or other ssd pd + volumeClaimTemplates: + - metadata: + name: cassandra-data + annotations: + volume.beta.kubernetes.io/storage-class: regular + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 2Gi + - metadata: + name: cassandra-commitlog + annotations: + volume.beta.kubernetes.io/storage-class: regular + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi \ No newline at end of file diff --git a/kubernetes/thingsboard-schema.yaml b/kubernetes/thingsboard-schema.yaml new file mode 100644 index 0000000000..ca0f8b1759 --- /dev/null +++ b/kubernetes/thingsboard-schema.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Pod +metadata: + name: tb-db-schema-deployment +spec: + containers: + - name: tb-db-schema-k8 + image: thingsboard/thingsboard-db-schema:k8test + env: + - name: SKIP_SCHEMA_CREATION + value: "false" + - name: SKIP_SYSTEM_DATA + value: "false" + - name : SKIP_DEMO_DATA + value: "false" + - name : CASSANDRA_URL + value: "cassandra" + command: + - sh + - -c + - ./install_schema.sh + restartPolicy: Never \ No newline at end of file diff --git a/kubernetes/thingsboard.yaml b/kubernetes/thingsboard.yaml new file mode 100644 index 0000000000..dfe84b25fc --- /dev/null +++ b/kubernetes/thingsboard.yaml @@ -0,0 +1,105 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: thingsboard-external + labels: + app: thingsboard-external +spec: + ports: + - port: 8080 + name: ui + - port: 1883 + name: mqtt + - port: 5683 + name: coap + - port: 9001 + name: rpc + selector: + app: thingsboard + type: LoadBalancer +--- +apiVersion: v1 +kind: Service +metadata: + name: thingsboard-headless + labels: + app: thingsboard-headless +spec: + ports: + - port: 8080 + name: ui + - port: 1883 + name: mqtt + - port: 5683 + name: coap + - port: 9001 + name: rpc + selector: + app: thingsboard + clusterIP: None +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: tb-config +data: + zookeeper.enabled: "true" + zookeeper.url: "zk-headless" + cassandra.url: "cassandra:9042" +--- +apiVersion: apps/v1beta1 +kind: StatefulSet +metadata: + name: tb +spec: + serviceName: "thingsboard-headless" + replicas: 2 + template: + metadata: + labels: + app: thingsboard + spec: + terminationGracePeriodSeconds: 10 + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - thingsboard-headless + topologyKey: "kubernetes.io/hostname" + containers: + - name: thingsboard + image: thingsboard/application:k8test + ports: + - containerPort: 8080 + name: ui + - containerPort: 1883 + name: mqtt + - containerPort: 5683 + name: coap + - containerPort: 9001 + name: rpc + env: + - name: ZOOKEEPER_ENABLED + valueFrom: + configMapKeyRef: + name: tb-config + key: zookeeper.enabled + - name: ZOOKEEPER_URL + valueFrom: + configMapKeyRef: + name: tb-config + key: zookeeper.url + - name : CASSANDRA_URL + valueFrom: + configMapKeyRef: + name: tb-config + key: cassandra.url + command: + - sh + - -c + - ./run_thingsboard.sh \ No newline at end of file diff --git a/kubernetes/zookeeper.yaml b/kubernetes/zookeeper.yaml index efe8d99c27..7107e07ece 100644 --- a/kubernetes/zookeeper.yaml +++ b/kubernetes/zookeeper.yaml @@ -20,7 +20,7 @@ metadata: name: zk-config data: ensemble: "zk-0;zk-1;zk-2" - jvm.heap: "2G" + jvm.heap: "1G" tick: "2000" init: "10" sync: "5" @@ -51,34 +51,25 @@ spec: app: zk annotations: pod.alpha.kubernetes.io/initialized: "true" - scheduler.alpha.kubernetes.io/affinity: > - { - "podAntiAffinity": { - "requiredDuringSchedulingIgnoredDuringExecution": [ - { - "labelSelector": { - "matchExpressions": [ - { - "key": "app", - "operator": "In", - "values": [ "zk-headless" ] - } - ] - }, - "topologyKey": "kubernetes.io/hostname" - } - ] - } - } spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "app" + operator: In + values: + - zk-headless + topologyKey: "kubernetes.io/hostname" containers: - name: k8szk imagePullPolicy: Always image: gcr.io/google_samples/k8szk:v1 resources: requests: - memory: "1Gi" - cpu: "0.5" + memory: "0.5Gi" + cpu: "0.2" ports: - containerPort: 2181 name: client @@ -164,4 +155,4 @@ spec: accessModes: [ "ReadWriteOnce" ] resources: requests: - storage: 20Gi \ No newline at end of file + storage: 1Gi \ No newline at end of file