README formatting (#158)
Signed-off-by: Ahmet Alp Balkan <ahmetb@google.com>
This commit is contained in:
parent
bae651f7ea
commit
5f41e12b2f
1 changed files with 88 additions and 69 deletions
157
README.md
157
README.md
|
@ -12,13 +12,13 @@ Kubernetes Engine. It’s **easy to deploy with little to no configuration**.
|
||||||
If you’re using this demo, please **★Star** this repository to show your interest!
|
If you’re using this demo, please **★Star** this repository to show your interest!
|
||||||
|
|
||||||
> 👓**Note to Googlers:** Please fill out the form at
|
> 👓**Note to Googlers:** Please fill out the form at
|
||||||
[go/microservices-demo](http://go/microservices-demo) if you are using this
|
> [go/microservices-demo](http://go/microservices-demo) if you are using this
|
||||||
application.
|
> application.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
| Home Page | Checkout Screen |
|
| Home Page | Checkout Screen |
|
||||||
|-----------|-----------------|
|
| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
||||||
| [![Screenshot of store homepage](./docs/img/hipster-shop-frontend-1.png)](./docs/img/hipster-shop-frontend-1.png) | [![Screenshot of checkout screen](./docs/img/hipster-shop-frontend-2.png)](./docs/img/hipster-shop-frontend-2.png) |
|
| [![Screenshot of store homepage](./docs/img/hipster-shop-frontend-1.png)](./docs/img/hipster-shop-frontend-1.png) | [![Screenshot of checkout screen](./docs/img/hipster-shop-frontend-2.png)](./docs/img/hipster-shop-frontend-2.png) |
|
||||||
|
|
||||||
## Service Architecture
|
## Service Architecture
|
||||||
|
@ -31,20 +31,19 @@ microservices](./docs/img/architecture-diagram.png)](./docs/img/architecture-dia
|
||||||
|
|
||||||
Find **Protocol Buffers Descriptions** at the [`./pb` directory](./pb).
|
Find **Protocol Buffers Descriptions** at the [`./pb` directory](./pb).
|
||||||
|
|
||||||
| Service | Language | Description |
|
| Service | Language | Description |
|
||||||
|---------|----------|-------------|
|
| ---------------------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| [frontend](./src/frontend) | Go | Exposes an HTTP server to serve the website. Does not require signup/login and generates session IDs for all users automatically. |
|
| [frontend](./src/frontend) | Go | Exposes an HTTP server to serve the website. Does not require signup/login and generates session IDs for all users automatically. |
|
||||||
| [cartservice](./src/cartservice) | C# | Stores the items in the user's shipping cart in Redis and retrieves it. |
|
| [cartservice](./src/cartservice) | C# | Stores the items in the user's shipping cart in Redis and retrieves it. |
|
||||||
| [productcatalogservice](./src/productcatalogservice) | Go | Provides the list of products from a JSON file and ability to search products and get individual products. |
|
| [productcatalogservice](./src/productcatalogservice) | Go | Provides the list of products from a JSON file and ability to search products and get individual products. |
|
||||||
| [currencyservice](./src/currencyservice) | Node.js | Converts one money amount to another currency. Uses real values fetched from European Central Bank. It's the highest QPS service. |
|
| [currencyservice](./src/currencyservice) | Node.js | Converts one money amount to another currency. Uses real values fetched from European Central Bank. It's the highest QPS service. |
|
||||||
| [paymentservice](./src/paymentservice) | Node.js | Charges the given credit card info (mock) with the given amount and returns a transaction ID. |
|
| [paymentservice](./src/paymentservice) | Node.js | Charges the given credit card info (mock) with the given amount and returns a transaction ID. |
|
||||||
| [shippingservice](./src/shippingservice) | Go | Gives shipping cost estimates based on the shopping cart. Ships items to the given address (mock) |
|
| [shippingservice](./src/shippingservice) | Go | Gives shipping cost estimates based on the shopping cart. Ships items to the given address (mock) |
|
||||||
| [emailservice](./src/emailservice) | Python | Sends users an order confirmation email (mock). |
|
| [emailservice](./src/emailservice) | Python | Sends users an order confirmation email (mock). |
|
||||||
| [checkoutservice](./src/checkoutservice) | Go | Retrieves user cart, prepares order and orchestrates the payment, shipping and the email notification. |
|
| [checkoutservice](./src/checkoutservice) | Go | Retrieves user cart, prepares order and orchestrates the payment, shipping and the email notification. |
|
||||||
| [recommendationservice](./src/recommendationservice) | Python | Recommends other products based on what's given in the cart. |
|
| [recommendationservice](./src/recommendationservice) | Python | Recommends other products based on what's given in the cart. |
|
||||||
| [adservice](./src/adservice) | Java | Provides text ads based on given context words. |
|
| [adservice](./src/adservice) | Java | Provides text ads based on given context words. |
|
||||||
| [loadgenerator](./src/loadgenerator) | Python/Locust | Continuously sends requests imitating realistic user shopping flows to the frontend. |
|
| [loadgenerator](./src/loadgenerator) | Python/Locust | Continuously sends requests imitating realistic user shopping flows to the frontend. |
|
||||||
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
|
@ -84,7 +83,6 @@ We offer three installation methods:
|
||||||
option, you will use pre-built container images that are available publicly,
|
option, you will use pre-built container images that are available publicly,
|
||||||
instead of building them yourself, which takes a long time).
|
instead of building them yourself, which takes a long time).
|
||||||
|
|
||||||
|
|
||||||
### Option 1: Running locally with “Docker for Desktop”
|
### Option 1: Running locally with “Docker for Desktop”
|
||||||
|
|
||||||
> 💡 Recommended if you're planning to develop the application or giving it a
|
> 💡 Recommended if you're planning to develop the application or giving it a
|
||||||
|
@ -99,16 +97,17 @@ We offer three installation methods:
|
||||||
(ensure version ≥v0.20)
|
(ensure version ≥v0.20)
|
||||||
|
|
||||||
1. Launch “Docker for Desktop”. Go to Preferences:
|
1. Launch “Docker for Desktop”. Go to Preferences:
|
||||||
|
|
||||||
- choose “Enable Kubernetes”,
|
- choose “Enable Kubernetes”,
|
||||||
- set CPUs to at least 3, and Memory to at least 6.0 GiB
|
- set CPUs to at least 3, and Memory to at least 6.0 GiB
|
||||||
|
|
||||||
3. Run `kubectl get nodes` to verify you're connected to “Kubernetes on Docker”.
|
1. Run `kubectl get nodes` to verify you're connected to “Kubernetes on Docker”.
|
||||||
|
|
||||||
4. Run `skaffold run` (first time will be slow, it can take ~20 minutes).
|
1. Run `skaffold run` (first time will be slow, it can take ~20 minutes).
|
||||||
This will build and deploy the application. If you need to rebuild the images
|
This will build and deploy the application. If you need to rebuild the images
|
||||||
automatically as you refactor the code, run `skaffold dev` command.
|
automatically as you refactor the code, run `skaffold dev` command.
|
||||||
|
|
||||||
5. Run `kubectl get pods` to verify the Pods are ready and running. The
|
1. Run `kubectl get pods` to verify the Pods are ready and running. The
|
||||||
application frontend should be available at http://localhost:80 on your
|
application frontend should be available at http://localhost:80 on your
|
||||||
machine.
|
machine.
|
||||||
|
|
||||||
|
@ -117,40 +116,50 @@ We offer three installation methods:
|
||||||
> 💡 Recommended if you're using Google Cloud Platform and want to try it on
|
> 💡 Recommended if you're using Google Cloud Platform and want to try it on
|
||||||
> a realistic cluster.
|
> a realistic cluster.
|
||||||
|
|
||||||
1. Install tools specified in the previous section (Docker, kubectl, skaffold)
|
1. Install tools specified in the previous section (Docker, kubectl, skaffold)
|
||||||
|
|
||||||
1. Create a Google Kubernetes Engine cluster and make sure `kubectl` is pointing
|
1. Create a Google Kubernetes Engine cluster and make sure `kubectl` is pointing
|
||||||
to the cluster.
|
to the cluster.
|
||||||
|
|
||||||
gcloud services enable container.googleapis.com
|
```sh
|
||||||
|
gcloud services enable container.googleapis.com
|
||||||
|
```
|
||||||
|
|
||||||
gcloud container clusters create demo --enable-autoupgrade \
|
```sh
|
||||||
--enable-autoscaling --min-nodes=3 --max-nodes=10 --num-nodes=5 --zone=us-central1-a
|
gcloud container clusters create demo --enable-autoupgrade \
|
||||||
|
--enable-autoscaling --min-nodes=3 --max-nodes=10 --num-nodes=5 --zone=us-central1-a
|
||||||
|
```
|
||||||
|
|
||||||
kubectl get nodes
|
```
|
||||||
|
kubectl get nodes
|
||||||
|
```
|
||||||
|
|
||||||
1. Enable Google Container Registry (GCR) on your GCP project and configure the
|
1. Enable Google Container Registry (GCR) on your GCP project and configure the
|
||||||
`docker` CLI to authenticate to GCR:
|
`docker` CLI to authenticate to GCR:
|
||||||
|
|
||||||
gcloud services enable containerregistry.googleapis.com
|
```sh
|
||||||
|
gcloud services enable containerregistry.googleapis.com
|
||||||
|
```
|
||||||
|
|
||||||
gcloud auth configure-docker -q
|
```sh
|
||||||
|
gcloud auth configure-docker -q
|
||||||
|
```
|
||||||
|
|
||||||
1. In the root of this repository, run `skaffold run --default-repo=gcr.io/[PROJECT_ID]`,
|
1. In the root of this repository, run `skaffold run --default-repo=gcr.io/[PROJECT_ID]`,
|
||||||
where [PROJECT_ID] is your GCP project ID.
|
where [PROJECT_ID] is your GCP project ID.
|
||||||
|
|
||||||
This command:
|
This command:
|
||||||
|
|
||||||
- builds the container images
|
- builds the container images
|
||||||
- pushes them to GCR
|
- pushes them to GCR
|
||||||
- applies the `./kubernetes-manifests` deploying the application to
|
- applies the `./kubernetes-manifests` deploying the application to
|
||||||
Kubernetes.
|
Kubernetes.
|
||||||
|
|
||||||
**Troubleshooting:** If you get "No space left on device" error on Google
|
**Troubleshooting:** If you get "No space left on device" error on Google
|
||||||
Cloud Shell, you can build the images on Google Cloud Build: [Enable the
|
Cloud Shell, you can build the images on Google Cloud Build: [Enable the
|
||||||
Cloud Build
|
Cloud Build
|
||||||
API](https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com),
|
API](https://console.cloud.google.com/flows/enableapi?apiid=cloudbuild.googleapis.com),
|
||||||
then run `skaffold run -p gcb --default-repo=gcr.io/[PROJECT_ID]` instead.
|
then run `skaffold run -p gcb --default-repo=gcr.io/[PROJECT_ID]` instead.
|
||||||
|
|
||||||
1. Find the IP address of your application, then visit the application on your
|
1. Find the IP address of your application, then visit the application on your
|
||||||
browser to confirm installation.
|
browser to confirm installation.
|
||||||
|
@ -180,10 +189,11 @@ by deploying the [release manifest](./release) directly to an existing cluster.
|
||||||
1. Run `kubectl apply -f ./release/kubernetes-manifests` to deploy the app.
|
1. Run `kubectl apply -f ./release/kubernetes-manifests` to deploy the app.
|
||||||
1. Run `kubectl get pods` to see pods are in a Ready state.
|
1. Run `kubectl get pods` to see pods are in a Ready state.
|
||||||
1. Find the IP address of your application, then visit the application on your
|
1. Find the IP address of your application, then visit the application on your
|
||||||
browser to confirm installation.
|
browser to confirm installation.
|
||||||
|
|
||||||
kubectl get service/frontend-external
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get service/frontend-external
|
||||||
|
```
|
||||||
|
|
||||||
### (Optional) Deploying on a Istio-installed GKE cluster
|
### (Optional) Deploying on a Istio-installed GKE cluster
|
||||||
|
|
||||||
|
@ -192,13 +202,15 @@ by deploying the [release manifest](./release) directly to an existing cluster.
|
||||||
|
|
||||||
1. Create a GKE cluster (described in "Option 2").
|
1. Create a GKE cluster (described in "Option 2").
|
||||||
|
|
||||||
2. Use [Istio on GKE add-on](https://cloud.google.com/istio/docs/istio-on-gke/installing)
|
1. Use [Istio on GKE add-on](https://cloud.google.com/istio/docs/istio-on-gke/installing)
|
||||||
to install Istio to your existing GKE cluster.
|
to install Istio to your existing GKE cluster.
|
||||||
|
|
||||||
gcloud beta container clusters update demo \
|
```sh
|
||||||
--zone=us-central1-a \
|
gcloud beta container clusters update demo \
|
||||||
--update-addons=Istio=ENABLED \
|
--zone=us-central1-a \
|
||||||
--istio-config=auth=MTLS_PERMISSIVE
|
--update-addons=Istio=ENABLED \
|
||||||
|
--istio-config=auth=MTLS_PERMISSIVE
|
||||||
|
```
|
||||||
|
|
||||||
> NOTE: If you need to enable `MTLS_STRICT` mode, you will need to update
|
> NOTE: If you need to enable `MTLS_STRICT` mode, you will need to update
|
||||||
> several manifest files:
|
> several manifest files:
|
||||||
|
@ -207,43 +219,50 @@ by deploying the [release manifest](./release) directly to an existing cluster.
|
||||||
> "readinessProbe" fields.
|
> "readinessProbe" fields.
|
||||||
> - `kubernetes-manifests/loadgenerator.yaml`: delete "initContainers" field.
|
> - `kubernetes-manifests/loadgenerator.yaml`: delete "initContainers" field.
|
||||||
|
|
||||||
3. (Optional) Enable Stackdriver Tracing/Logging with Istio Stackdriver Adapter
|
1. (Optional) Enable Stackdriver Tracing/Logging with Istio Stackdriver Adapter
|
||||||
by [following this guide](https://cloud.google.com/istio/docs/istio-on-gke/installing#enabling_tracing_and_logging).
|
by [following this guide](https://cloud.google.com/istio/docs/istio-on-gke/installing#enabling_tracing_and_logging).
|
||||||
|
|
||||||
4. Install the automatic sidecar injection (annotate the `default` namespace
|
1. Install the automatic sidecar injection (annotate the `default` namespace
|
||||||
with the label):
|
with the label):
|
||||||
|
|
||||||
kubectl label namespace default istio-injection=enabled
|
```sh
|
||||||
|
kubectl label namespace default istio-injection=enabled
|
||||||
|
```
|
||||||
|
|
||||||
5. Apply the manifests in [`./istio-manifests`](./istio-manifests) directory.
|
1. Apply the manifests in [`./istio-manifests`](./istio-manifests) directory.
|
||||||
|
(This is required only once.)
|
||||||
|
|
||||||
kubectl apply -f ./istio-manifests
|
```sh
|
||||||
|
kubectl apply -f ./istio-manifests
|
||||||
|
```
|
||||||
|
|
||||||
This is required only once.
|
1. Deploy the application with `skaffold run --default-repo=gcr.io/[PROJECT_ID]`.
|
||||||
|
|
||||||
6. Deploy the application with `skaffold run --default-repo=gcr.io/[PROJECT_ID]`.
|
1. Run `kubectl get pods` to see pods are in a healthy and ready state.
|
||||||
|
|
||||||
7. Run `kubectl get pods` to see pods are in a healthy and ready state.
|
1. Find the IP address of your Istio gateway Ingress or Service, and visit the
|
||||||
|
|
||||||
8. Find the IP address of your istio gateway Ingress or Service, and visit the
|
|
||||||
application.
|
application.
|
||||||
|
|
||||||
INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
|
```sh
|
||||||
|
INGRESS_HOST="$(kubectl -n istio-system get service istio-ingressgateway \
|
||||||
|
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')"
|
||||||
|
echo "$INGRESS_HOST"
|
||||||
|
```
|
||||||
|
|
||||||
echo "$INGRESS_HOST"
|
```sh
|
||||||
|
curl -v "http://$INGRESS_HOST"
|
||||||
curl -v "http://$INGRESS_HOST"
|
```
|
||||||
|
|
||||||
## Conferences featuring Hipster Shop
|
## Conferences featuring Hipster Shop
|
||||||
|
|
||||||
- [Google Cloud Next'18 London – Keynote](https://youtu.be/nIq2pkNcfEI?t=3071)
|
- [Google Cloud Next'18 London – Keynote](https://youtu.be/nIq2pkNcfEI?t=3071)
|
||||||
showing Stackdriver Incident Response Management
|
showing Stackdriver Incident Response Management
|
||||||
- Google Cloud Next'18 SF
|
- Google Cloud Next'18 SF
|
||||||
- [Day 1 Keynote](https://youtu.be/vJ9OaAqfxo4?t=2416) showing GKE On-Prem
|
- [Day 1 Keynote](https://youtu.be/vJ9OaAqfxo4?t=2416) showing GKE On-Prem
|
||||||
- [Day 3 – Keynote](https://youtu.be/JQPOPV_VH5w?t=815) showing Stackdriver
|
- [Day 3 – Keynote](https://youtu.be/JQPOPV_VH5w?t=815) showing Stackdriver
|
||||||
APM (Tracing, Code Search, Profiler, Google Cloud Build)
|
APM (Tracing, Code Search, Profiler, Google Cloud Build)
|
||||||
- [Introduction to Service Management with Istio](https://www.youtube.com/watch?v=wCJrdKdD6UM&feature=youtu.be&t=586)
|
- [Introduction to Service Management with Istio](https://www.youtube.com/watch?v=wCJrdKdD6UM&feature=youtu.be&t=586)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
This is not an official Google project.
|
This is not an official Google project.
|
||||||
|
|
Loading…
Reference in a new issue