<p>Regarding the current installation options for <code>Istio 1.1.4</code> it should be possible to <a href="https://istio.io/docs/reference/config/installation-options/#global-options" rel="nofollow noreferrer">define a default node selector which gets added to all Istio deployments</a></p>

<p>The documentation does not show a dedicated sample how the selector has to be defined, only <code>{}</code> as value.</p>

<p>Currently I was not able to find a working format to pass the values to the helm charts by using <code>--set</code>, e.g:</p>

<pre><code> --set global.defaultNodeSelector="{cloud.google.com/gke-nodepool:istio-pool}"
</code></pre>

<p>I tried several variations, with and without escapes, JSON map, ... But currently everything results into the same Helm error message:</p>

<pre><code>2019/05/06 15:58:10 Warning: Merging destination map for chart 'istio'. Cannot overwrite table item 'defaultNodeSelector', with non table value: map[]

Istio version 1.1.4

Helm 2.13.1
</code></pre>

<p>The expectation would be to have a more detailed documentation, giving some samples on Istio side.</p>

Peter
<p>When specifying overrides with --set, multiple key/value pairs are deeply merged based on keys. <BR>It means in your case, that only last item will be present in the generated template. <BR>The same will happen even if you override with -f (YAML file) option. <br><br>
Here is an example of -f option usage with custom_values.yaml, with distinguished keys: </p>

<pre><code>#custom_values.yaml

global:
  defaultNodeSelector:
    cloud.google.com/bird: stork
    cloud.google.com/bee: wallace
</code></pre>

<blockquote>
  <p>helm template . -x charts/pilot/templates/deployment.yaml -f
  custom_values.yaml</p>
</blockquote>

<p>Snippet of rendered Istio`s Pilot deployment.yaml manifest file:</p>

<pre><code> volumes:
      - name: config-volume
        configMap:
          name: istio
      - name: istio-certs
        secret:
          secretName: istio.istio-pilot-service-account
          optional: true
      affinity:      
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: beta.kubernetes.io/arch
                operator: In
                values:
                - amd64
                - ppc64le
                - s390x
              - key: cloud.google.com/bee
                operator: In
                values:
                - wallace
              - key: cloud.google.com/bird
                operator: In
                values:
                - stork
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 2
            preference:
              matchExpressions:
              - key: beta.kubernetes.io/arch
                operator: In
                values:
                - amd64
</code></pre>

<p>The same can be achieved with --set:</p>

<pre><code>--set global.defaultNodeSelector."cloud\.google\.com/bird"=stork,global.defaultNodeSelector."cloud\.google\.com/bee"=wallace
</code></pre>
