Browse Source

Tested on AKS

features/addIntegrationIstio
jmanuelcorral 5 years ago
parent
commit
d70ea89743
21 changed files with 520 additions and 502 deletions
  1. +115
    -0
      k8s/helm/deploy-all-istio.ps1
  2. +5
    -3
      k8s/helm/deploy-all.ps1
  3. +325
    -0
      k8s/helm/istio/doc.md
  4. +15
    -0
      k8s/helm/istio/gateway.yml
  5. +59
    -0
      k8s/helm/istio/virtualservices.yml
  6. +0
    -85
      k8s/istio/JourneyToIstio.md
  7. +0
    -2
      k8s/istio/apply-injection.ps1
  8. +0
    -2
      k8s/istio/delete-istio.ps1
  9. +0
    -8
      k8s/istio/deploy-istio-helm.ps1
  10. +0
    -16
      k8s/istio/install-istio-local.ps1
  11. +0
    -16
      k8s/istio/kiali/secrets.yml
  12. +0
    -41
      k8s/istio/kiali/set-kiali-credentials.ps1
  13. +0
    -21
      k8s/istio/nginx-ingress/cloud-generic.yaml
  14. BIN
      k8s/istio/nginx-ingress/cm.yaml
  15. +0
    -3
      k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml
  16. +0
    -3
      k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml
  17. +0
    -39
      k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml
  18. +0
    -239
      k8s/istio/nginx-ingress/mandatory.yaml
  19. +0
    -22
      k8s/istio/nginx-ingress/service-nodeport.yaml
  20. +0
    -1
      k8s/istio/nginx-ingress/update-nginx-ingress.ps1
  21. +1
    -1
      src/Web/WebMVC/package-lock.json

+ 115
- 0
k8s/helm/deploy-all-istio.ps1 View File

@ -0,0 +1,115 @@
Param(
[parameter(Mandatory=$false)][string]$registry,
[parameter(Mandatory=$false)][bool]$installIstioOnSystem=$false,
[parameter(Mandatory=$false)][string]$dockerUser,
[parameter(Mandatory=$false)][string]$dockerPassword,
[parameter(Mandatory=$false)][string]$externalDns="aks",
[parameter(Mandatory=$false)][string]$dnsname="eshoptestistio",
[parameter(Mandatory=$false)][string]$appName="eshop",
[parameter(Mandatory=$false)][bool]$deployInfrastructure=$true,
[parameter(Mandatory=$false)][string]$kialiuser="admin",
[parameter(Mandatory=$false)][string]$kialipasswrd="admin",
[parameter(Mandatory=$false)][bool]$clean=$true,
[parameter(Mandatory=$false)][string]$aksName="",
[parameter(Mandatory=$false)][string]$aksRg="",
[parameter(Mandatory=$false)][string]$imageTag="latest",
[parameter(Mandatory=$false)][bool]$useLocalk8s=$false
)
$dns = $externalDns
# Instalamos Istio
# Specify the Istio version that will be leveraged throughout these instructions
$ISTIO_VERSION="1.0.6"
# Windows
$ProgressPreference = 'SilentlyContinue';
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip"
Remove-Item istio-$ISTIO_VERSION -Recurse -ErrorAction Ignore
Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath .
if($installIstioOnSystem -eq $true) {
New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio"
mv ./istio-$ISTIO_VERSION/bin/istioctl.exe "C:\Program Files/Istio/"
$PATH = [environment]::GetEnvironmentVariable("PATH", "User")
[environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User")
}
# Primero Desinstalamos cualquier cosa que haya en el cluster
if ($clean -eq $true) {
Write-Host "Cleaning previous helm releases..." -ForegroundColor Green
helm delete --purge $(helm ls -q)
kubectl delete -f istio-$ISTIO_VERSION/install/kubernetes/helm/istio/templates/crds.yaml -n istio-system
Write-Host "Previous releases deleted" -ForegroundColor Green
}
Write-Host "Generating Kiali Credentials" -ForegroundColor Green
#generamos la credenciales para que kiali arranque sin problemas
kubectl -n istio-system create secret generic kiali --from-literal=username=$kialiuser --from-literal=passphrase=$kialipasswrd
Write-Host "Deploying Istio in the cluster" -ForegroundColor Green
helm install istio-$ISTIO_VERSION/install/kubernetes/helm/istio --wait --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true
Write-Host "Setting Up Gateway"
kubectl delete gateway istio-autogenerated-k8s-ingress -n istio-system
kubectl apply -f ./istio/gateway.yml
if ($useLocalk8s -eq $true) {
$dns="localhost"
}
else {
Write-Host "Resolving DNS to Gateway public IP" -ForegroundColor Green
$ipaddress = $(kubectl get service istio-ingressgateway -n istio-system)[1] | %{ $_.Split(' ')[9];}
$query = "[?ipAddress!=null]|[?contains([ipAddress], '$ipaddress')].[id]"
$resid = az network public-ip list --query $query --output tsv
$jsonresponse = az network public-ip update --ids $resid --dns-name $dnsname
$externalDns = ($jsonresponse | ConvertFrom-Json).dnsSettings.fqdn
Write-Host "$externalDns is pointing to Cluster public ip $ipaddress"
}
$useCustomRegistry=$false
if (-not [string]::IsNullOrEmpty($registry)) {
$useCustomRegistry=$true
if ([string]::IsNullOrEmpty($dockerUser) -or [string]::IsNullOrEmpty($dockerPassword)) {
Write-Host "Error: Must use -dockerUser AND -dockerPassword if specifying custom registry" -ForegroundColor Red
exit 1
}
}
Write-Host "Begin eShopOnContainers installation using Helm" -ForegroundColor Green
$infras = ("sql-data", "nosql-data", "rabbitmq", "keystore-data", "basket-data")
$charts = ("eshop-common", "apigwmm", "apigwms", "apigwwm", "apigwws", "basket-api","catalog-api", "identity-api", "locations-api", "marketing-api", "mobileshoppingagg","ordering-api","ordering-backgroundtasks","ordering-signalrhub", "payment-api", "webmvc", "webshoppingagg", "webspa", "webstatus", "webhooks-api", "webhooks-web")
if ($deployInfrastructure) {
foreach ($infra in $infras) {
Write-Host "Installing infrastructure: $infra" -ForegroundColor Green
helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$externalDns --name="$appName-$infra" $infra
}
}
foreach ($chart in $charts) {
Write-Host "Installing: $chart" -ForegroundColor Green
if ($useCustomRegistry) {
helm install --set inf.registry.server=$registry --set inf.registry.login=$dockerUser --set inf.registry.pwd=$dockerPassword --set inf.registry.secretName=eshop-docker-scret --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart
}
else {
if ($chart -ne "eshop-common") { # eshop-common is ignored when no secret must be deployed
helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$externalDns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart
}
}
}
Write-Host "helm charts installed." -ForegroundColor Green
Write-Host "Appling Virtual Services for routing." -ForegroundColor Green
kubectl apply -f ./istio/virtualservices.yml
Remove-Item istio-$ISTIO_VERSION -Recurse -ErrorAction Ignore
Remove-Item istio-$ISTIO_VERSION.zip -Recurse -ErrorAction Ignore

+ 5
- 3
k8s/helm/deploy-all.ps1 View File

@ -2,7 +2,7 @@ Param(
[parameter(Mandatory=$false)][string]$registry,
[parameter(Mandatory=$false)][string]$dockerUser,
[parameter(Mandatory=$false)][string]$dockerPassword,
[parameter(Mandatory=$false)][string]$externalDns,
[parameter(Mandatory=$false)][string]$externalDns="eshoptestistio.westus.cloudapp.azure.com",
[parameter(Mandatory=$false)][string]$appName="eshop",
[parameter(Mandatory=$false)][bool]$deployInfrastructure=$true,
[parameter(Mandatory=$false)][bool]$clean=$true,
@ -66,7 +66,8 @@ $charts = ("eshop-common", "apigwmm", "apigwms", "apigwwm", "apigwws", "basket-a
if ($deployInfrastructure) {
foreach ($infra in $infras) {
Write-Host "Installing infrastructure: $infra" -ForegroundColor Green
helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra
#helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra
helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --name="$appName-$infra" $infra
}
}
@ -77,7 +78,8 @@ foreach ($chart in $charts) {
}
else {
if ($chart -ne "eshop-common") { # eshop-common is ignored when no secret must be deployed
helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart
#helm install --values app.yaml --values inf.yaml --values $ingressValuesFile --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart
helm install --values app.yaml --values inf.yaml --set app.name=$appName --set inf.k8s.dns=$dns --set image.tag=$imageTag --set image.pullPolicy=Always --name="$appName-$chart" $chart
}
}
}


+ 325
- 0
k8s/helm/istio/doc.md View File

@ -0,0 +1,325 @@
# Using Helm Charts to deploy eShopOnContainers to AKS with ISTIO
It is possible to deploy eShopOnContainers on a AKS using [Helm](https://helm.sh/) instead of custom scripts (that will be deprecated soon).
## Create Kubernetes cluster in AKS
You can create the AKS cluster by using two ways:
- A. Use Azure CLI: Follow a procedure suing [Azure CLI like here](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough), but make sure you **enable RBAC** with `--enable-rbac` in `az aks create` command.
- B. Use Azure's portal
The following steps are using the Azure portal to create the AKS cluster:
- Start the process by providing the general data, like in the following screenshot:
![image](https://user-images.githubusercontent.com/1712635/45787360-c59ecd80-bc29-11e8-9565-c989ad6ad57b.png)
- Then, very important, in the next step, enable RBAC:
![image](https://user-images.githubusercontent.com/1712635/45780917-8bc2cc80-bc13-11e8-87ac-2942b3c7496d.png)
You can use **basic network** settings since for a test you don't need integration into any existing VNET.
![image](https://user-images.githubusercontent.com/1712635/45780991-b745b700-bc13-11e8-926b-afac57229d0a.png)
- You can also enable monitoring:
![image](https://user-images.githubusercontent.com/1712635/45781148-1277a980-bc14-11e8-8614-f7a239731bec.png)
- Finally, create the cluster. It'll take a few minutes for it to be ready.
### Configure RBAC security for K8s dashboard service-account
In order NOT to get errors in the Kubernetes dashboard, you'll need to set the following service-account steps.
Here you can see the errors you might see:
![image](https://user-images.githubusercontent.com/1712635/45784384-5622e100-bc1d-11e8-8d33-e22fd955150a.png)
Now, just run the Azure CLI command to browse the Kubernetes Dashboard:
`az aks browse --resource-group pro-eshop-aks-helm-linux-resgrp --name pro-eshop-aks-helm-linux`
![image](https://user-images.githubusercontent.com/1712635/45786406-2d9ee500-bc25-11e8-83e9-bdfc302e80f1.png)
## Additional pre-requisites
In addition to having an AKS cluster created in Azure and having kubectl and Azure CLI installed in your local machine and configured to use your Azure subscription, you also need the following pre-requisites:
### Install Helm
You need to have helm installed on your machine, and Tiller must be installed on the AKS. Follow these instructions on how to ['Install applications with Helm in Azure Kubernetes Service (AKS)'](https://docs.microsoft.com/en-us/azure/aks/kubernetes-helm) to setup Helm and Tiller for AKS.
**Note**: If your ASK cluster is not RBAC-enabled (default option in portal) you may receive following error when running a helm command:
```
Error: Get http://localhost:8080/api/v1/namespaces/kube-system/configmaps?labelSelector=OWNER%!D(MISSING)TILLER: dial tcp [::1]:8080: connect: connection refused
```
If so, type:
```
kubectl --namespace=kube-system edit deployment/tiller-deploy
```
Your default text editor will popup with the YAML definition of the tiller deploy. Search for:
```
automountServiceAccountToken: false
```
And change it to:
```
automountServiceAccountToken: true
```
Save the file and close the editor. This should reapply the deployment in the cluster. Now Helm commands should work.
## Install eShopOnContainers with Istio using Helm
All steps need to be performed on `/k8s/helm` folder. The easiest way is to use the `deploy-all-istio.ps1` script from a Powershell window:
```
.\deploy-all-istio.ps1 -dnsname eshoptestistio -externalDns aks -aksName eshoptest -aksRg eshoptest -imageTag dev
```
This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the AKS named `eshoptest` in the resource group `eshoptest` and with the dns url: http://**eshoptest**.westus.cloudapp.azure.com/ . By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster.
Once the script is run, you should see following output when using `kubectl get deployment`:
```
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
eshop-apigwmm 1 1 1 1 4d
eshop-apigwms 1 1 1 1 4d
eshop-apigwwm 1 1 1 1 4d
eshop-apigwws 1 1 1 1 4d
eshop-basket-api 1 1 1 1 4d
eshop-basket-data 1 1 1 1 4d
eshop-catalog-api 1 1 1 1 4d
eshop-identity-api 1 1 1 1 4d
eshop-keystore-data 1 1 1 1 4d
eshop-locations-api 1 1 1 1 4d
eshop-marketing-api 1 1 1 1 4d
eshop-mobileshoppingagg 1 1 1 1 4d
eshop-nosql-data 1 1 1 1 4d
eshop-ordering-api 1 1 1 1 4d
eshop-ordering-backgroundtasks 1 1 1 1 4d
eshop-ordering-signalrhub 1 1 1 1 4d
eshop-payment-api 1 1 1 1 4d
eshop-rabbitmq 1 1 1 1 4d
eshop-sql-data 1 1 1 1 4d
eshop-webmvc 1 1 1 1 4d
eshop-webshoppingagg 1 1 1 1 4d
eshop-webspa 1 1 1 1 4d
eshop-webstatus 1 1 1 1 4d
```
Every public service is exposed through the istio ingress gateway.
Yo can see the ingress gateway public ip doing `kubectl get services -n istio-system`
```
grafana ClusterIP 10.0.204.87 <none> 3000/TCP 1h
istio-citadel ClusterIP 10.0.23.86 <none> 8060/TCP,9093/TCP 1h
istio-egressgateway ClusterIP 10.0.136.169 <none> 80/TCP,443/TCP 1h
istio-galley ClusterIP 10.0.113.51 <none> 443/TCP,9093/TCP 1h
istio-ingressgateway LoadBalancer 10.0.76.80 40.118.189.161 80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31276/TCP,8060:30519/TCP,853:31698/TCP,15030:31453/TCP,15031:32362/TCP 1h
istio-pilot ClusterIP 10.0.164.253 <none> 15010/TCP,15011/TCP,8080/TCP,9093/TCP 1h
istio-policy ClusterIP 10.0.170.49 <none> 9091/TCP,15004/TCP,9093/TCP 1h
istio-sidecar-injector ClusterIP 10.0.251.12 <none> 443/TCP 1h
istio-telemetry ClusterIP 10.0.195.112 <none> 9091/TCP,15004/TCP,9093/TCP,42422/TCP 1h
jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 1h
jaeger-collector ClusterIP 10.0.123.98 <none> 14267/TCP,14268/TCP 1h
jaeger-query ClusterIP 10.0.244.146 <none> 16686/TCP 1h
kiali ClusterIP 10.0.182.12 <none> 20001/TCP 1h
prometheus ClusterIP 10.0.136.223 <none> 9090/TCP 1h
tracing ClusterIP 10.0.57.236 <none> 80/TCP 1h
zipkin ClusterIP 10.0.30.57 <none> 9411/TCP 1h
```
You can view the MVC client at http://[dns]/
## Customizing the deployment
### Using your own images
To use your own images instead of the public ones, you have to pass following additional parameters to the `deploy-all-istio.ps1` script:
* `registry`: Login server for the Docker registry
* `dockerUser`: User login for the Docker registry
* `dockerPassword`: User password for the Docker registry
This will deploy a secret on the cluster to connect to the specified server, and all image names deployed will be prepended with `registry/` value.
### Not deploying infrastructure containers
If you want to use external resources, use `-deployInfrastructure $false` to not deploy infrastructure containers. However **you still have to manually update the scripts to provide your own configuration** (see next section).
### Providing your own configuration
The file `inf.yaml` contains the description of the infrastructure used. File is docummented so take a look on it to understand all of its entries. If using external resources you need to edit this file according to your needs. You'll need to edit:
* `inf.sql.host` with the host name of the SQL Server
* `inf.sql.common` entries to provide your SQL user, password. `Pid` is not used when using external resources (it is used to set specific product id for the SQL Server container).
* `inf.sql.catalog`, `inf.sql.ordering`, `inf.sql.identity`: To provide the database names for catalog, ordering and identity services
* `mongo.host`: With the host name of the Mongo DB
* `mongo.locations`, `mongo.marketing` with the database names for locations and marketing services
* `redis.basket.constr` with the connection string to Redis for Basket Service. Note that `redis.basket.svc` is not used when using external services
* `redis.keystore.constr` with the connection string to Redis for Keystore Service. Note that `redis.keystore.svc` is not used when using external services
* `eventbus.constr` with the connection string to Azure Service Bus and `eventbus.useAzure` to `true` to use Azure service bus. Note that `eventbus.svc` is not used when using external services
### Using Azure storage for Catalog Photos
Using Azure storage for catalog (and marketing) photos is not directly supported, but you can accomplish it by editing the file `k8s/helm/catalog-api/templates/configmap.yaml`. Search for lines:
```
catalog__PicBaseUrl: http://{{ $webshoppingapigw }}/api/v1/c/catalog/items/[0]/pic/
```
And replace it for:
```
catalog__PicBaseUrl: http://<url-of-the-storage>/
```
In the same way, to use Azure storage for the marketing service, have to edit the file `k8s/helm/marketing-api/templates/configmap.yaml` and replacing the line:
```
marketing__PicBaseUrl: http://{{ $webshoppingapigw }}/api/v1/c/catalog/items/[0]/pic/
```
by:
```
marketing__PicBaseUrl: http://<url-of-the-storage>/
```
# Using Helm Charts to deploy eShopOnContainers to a local Kubernetes in Windows with 'Docker for Windows'
## Additional pre-requisites
In addition to having Docker for Windows/Mac with Kubernetes enabled and having kubectl ayou also need the following pre-requisites:
### Install Helm
You need to have helm installed on your machine, and Tiller must be installed on the local Docker Kubernetes cluster. Once you have [Helm downloaded](https://helm.sh/) and installed on your machine you must:
1. Create the tiller service account, by running `kubectl apply -f helm-rbac.yaml` from `/k8s` folder
2. Install tiller and configure it to use the tiller service account by typing `helm init --service-account tiller`
## Install eShopOnContainers with Istio using Helm
All steps need to be performed on `/k8s/helm` folder. The easiest way is to use the `deploy-all-istio.ps1` script from a Powershell window:
```
.\deploy-all-istio.ps1 -imageTag dev -useLocalk8s $true
```
The parameter `useLocalk8s` to $true, forces the script to use `localhost` as the DNS for all Helm charts.
This will install all the [eShopOnContainers public images](https://hub.docker.com/u/eshop/) with tag `dev` on the Docker local Kubernetes cluster. By default all infrastructure (sql, mongo, rabbit and redis) is installed also in the cluster.
Once the script is run, you should see following output when using `kubectl get deployment`:
```
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
eshop-apigwmm 1 1 1 1 2h
eshop-apigwms 1 1 1 1 2h
eshop-apigwwm 1 1 1 1 2h
eshop-apigwws 1 1 1 1 2h
eshop-basket-api 1 1 1 1 2h
eshop-basket-data 1 1 1 1 2h
eshop-catalog-api 1 1 1 1 2h
eshop-identity-api 1 1 1 1 2h
eshop-keystore-data 1 1 1 1 2h
eshop-locations-api 1 1 1 1 2h
eshop-marketing-api 1 1 1 1 2h
eshop-mobileshoppingagg 1 1 1 1 2h
eshop-nosql-data 1 1 1 1 2h
eshop-ordering-api 1 1 1 1 2h
eshop-ordering-backgroundtasks 1 1 1 1 2h
eshop-ordering-signalrhub 1 1 1 1 2h
eshop-payment-api 1 1 1 1 2h
eshop-rabbitmq 1 1 1 1 2h
eshop-sql-data 1 1 1 1 2h
eshop-webmvc 1 1 1 1 2h
eshop-webshoppingagg 1 1 1 1 2h
eshop-webspa 1 1 1 1 2h
eshop-webstatus 1 1 1 1 2h
```
Note that istio ingress gateway is bound to DNS localhost and the host is also "localhost". So, you can access the webspa by typing `http://localhost` and the MVC by typing `http://localhost/`
As this is the Docker local K8s cluster, you can see also the containers running on your machine. If you type `docker ps` you'll see all them:
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fec1e3499416 a3f21ec4bd11 "/entrypoint.sh /ngi…" 9 minutes ago Up 9 minutes k8s_nginx-ingress-controller_nginx-ingress-controller-f88c75bc6-5xs2n_ingress-nginx_f1cc7094-e68f-11e8-b4b6-00155d016146_0
76485867f032 eshop/payment.api "dotnet Payment.API.…" 2 hours ago Up 2 hours k8s_payment-api_eshop-payment-api-75d5f9bdf6-6zx2v_default_4a3cdab4-e67f-11e8-b4b6-00155d016146_1
c2c4640ed610 eshop/marketing.api "dotnet Marketing.AP…" 2 hours ago Up 2 hours k8s_marketing-api_eshop-marketing-api-6b8c5989fd-jpxqv_default_45780626-e67f-11e8-b4b6-00155d016146_1
85301d538574 eshop/ordering.signalrhub "dotnet Ordering.Sig…" 2 hours ago Up 2 hours k8s_ordering-signalrhub_eshop-ordering-signalrhub-58cf5ff6-cnlm8_default_4932c344-e67f-11e8-b4b6-00155d016146_1
7a408a98000e eshop/ordering.backgroundtasks "dotnet Ordering.Bac…" 2 hours ago Up 2 hours k8s_ordering-backgroundtasks_eshop-ordering-backgroundtasks-cc8f6d4d8-ztfk7_default_47f9cf10-e67f-11e8-b4b6-00155d016146_1
12c64b3a13e0 eshop/basket.api "dotnet Basket.API.d…" 2 hours ago Up 2 hours k8s_basket-api_eshop-basket-api-658546684d-6hlvd_default_4262d022-e67f-11e8-b4b6-00155d016146_1
133fccfeeff3 eshop/webstatus "dotnet WebStatus.dll" 2 hours ago Up 2 hours k8s_webstatus_eshop-webstatus-7f46479dc4-bqnq7_default_4dc13eb2-e67f-11e8-b4b6-00155d016146_0
00c6e4c52135 eshop/webspa "dotnet WebSPA.dll" 2 hours ago Up 2 hours k8s_webspa_eshop-webspa-64cb8df9cb-dcbwg_default_4cd47376-e67f-11e8-b4b6-00155d016146_0
d4507f1f6b1a eshop/webshoppingagg "dotnet Web.Shopping…" 2 hours ago Up 2 hours k8s_webshoppingagg_eshop-webshoppingagg-cc94fc86-sxd2v_default_4be6cdb9-e67f-11e8-b4b6-00155d016146_0
9178e26703da eshop/webmvc "dotnet WebMVC.dll" 2 hours ago Up 2 hours k8s_webmvc_eshop-webmvc-985779684-4br5z_default_4addd4d6-e67f-11e8-b4b6-00155d016146_0
1088c281c710 eshop/ordering.api "dotnet Ordering.API…" 2 hours ago Up 2 hours k8s_ordering-api_eshop-ordering-api-fb8c548cb-k68x9_default_4740958a-e67f-11e8-b4b6-00155d016146_0
12424156d5c9 eshop/mobileshoppingagg "dotnet Mobile.Shopp…" 2 hours ago Up 2 hours k8s_mobileshoppingagg_eshop-mobileshoppingagg-b54645d7b-rlrgh_default_46c00017-e67f-11e8-b4b6-00155d016146_0
65463ffd437d eshop/locations.api "dotnet Locations.AP…" 2 hours ago Up 2 hours k8s_locations-api_eshop-locations-api-577fc94696-dfhq8_default_44929c4b-e67f-11e8-b4b6-00155d016146_0
5b3431873763 eshop/identity.api "dotnet Identity.API…" 2 hours ago Up 2 hours k8s_identity-api_eshop-identity-api-85d9b79f4-s5ks7_default_43d6eb7c-e67f-11e8-b4b6-00155d016146_0
7c8e77252459 eshop/catalog.api "dotnet Catalog.API.…" 2 hours ago Up 2 hours k8s_catalog-api_eshop-catalog-api-59fd444fb-ztvhz_default_4356705a-e67f-11e8-b4b6-00155d016146_0
94d95d0d3653 eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwws_eshop-apigwws-65474b979d-n99jw_default_41395473-e67f-11e8-b4b6-00155d016146_0
bc4bbce71d5f eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwwm_eshop-apigwwm-857c549dd8-8w5gv_default_4098d770-e67f-11e8-b4b6-00155d016146_0
840aabcceaa9 eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwms_eshop-apigwms-5b94dfb54b-dnmr9_default_401fc611-e67f-11e8-b4b6-00155d016146_0
aabed7646f5b eshop/ocelotapigw "dotnet OcelotApiGw.…" 2 hours ago Up 2 hours k8s_apigwmm_eshop-apigwmm-85f96cbdb4-dhfwr_default_3ed7967a-e67f-11e8-b4b6-00155d016146_0
49c5700def5a f06a5773f01e "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_basket-data_eshop-basket-data-66fbc788cc-csnlw_default_3e0c45fe-e67f-11e8-b4b6-00155d016146_0
a5db4c521807 f06a5773f01e "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_keystore-data_eshop-keystore-data-5c9c85cb99-8k56s_default_3ce1a273-e67f-11e8-b4b6-00155d016146_0
aae88fd2d810 d69a5113ceae "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_rabbitmq_eshop-rabbitmq-6b68647bc4-gr565_default_3c37ee6a-e67f-11e8-b4b6-00155d016146_0
65d49ca9589d bbed8d0e01c1 "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_nosql-data_eshop-nosql-data-579c9d89f8-mtt95_default_3b9c1f89-e67f-11e8-b4b6-00155d016146_0
090e0dde2ec4 bbe2822dfe38 "/opt/mssql/bin/sqls…" 2 hours ago Up 2 hours k8s_sql-data_eshop-sql-data-5c4fdcccf4-bscdb_default_3afd29b8-e67f-11e8-b4b6-00155d016146_0
```
## Known issues
Login from the webmvc results in following error: HttpRequestException: Response status code does not indicate success: 404 (Not Found).
The reason is because MVC needs to access the Identity Server from both outside the container (browser) and inside the container (C# code). Thus, the configuration uses always the *external url* of the Identity Server, which in this case is just `http://localhost/identity-api`. But this external url is incorrect when used from C# code, and the web mvc can't access the identity api. This is the only case when this issue happens (and is the reason why we use 10.0.75.1 for local address in web mvc in local development mode)
Solving this requires some manual steps:
Update the configmap of Web MVC by typing (**line breaks are mandatory**) and your cluster dns name has to be the same of your environment:
```
kubectl patch cm cfg-eshop-webmvc --type strategic --patch @'
data:
urls__IdentityUrl: http://**eshoptest**.westus.cloudapp.azure.com/identity
urls__mvc: http://**eshoptest**.westus.cloudapp.azure.com/webmvc
'@
```
Update the configmap of Identity API by typing (**line breaks are mandatory**):
```
kubectl patch cm cfg-eshop-identity-api --type strategic --patch @'
data:
mvc_e: http://**eshoptest**.westus.cloudapp.azure.com/webmvc
'@
```
Restart the SQL Server pod to ensure the database is recreated again:
```
kubectl delete pod --selector app=sql-data
```
Wait until SQL Server pod is ready to accept connections and then restart all other pods:
```
kubectl delete pod --selector="app!=sql-data"
```
**Note:** Pods are deleted to ensure the databases are recreated again, as identity api stores its client names and urls in the database.
Now, you can access the MVC app using: `http://**eshoptest**.westus.cloudapp.azure.com/`.

+ 15
- 0
k8s/helm/istio/gateway.yml View File

@ -0,0 +1,15 @@
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-ingressgateway
#namespace: istio-system
spec:
selector:
istio: ingressgateway # use Istio default gateway implementation
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"

+ 59
- 0
k8s/helm/istio/virtualservices.yml View File

@ -0,0 +1,59 @@
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: webmvcvs
namespace: default
spec:
hosts:
- "*"
gateways:
- istio-ingressgateway
http:
- match:
- uri:
prefix: /
route:
- destination:
port:
number: 80
host: webmvc
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: webshoppingapigwvs
namespace: default
spec:
hosts:
- "*"
gateways:
- istio-ingressgateway
http:
- match:
- uri:
prefix: /webshoppingapigw
route:
- destination:
port:
number: 80
host: webshoppingapigw
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: identityvs
namespace: default
spec:
hosts:
- "*"
gateways:
- istio-ingressgateway
http:
- match:
- uri:
prefix: /identity
route:
- destination:
port:
number: 80
host: identity

+ 0
- 85
k8s/istio/JourneyToIstio.md View File

@ -1,85 +0,0 @@
# ISTIO on Local
## Prerequisites on local
You need the eshopsOnContainers configured on your local, with this
in a powershell console, we need to enter in /k8s/istio and execute
```
>kubectl get pods
NAME READY STATUS RESTARTS AGE
eshop-apigwmm-54ccc6c589-557fn 0/1 Running 31 4h
eshop-apigwms-7d5f86cf7c-2j2zp 0/1 Running 32 4h
eshop-apigwwm-7794b6d879-7j4mt 0/1 Running 44 4h
eshop-apigwws-8585f6899f-7kkg2 0/1 Running 13 4h
eshop-basket-api-8bfc5c5f6-8xxcv 1/1 Running 47 4h
eshop-basket-data-66fbc788cc-dmkgb 1/1 Running 1 4h
eshop-catalog-api-c77747b76-4gp6c 0/1 Running 48 4h
eshop-identity-api-7574f6b458-4rbp6 0/1 Running 55 4h
eshop-keystore-data-5c9c85cb99-s5qz7 1/1 Running 1 4h
eshop-locations-api-64847646d-5wv52 1/1 Running 42 4h
eshop-marketing-api-745f9546b8-krjqq 1/1 Running 40 4h
eshop-mobileshoppingagg-7d467f86bd-bw9c7 0/1 Running 24 4h
eshop-nosql-data-579c9d89f8-x4z2k 1/1 Running 1 4h
eshop-ordering-api-5c55bd5464-7hnjx 0/1 Running 46 4h
eshop-ordering-backgroundtasks-f6dcb7db4-xq7gr 0/1 Running 24 4h
eshop-ordering-signalrhub-6664868779-dphxm 1/1 Running 1 4h
eshop-payment-api-7988db5f76-z76tc 0/1 Running 19 4h
eshop-rabbitmq-6b68647bc4-qjjrb 1/1 Running 1 4h
eshop-sql-data-5c4fdcccf4-2z5dm 1/1 Running 1 4h
eshop-webhooks-api-588b58bb66-lmx5c 1/1 Running 2 4h
eshop-webhooks-web-565c68b59c-dk8hp 1/1 Running 1 4h
eshop-webmvc-55c596544b-9fqsj 1/1 Running 2 4h
eshop-webshoppingagg-f8547f45b-4mjvp 0/1 Running 21 4h
eshop-webspa-84fd54466d-hzrlb 1/1 Running 2 4h
eshop-webstatus-775b487d4d-tbfbn 1/1 Running 1 4h
```
```ps1
> ./install-istio-local.ps1
```
This will install the cli utility and register to the path, you can test this phase launching
```ps1
> istioctl
```
Afterthat you can install Istio on your cluster executing
```ps1
> ./deploy-istio-helm.ps1
```
the result should be like:
```
NAME READY STATUS RESTARTS AGE
grafana-774bf8cb47-clqkp 1/1 Running 0 2h
istio-citadel-548f4cdd9-dbrbn 1/1 Running 0 2h
istio-egressgateway-5f77f6c979-8922g 1/1 Running 0 2h
istio-galley-8f6585898-7c7wq 1/1 Running 0 2h
istio-ingressgateway-8484579cdb-7tw8n 1/1 Running 0 2h
istio-pilot-7c5c5778fb-r987v 2/2 Running 0 2h
istio-policy-7d67d47c65-rdqwj 2/2 Running 15 2h
istio-sidecar-injector-6fb6845cdd-nnhks 1/1 Running 0 2h
istio-telemetry-8b9fc7769-pwx5m 2/2 Running 24 2h
istio-tracing-ff94688bb-xnhnd 1/1 Running 4 2h
kiali-8644dbcdbc-pb627 0/1 CrashLoopBackOff 7 2h
prometheus-f556886b8-mr6wb 1/1 Running 13 2h
```
Is a common error that kiali-pod have errors, because it needs a credentials for working.
enter in k8s/istio/kiali and execute:
```
> ./set-kiali-credentials.ps1
```
this script will prompt for a valid account/password and setups the secret in kubernetes
(at the moment account/password will be admin/admin we need to modify the yml)
After enter in /k8s/istio/nginx-ingress that execute, we need to apply the istio integration with nginx-ingress for service-upstream.
```
> ./update-nginx-ingress.ps1
```
And After that, we only need to activate the sidecar injection in the default namespace for the eshops deployments, for doing that you must go the folder /k8s/istio
and run:
```
> ./apply-injection.ps1
````

+ 0
- 2
k8s/istio/apply-injection.ps1 View File

@ -1,2 +0,0 @@
kubectl label namespace default istio-injection=enabled
kubectl get namespace -L istio-injection

+ 0
- 2
k8s/istio/delete-istio.ps1 View File

@ -1,2 +0,0 @@
helm delete --purge istio
kubectl delete -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system

+ 0
- 8
k8s/istio/deploy-istio-helm.ps1 View File

@ -1,8 +0,0 @@
$ISTIO_VERSION="1.0.6"
cd istio-$ISTIO_VERSION
<<<<<<< HEAD
helm install install/kubernetes/helm/istio --wait --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true --set ingress.enabled=false --set gateways.istio-ingressgateway.enabled=false
cd ..
=======
helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set global.controlPlaneSecurityEnabled=true --set grafana.enabled=true --set tracing.enabled=true --set kiali.enabled=true
>>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e

+ 0
- 16
k8s/istio/install-istio-local.ps1 View File

@ -1,16 +0,0 @@
# Specify the Istio version that will be leveraged throughout these instructions
$ISTIO_VERSION="1.0.6"
# Windows
$ProgressPreference = 'SilentlyContinue';
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -URI "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istio-$ISTIO_VERSION-win.zip" -OutFile "istio-$ISTIO_VERSION.zip"
Expand-Archive -Path "istio-$ISTIO_VERSION.zip" -DestinationPath .
cd istio-$ISTIO_VERSION
New-Item -ItemType Directory -Force -Path "C:\Program Files\Istio"
mv ./bin/istioctl.exe "C:\Program Files/Istio/"
$PATH = [environment]::GetEnvironmentVariable("PATH", "User")
[environment]::SetEnvironmentVariable("PATH", $PATH + "; C:\Program Files\Istio", "User")

+ 0
- 16
k8s/istio/kiali/secrets.yml View File

@ -1,16 +0,0 @@
apiVersion: v1
kind: Secret
metadata:
name: kiali
namespace: istio-system
labels:
app: kiali
type: Opaque
data:
<<<<<<< HEAD
username: YWRtaW4=
passphrase: MWYyZDFlMmU2N2Rm
=======
username: YQBkAG0AaQBuAA==
passphrase: YQBkAG0AaQBuAA==
>>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e

+ 0
- 41
k8s/istio/kiali/set-kiali-credentials.ps1 View File

@ -1,41 +0,0 @@
Param([parameter(Mandatory,HelpMessage="Enter a valid username for Kiali Administration")][string]$username,
[parameter(Mandatory,HelpMessage="Enter your super secret password")][securestring]$password,
[parameter(Mandatory=$false)][string]$NAMESPACE="istio-system"
)
function Get-PlainText()
{
[CmdletBinding()]
param
(
[parameter(Mandatory = $true)]
[securestring]$SecureString
)
BEGIN { }
PROCESS
{
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecureString);
try
{
return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr);
}
finally
{
[Runtime.InteropServices.Marshal]::FreeBSTR($bstr);
}
}
END { }
}
$KIALIUSERNAME = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($username))
$plainpassword = Get-PlainText $password;
$KIALIPASSWORD = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($plainpassword))
<<<<<<< HEAD
Write-Host "Creating Kiali Secret in namespace [$NAMESPACE]" -ForegroundColor Blue
kubectl -n $NAMESPACE create secret generic kiali --from-literal=username=$KIALIUSERNAME --from-literal=passphrase=$KIALIPASSWORD
=======
Write-Host "setting username [$KIALIUSERNAME] and password [$KIALIPASSWORD]" -ForegroundColor Blue
kubectl apply -f secrets.yml
>>>>>>> abb108e03dd0ddf0b43d7ea4b2f5b307452ac88e

+ 0
- 21
k8s/istio/nginx-ingress/cloud-generic.yaml View File

@ -1,21 +0,0 @@
kind: Service
apiVersion: v1
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
externalTrafficPolicy: Local
type: LoadBalancer
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: http
port: 80
targetPort: http
- name: https
port: 443
targetPort: https

BIN
k8s/istio/nginx-ingress/cm.yaml View File


+ 0
- 3
k8s/istio/nginx-ingress/local-dockerk8s/identityapi-cm-fix.yaml View File

@ -1,3 +0,0 @@
data:
mvc_e: http://10.0.75.1/webmvc

+ 0
- 3
k8s/istio/nginx-ingress/local-dockerk8s/mvc-cm-fix.yaml View File

@ -1,3 +0,0 @@
data:
urls__IdentityUrl: http://10.0.75.1/identity
urls__mvc: http://10.0.75.1/webmvc

+ 0
- 39
k8s/istio/nginx-ingress/local-dockerk8s/mvc-fix.yaml View File

@ -1,39 +0,0 @@
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
labels:
app: webmvc
name: eshop-webmvc-loopback
namespace: default
spec:
rules:
- http:
paths:
- backend:
serviceName: webmvc
servicePort: http
path: /webmvc
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
labels:
app: identity-api
name: eshop-identity-api-loopback
namespace: default
spec:
rules:
- http:
paths:
- backend:
serviceName: identity
servicePort: http
path: /identity

+ 0
- 239
k8s/istio/nginx-ingress/mandatory.yaml View File

@ -1,239 +0,0 @@
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- "extensions"
resources:
- ingresses/status
verbs:
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
# Defaults to "<election-id>-<ingress-class>"
# Here: "<ingress-controller-leader>-<nginx>"
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
- "ingress-controller-leader-nginx"
verbs:
- get
- update
- apiGroups:
- ""
resources:
- configmaps
verbs:
- create
- apiGroups:
- ""
resources:
- endpoints
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
service-upstream: "true"
spec:
serviceAccountName: nginx-ingress-serviceaccount
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1

+ 0
- 22
k8s/istio/nginx-ingress/service-nodeport.yaml View File

@ -1,22 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx

+ 0
- 1
k8s/istio/nginx-ingress/update-nginx-ingress.ps1 View File

@ -1 +0,0 @@
kubectl apply -f mandatory.yml

+ 1
- 1
src/Web/WebMVC/package-lock.json View File

@ -19,7 +19,7 @@
"resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz",
"integrity": "sha1-i0O+ZPudDEFIcURvLbjoyk6V8YE=",
"requires": {
"jquery": "3.3.1"
"jquery": ">=1.12.0"
}
}
}


Loading…
Cancel
Save