Multicluster Helidon Sock Shop
This example application provides a Helidon implementation of the Sock Shop Microservices Demo Application. It uses OAM resources to define the application deployment in a multicluster environment.
Before you begin
- Set up a multicluster Verrazzano environment following the installation instructions.
- The example assumes that there is a managed cluster named
managed1
associated with the multicluster environment. If your environment does not have a cluster of that name, then you should edit the deployment files and change the cluster name listed in theplacement
section.
NOTE: The Sock Shop application deployment files are contained in the Verrazzano project located at
<VERRAZZANO_HOME>/examples/multicluster/sockshop
, where <VERRAZZANO_HOME>
is the root of the Verrazzano project.
Deploy the Sock Shop application
-
Create a namespace for the Sock Shop application by deploying the Verrazzano project.
$ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \ -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.4/examples/multicluster/sock-shop/verrazzano-project.yaml
-
Apply the Sock Shop OAM resources to deploy the application.
$ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \ -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.4/examples/multicluster/sock-shop/sock-shop-comp.yaml $ kubectl --kubeconfig $KUBECONFIG_ADMIN apply \ -f https://raw.githubusercontent.com/verrazzano/verrazzano/v1.0.4/examples/multicluster/sock-shop/sock-shop-app.yaml
-
Wait for the Sock Shop application to be ready.
$ kubectl --kubeconfig $KUBECONFIG_MANAGED1 wait \ --for=condition=Ready pods \ --all -n mc-sockshop \ --timeout=300s
Explore the Sock Shop application
The Sock Shop microservices application implements REST API endpoints including:
/catalogue
- Returns the Sock Shop catalog. This endpoint accepts theGET
HTTP request method./register
- POST{ "username":"xxx", "password":"***", "email":"foo@example.com", "firstName":"foo", "lastName":"coo" }
to create a user. This endpoint accepts thePOST
HTTP request method.
NOTE: The following instructions assume that you are using a Kubernetes environment, such as OKE. Other environments or deployments may require alternative mechanisms for retrieving addresses, ports, and such.
Follow these steps to test the endpoints:
-
Get the generated host name for the application.
$ HOST=$(kubectl --kubeconfig $KUBECONFIG_MANAGED1 get gateway \ -n mc-sockshop \ -o jsonpath={.items[0].spec.servers[0].hosts[0]}) $ echo $HOST sockshop-appconf.mc-sockshop.11.22.33.44.nip.io
-
Get the
EXTERNAL_IP
address of theistio-ingressgateway
service.$ ADDRESS=$(kubectl --kubeconfig $KUBECONFIG_MANAGED1 get service \ -n istio-system istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ echo $ADDRESS 11.22.33.44
-
Access the Sock Shop example application:
-
Using the command line
# Get catalogue $ curl -sk \ -X GET \ https://${HOST}/catalogue \ --resolve ${HOST}:443:${ADDRESS} [{"count":115,"description":"For all those leg lovers out there....", ...}] # Add a new user (replace values of username and password) $ curl -i \ --header "Content-Type: application/json" --request POST \ --data '{"username":"foo","password":"****","email":"foo@example.com","firstName":"foo","lastName":"foo"}' \ -k https://${HOST}/register \ --resolve ${HOST}:443:${ADDRESS} # Add an item to the user's cart $ curl -i \ --header "Content-Type: application/json" --request POST \ --data '{"itemId": "a0a4f044-b040-410d-8ead-4de0446aec7e","unitPrice": "7.99"}' \ -k https://${HOST}/carts/{username}/items \ --resolve ${HOST}:443:${ADDRESS} # Get cart items $ curl -i \ -k https://${HOST}/carts/{username}/items \ --resolve ${HOST}:443:${ADDRESS}
If you are using
nip.io
, then you do not need to include--resolve
. -
Local testing with a browser
Temporarily, modify the
/etc/hosts
file (on Mac or Linux) orc:\Windows\System32\Drivers\etc\hosts
file (on Windows 10), to add an entry mapping the host name to the ingress gateway’sEXTERNAL-IP
address. For example:11.22.33.44 sockshop.example.com
Then, you can access the application in a browser at
https://sockshop.example.com/catalogue
.If you are using
nip.io
, then you can access the application in a browser using theHOST
variable (for example,https://${HOST}/catalogue
). If you are going through a proxy, you may need to add*.nip.io
to theNO_PROXY
list. -
Using your own DNS name
- Point your own DNS name to the ingress gateway’s
EXTERNAL-IP
address. - In this case, you would need to edit the
sock-shop-app.yaml
file to use the appropriate value under thehosts
section (such asyourhost.your.domain
), before deploying the Sock Shop application. - Then, you can use a browser to access the application at
https://<yourhost.your.domain>/catalogue
.
- Point your own DNS name to the ingress gateway’s
-
Troubleshooting
-
Verify that the application configuration, components, workloads, and ingress trait all exist.
$ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get ApplicationConfiguration -n mc-sockshop $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get Component -n mc-sockshop $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get VerrazzanoCoherenceWorkload -n mc-sockshop $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get Coherence -n mc-sockshop $ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get IngressTrait -n mc-sockshop
-
Verify that the Sock Shop service pods are successfully created and transition to the
READY
state. Note that this may take a few minutes and that you may see some of the services terminate and restart.$ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get pods -n mc-sockshop NAME READY STATUS RESTARTS AGE carts-coh-0 2/2 Running 0 38m catalog-coh-0 2/2 Running 0 38m orders-coh-0 2/2 Running 0 38m payment-coh-0 2/2 Running 0 38m shipping-coh-0 2/2 Running 0 38m users-coh-0 2/2 Running 0 38m
-
A variety of endpoints are available to further explore the logs, metrics, and such, associated with the deployed Sock Shop application. Accessing them may require the following:
-
Run this command to get the password that was generated for the telemetry components:
$ kubectl --kubeconfig $KUBECONFIG_ADMIN get secret \ --namespace verrazzano-system verrazzano \ -o jsonpath={.data.password} | base64 \ --decode; echo
The associated user name is
verrazzano
. -
You will have to accept the certificates associated with the endpoints.
You can retrieve the list of available ingresses with following command:
$ kubectl --kubeconfig $KUBECONFIG_MANAGED1 get ing -n verrazzano-system NAME CLASS HOSTS ADDRESS PORTS AGE verrazzano-ingress <none> verrazzano.default.10.11.12.13.nip.io 10.11.12.13 80, 443 32m vmi-system-prometheus <none> prometheus.vmi.system.default.10.11.12.13.nip.io 10.11.12.13 80, 443 32m
Using the ingress host information, some of the endpoints available are:
Description Address Credentials Prometheus https://[vmi-system-prometheus ingress host]
verrazzano
/telemetry-password
-
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.