Sign inSign up

shinyay/spring-cloud-k8s-gs

By shinyay

•Updated over 6 years ago

Image
0

127

shinyay/spring-cloud-k8s-gs repository overview

⁠Spring Cloud Kubernetes Getting Started

Spring Cloud Kubernetes using Spring Data REST on kind

⁠Description

This project is deployed on kind⁠.

⁠Spring Dependencies

The followings are dependencies for this project.

  • spring-boot-starter-data-rest
  • spring-boot-starter-data-jpa
  • spring-cloud-starter-kubernetes-all
  • postgresql

⁠Demo

⁠1. Create kind cluster for Ingress
$ kind create cluster --config=kubernetes/kind/cluster.yml
⁠cluster.yml
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
⁠1.1. Deploy Ingress NGINX controller
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

Wait until is ready to process requests running:

$ kubectl wait --namespace ingress-nginx \
    --for=condition=ready pod \
    --selector=app.kubernetes.io/component=controller \
    --timeout=90s
⁠2. Deploy PostgreSQL
⁠2.1. ConfigMap for PostgreSQL
$ kubectl create configmap postgres-config \
      --from-literal=postgres.service.name=postgresql \
      --from-literal=postgres.db.name=employee
⁠2.2. Secret for PostgreSQL
$ kubectl create secret generic db-security \
    --from-literal=db.user.name=sample \
    --from-literal=db.user.password=password
⁠2.3. Deployment for PostgreSQL
$ kubectl apply -f kubernetes/postgres-deployment.yml
⁠postgres-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  labels:
    app: postgresql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      volumes:
        - name: data
          emptyDir: {}
      containers:
        - name: postgres
          image: postgres:9.6.5
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: db-security
                  key: db.user.name
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-security
                  key: db.user.password
            - name: POSTGRES_DB
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres.db.name
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: data
              mountPath: /var/lib/postgresql/
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  labels:
    app: postgresql
spec:
  selector:
    app: postgresql
  ports:
    - port: 5432
⁠3. Define Spring Configuration
  • application.yml
    • Load from ConfigMap
  • bootstrap.yml
    • Initial Load
$ kubectl create configmap app-config \
    --from-file=kubernetes/application.yml
⁠application.yml
spring:
  jpa:
    database: postgresql
  datasource:
    platform: postgresql
    driver-class-name: org.postgresql.Driver
⁠bootstrap.yml
spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      config:
        name: [app-config, postgres-config]
        namespace: default
        enable-api: true
      secrets:
        name: db-security
        namespace: default
        enable-api: true
  datasource:
    url: jdbc:postgresql://${${POSTGRES_SERVICE}.service.host}:${${POSTGRES_SERVICE}.service.port}/${POSTGRES_DB_NAME}
    username: ${POSTGRES_DB_USER}
    password: ${POSTGRES_DB_PASSWORD}
ParameterConfigMap/Secret
POSTGRES_SERVICEConfigMap
POSTGRES_DB_NAMEConfigMap
POSTGRES_DB_USERSecret
POSTGRES_DB_PASSWORDSecret
⁠4. Build Spring container image
$ ./gradlew clean jib
⁠5. Deploy Spring Application
$ kubectl apply -f kubernetes/deployment.yml
⁠deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
  labels:
    app: spring-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
        - name: app
          image: shinyay/spring-cloud-k8s-gs:0.0.1-SNAPSHOT
          ports:
            - containerPort: 8080
          env:
            - name: POSTGRES_SERVICE
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres.service.name
            - name: POSTGRES_DB_NAME
              valueFrom:
                configMapKeyRef:
                  name: postgres-config
                  key: postgres.db.name
            - name: POSTGRES_DB_USER
              valueFrom:
                secretKeyRef:
                  name: db-security
                  key: db.user.name
            - name: POSTGRES_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-security
                  key: db.user.password
      serviceAccountName: config-reader
---
apiVersion: v1
kind: Service
metadata:
  name: app
  labels:
    app: spring-app
spec:
  ports:
    - port: 8080
      protocol: TCP
  selector:
    app: spring-app
#  type: NodePort
---
# For KIND
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: app
              servicePort: 8080
⁠6. Confirm Application Deployment
$ curl -X POST http://localhost/employees \
      -H 'Content-Type: application/json' \
      -d '{
          "name": "JohnDoe",
          "email": "[email protected]"
      }'

# curl -X GET http://localhost/employees
$ kubectl exec -it postgresql-1234567890-abcde /bin/bash

root@postgresql-1234567890-abcde:/# psql -U sample employee

psql (9.6.5)
Type "help" for help.

employee=# select * from employee;
 id |      email       |  name
----+------------------+---------
  1 | [email protected] | JohnDoe

employee=# \q
root@postgresql-1234567890-abcde:/# exit

⁠Features

  • feature:1
  • feature:2

⁠Requirement

⁠Usage

⁠Installation

⁠Licence

Released under the MIT license⁠

⁠Author

shinyay⁠

Tag summary

Content type

Image

Digest

Size

271.7 MB

Last updated

over 6 years ago

docker pull shinyay/spring-cloud-k8s-gs:0.0.1-SNAPSHOT