Search code examples
kubernetesistiominikube

can't get product page from outside using browser via istio


Hey it's been quite days struggling to make the sample book app running. I am new to istio and trying to get understand it. I followed this demo of an other way of setting up the bookinfo. I am using minikube in a virtualbox machine with docker as a driver. I set metalLB as a loadBalancer for ingress-gateway, here is the configmap i used for metalLB :

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: custom-ip-space
      protocol: layer2
      addresses:
      - 192.168.49.2/28

the 192.168.49.2 is the result of the command: minikube ip

The ingressgateway yaml file:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - "*"
  gateways:
    - bookinfo-gateway
  http:
    - route:
        - destination:
            host: productpage
            port:
              number: 9080

and the output command of kubectl get svc -n istio-system:


NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.111.105.179   <none>         3000/TCP                                                                                                                                     34m
istio-citadel            ClusterIP      10.100.38.218    <none>         8060/TCP,15014/TCP                                                                                                                           34m
istio-egressgateway      ClusterIP      10.101.66.207    <none>         80/TCP,443/TCP,15443/TCP                                                                                                                     34m
istio-galley             ClusterIP      10.103.112.155   <none>         443/TCP,15014/TCP,9901/TCP                                                                                                                   34m
istio-ingressgateway     LoadBalancer   10.97.23.39      192.168.49.0   15020:32717/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:32199/TCP,15030:30010/TCP,15031:30189/TCP,15032:31134/TCP,15443:30748/TCP   34m
istio-pilot              ClusterIP      10.108.133.31    <none>         15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       34m
istio-policy             ClusterIP      10.100.74.207    <none>         9091/TCP,15004/TCP,15014/TCP                                                                                                                 34m
istio-sidecar-injector   ClusterIP      10.97.224.99     <none>         443/TCP,15014/TCP                                                                                                                            34m
istio-telemetry          ClusterIP      10.101.165.139   <none>         9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       34m
jaeger-agent             ClusterIP      None             <none>         5775/UDP,6831/UDP,6832/UDP                                                                                                                   34m
jaeger-collector         ClusterIP      10.111.188.83    <none>         14267/TCP,14268/TCP,14250/TCP                                                                                                                34m
jaeger-query             ClusterIP      10.103.148.144   <none>         16686/TCP                                                                                                                                    34m
kiali                    ClusterIP      10.111.57.222    <none>         20001/TCP                                                                                                                                    34m
prometheus               ClusterIP      10.107.204.95    <none>         9090/TCP                                                                                                                                     34m
tracing                  ClusterIP      10.104.88.173    <none>         80/TCP                                                                                                                                       34m
zipkin                   ClusterIP      10.111.162.93    <none>         9411/TCP                                                                                                                                     34m

and when trying to curl 192.168.49.0:80/productpage I am getting :

*   Trying 192.168.49.0...
* TCP_NODELAY set
* Immediate connect fail for 192.168.49.0: Network is unreachable
* Closing connection 0
curl: (7) Couldn't connect to server
myhost@k8s:~$ curl 192.168.49.0:80/productpage
curl: (7) Couldn't connect to server

and before setting up the metalLB, I was getting connection refused!

Any solution for this please ? as it's been 5 days struggling to fix it.

I followed the steps here and all steps are ok!


Solution

  • In my opinion, this is a problem with the MetalLB configuration.

    You are trying to give MetalLB control over IPs from the 192.168.49.2/28 network.
    We can calculate for 192.168.49.2/28 network: HostMin=192.168.49.1 and HostMax=192.168.49.14.

    As we can see, your istio-ingressgateway LoadBalancer Service is assigned the address 192.168.49.0 and I think that is the cause of the problem.

    I recommend changing from 192.168.49.2/28 to a range, such as 192.168.49.10-192.168.49.20.


    I've created an example to illustrate you how your configuration can be changed.

    As you can see, at the beginning I had the configuration exactly like you (I also couldn't connect to the server using the curl command):

    $ kubectl get svc -n istio-system istio-ingressgateway
    NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP                                                                                                                                       
    istio-ingressgateway   LoadBalancer   10.109.75.19   192.168.49.0    
    
    
    $ curl 192.168.49.0:80/productpage
    curl: (7) Couldn't connect to server
    

    First, I modified the config ConfigMap:
    NOTE: I changed 192.168.49.2/28 to 192.168.49.10-192.168.49.20

    $ kubectl edit cm config -n metallb-system 
    

    Then I restarted all the controller and speaker Pods to force MetalLB to use new config (see: Metallb ConfigMap update).

    $ kubectl delete pod -n metallb-system --all      
    pod "controller-65db86ddc6-gf49h" deleted
    pod "speaker-7l66v" deleted
    

    After some time, we should see a new EXTERNAL-IP assigned to the istio-ingressgateway Service:

    kubectl get svc -n istio-system istio-ingressgateway
    NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP                                                                                                                                         AGE
    istio-ingressgateway   LoadBalancer   10.106.170.227   192.168.49.10  
    

    Finally, we can check if it works as expected:

    $ curl 192.168.49.10:80/productpage                   
    <!DOCTYPE html>
    <html>
      <head>
        <title>Simple Bookstore App</title>
    ...