为了利用Istio的所有性能,网格中的Pod必须运行Istio Sidecar代理。上面介绍了两种将Istio Sidecar注入到容器中的办法:手动应用istioctl命令或通过在容器的命名空间中启用主动Istio Sidecar注入。

  • 手动注入间接批改配置(如部署),并将代理配置注入其中。
  • 在Pod的命名空间中启用后,主动注入会应用准入控制器在Pod创立时注入代理配置。

手动注入

要手动注入部署,请应用istioctl kube-inject

istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -

默认状况下,这将应用集群内配置。或者,能够应用配置的本地副原本实现注入。

kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yamlkubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.values}' > inject-values.yamlkubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml

在输出文件上运行kube-inject并进行部署。

istioctl kube-inject     --injectConfigFile inject-config.yaml     --meshConfigFile mesh-config.yaml     --valuesFile inject-values.yaml     --filename samples/sleep/sleep.yaml     | kubectl apply -f -

主动注入

应用Istio提供的 mutating webhook admission controller,能够将Sidecar主动增加到实用的Kubernetes Pod中。

当您在名称空间上设置istio-injection = enabled标签并且启用了注入Webhook时,在该名称空间中创立的所有新容器都将主动增加一个sidecar。

请留神,与手动注入不同,主动注入产生在容器级。您不会看到部署自身的任何变动。相同,您须要查看各个Pod(通过kubectl describe)以查看注入的代理。

istio-sidecar-injector-controller依据在istio-sidecar-injector ConfigMap中定义的模板来进行注入。咱们查看一下具体内容:

$ kubectl describe configmap istio-sidecar-injector -n istio-systemName:         istio-sidecar-injectorNamespace:    istio-systemLabels:       install.operator.istio.io/owning-resource=installed-state              install.operator.istio.io/owning-resource-namespace=istio-system              istio.io/rev=default              operator.istio.io/component=Pilot              operator.istio.io/managed=Reconcile              operator.istio.io/version=1.7.3              release=istioAnnotations:  kubectl.kubernetes.io/last-applied-configuration:                {"apiVersion":"v1","data":{"config":"policy: enablednalwaysInjectSelector:n  []nneverInjectSelector:n  []ninjectedAnnotations:nntem...Data====config:----policy: enabledalwaysInjectSelector:  []neverInjectSelector:  []injectedAnnotations:template: |  rewriteAppHTTPProbe: {{ valueOrDefault .Values.sidecarInjectorWebhook.rewriteAppHTTPProbe false }}  initContainers:  {{ if ne (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) `NONE` }}  {{ if .Values.istio_cni.enabled -}}  - name: istio-validation  {{ else -}}  - name: istio-init  {{ end -}}  {{- if contains "/" .Values.global.proxy_init.image }}    image: "{{ .Values.global.proxy_init.image }}"  {{- else }}    image: "{{ .Values.global.hub }}/{{ .Values.global.proxy_init.image }}:{{ .Values.global.tag }}"  {{- end }}    args:    - istio-iptables    - "-p"    - 15001    - "-z"    - "15006"    - "-u"    - 1337    - "-m"    - "{{ annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode }}"    - "-i"    - "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundIPRanges` .Values.global.proxy.includeIPRanges }}"    - "-x"    - "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundIPRanges` .Values.global.proxy.excludeIPRanges }}"    - "-b"    - "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeInboundPorts` `*` }}"    - "-d"  {{- if excludeInboundPort (annotation .ObjectMeta `status.sidecar.istio.io/port` .Values.global.proxy.statusPort) (annotation .ObjectMeta `traffic.sidecar.istio.io/excludeInboundPorts` .Values.global.proxy.excludeInboundPorts) }}    - "15090,15021,{{ excludeInboundPort (annotation .ObjectMeta `status.sidecar.istio.io/port` .Values.global.proxy.statusPort) (annotation .ObjectMeta `traffic.sidecar.istio.io/excludeInboundPorts` .Values.global.proxy.excludeInboundPorts) }}"  {{- else }}    - "15090,15021"  {{- end }}    {{ if or (isset .ObjectMeta.Annotations `traffic.sidecar.istio.io/includeOutboundPorts`) (ne (valueOrDefault .Values.global.proxy.includeOutboundPorts "") "") -}}    - "-q"    - "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundPorts` .Values.global.proxy.includeOutboundPorts }}"    {{ end -}}    {{ if or (isset .ObjectMeta.Annotations `traffic.sidecar.istio.io/excludeOutboundPorts`) (ne (valueOrDefault .Values.global.proxy.excludeOutboundPorts "") "") -}}    - "-o"    - "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundPorts` .Values.global.proxy.excludeOutboundPorts }}"    {{ end -}}    {{ if (isset .ObjectMeta.Annotations `traffic.sidecar.istio.io/kubevirtInterfaces`) -}}    - "-k"    - "{{ index .ObjectMeta.Annotations `traffic.sidecar.istio.io/kubevirtInterfaces` }}"    {{ end -}}    {{ if .Values.istio_cni.enabled -}}    - "--run-validation"    - "--skip-rule-apply"    {{ end -}}    imagePullPolicy: "{{ valueOrDefault .Values.global.imagePullPolicy `Always` }}"  {{- if .ProxyConfig.ProxyMetadata }}    env:    {{- range $key, $value := .ProxyConfig.ProxyMetadata }}    - name: {{ $key }}      value: "{{ $value }}"    {{- end }}  {{- end }}  {{- if .Values.global.proxy_init.resources }}    resources:      {{ toYaml .Values.global.proxy_init.resources | indent 4 }}  {{- else }}    resources: {}  {{- end }}    securityContext:      allowPrivilegeEscalation: {{ .Values.global.proxy.privileged }}      privileged: {{ .Values.global.proxy.privileged }}      capabilities:    {{- if not .Values.istio_cni.enabled }}        add:        - NET_ADMIN        - NET_RAW    {{- end }}        drop:        - ALL    {{- if not .Values.istio_cni.enabled }}      readOnlyRootFilesystem: false      runAsGroup: 0      runAsNonRoot: false      runAsUser: 0    {{- else }}      readOnlyRootFilesystem: true      runAsGroup: 1337      runAsUser: 1337      runAsNonRoot: true    {{- end }}    restartPolicy: Always  {{ end -}}  {{- if eq .Values.global.proxy.enableCoreDump true }}  - name: enable-core-dump    args:    - -c    - sysctl -w kernel.core_pattern=/var/lib/istio/data/core.proxy && ulimit -c unlimited    command:      - /bin/sh  {{- if contains "/" .Values.global.proxy_init.image }}    image: "{{ .Values.global.proxy_init.image }}"  {{- else }}    image: "{{ .Values.global.hub }}/{{ .Values.global.proxy_init.image }}:{{ .Values.global.tag }}"  {{- end }}    imagePullPolicy: "{{ valueOrDefault .Values.global.imagePullPolicy `Always` }}"    resources: {}    securityContext:      allowPrivilegeEscalation: true      capabilities:        add:        - SYS_ADMIN        drop:        - ALL      privileged: true      readOnlyRootFilesystem: false      runAsGroup: 0      runAsNonRoot: false      runAsUser: 0  {{ end }}  containers:  - name: istio-proxy  {{- if contains "/" (annotation .ObjectMeta `sidecar.istio.io/proxyImage` .Values.global.proxy.image) }}    image: "{{ annotation .ObjectMeta `sidecar.istio.io/proxyImage` .Values.global.proxy.image }}"  {{- else }}    image: "{{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}"  {{- end }}    ports:    - containerPort: 15090      protocol: TCP      name: http-envoy-prom    args:    - proxy    - sidecar    - --domain    - $(POD_NAMESPACE).svc.{{ .Values.global.proxy.clusterDomain }}    - --serviceCluster    {{ if ne "" (index .ObjectMeta.Labels "app") -}}    - "{{ index .ObjectMeta.Labels `app` }}.$(POD_NAMESPACE)"    {{ else -}}    - "{{ valueOrDefault .DeploymentMeta.Name `istio-proxy` }}.{{ valueOrDefault .DeploymentMeta.Namespace `default` }}"    {{ end -}}    - --proxyLogLevel={{ annotation .ObjectMeta `sidecar.istio.io/logLevel` .Values.global.proxy.logLevel}}    - --proxyComponentLogLevel={{ annotation .ObjectMeta `sidecar.istio.io/componentLogLevel` .Values.global.proxy.componentLogLevel}}  {{- if .Values.global.sts.servicePort }}    - --stsPort={{ .Values.global.sts.servicePort }}  {{- end }}  {{- if .Values.global.trustDomain }}    - --trust-domain={{ .Values.global.trustDomain }}  {{- end }}  {{- if .Values.global.logAsJson }}    - --log_as_json  {{- end }}  {{- if gt .ProxyConfig.Concurrency.GetValue 0 }}    - --concurrency    - "{{ .ProxyConfig.Concurrency.GetValue }}"  {{- end -}}  {{- if .Values.global.proxy.lifecycle }}    lifecycle:      {{ toYaml .Values.global.proxy.lifecycle | indent 4 }}  {{- else if .Values.global.proxy.holdApplicationUntilProxyStarts}}    lifecycle:      postStart:        exec:          command:          - pilot-agent          - wait  {{- end }}    env:    - name: JWT_POLICY      value: {{ .Values.global.jwtPolicy }}    - name: PILOT_CERT_PROVIDER      value: {{ .Values.global.pilotCertProvider }}    - name: CA_ADDR    {{- if .Values.global.caAddress }}      value: {{ .Values.global.caAddress }}    {{- else }}      value: istiod{{- if not (eq .Values.revision "") }}-{{ .Values.revision }}{{- end }}.{{ .Values.global.istioNamespace }}.svc:15012    {{- end }}    - name: POD_NAME      valueFrom:        fieldRef:          fieldPath: metadata.name    - name: POD_NAMESPACE      valueFrom:        fieldRef:          fieldPath: metadata.namespace    - name: INSTANCE_IP      valueFrom:        fieldRef:          fieldPath: status.podIP    - name: SERVICE_ACCOUNT      valueFrom:        fieldRef:          fieldPath: spec.serviceAccountName    - name: HOST_IP      valueFrom:        fieldRef:          fieldPath: status.hostIP    - name: CANONICAL_SERVICE      valueFrom:        fieldRef:          fieldPath: metadata.labels['service.istio.io/canonical-name']    - name: CANONICAL_REVISION      valueFrom:        fieldRef:          fieldPath: metadata.labels['service.istio.io/canonical-revision']    - name: PROXY_CONFIG      value: |             {{ protoToJSON .ProxyConfig }}    - name: ISTIO_META_POD_PORTS      value: |-        [        {{- $first := true }}        {{- range $index1, $c := .Spec.Containers }}          {{- range $index2, $p := $c.Ports }}            {{- if (structToJSON $p) }}            {{if not $first}},{{end}}{{ structToJSON $p }}            {{- $first = false }}            {{- end }}          {{- end}}        {{- end}}        ]    - name: ISTIO_META_APP_CONTAINERS      value: "{{- range $index, $container := .Spec.Containers }}{{- if ne $index 0}},{{- end}}{{ $container.Name }}{{- end}}"    - name: ISTIO_META_CLUSTER_ID      value: "{{ valueOrDefault .Values.global.multiCluster.clusterName `Kubernetes` }}"    - name: ISTIO_META_INTERCEPTION_MODE      value: "{{ or (index .ObjectMeta.Annotations `sidecar.istio.io/interceptionMode`) .ProxyConfig.InterceptionMode.String }}"    {{- if .Values.global.network }}    - name: ISTIO_META_NETWORK      value: "{{ .Values.global.network }}"    {{- end }}    {{ if .ObjectMeta.Annotations }}    - name: ISTIO_METAJSON_ANNOTATIONS      value: |             {{ toJSON .ObjectMeta.Annotations }}    {{ end }}    {{- if .DeploymentMeta.Name }}    - name: ISTIO_META_WORKLOAD_NAME      value: {{ .DeploymentMeta.Name }}    {{ end }}    {{- if and .TypeMeta.APIVersion .DeploymentMeta.Name }}    - name: ISTIO_META_OWNER      value: kubernetes://apis/{{ .TypeMeta.APIVersion }}/namespaces/{{ valueOrDefault .DeploymentMeta.Namespace `default` }}/{{ toLower .TypeMeta.Kind}}s/{{ .DeploymentMeta.Name }}    {{- end}}    {{- if (isset .ObjectMeta.Annotations `sidecar.istio.io/bootstrapOverride`) }}    - name: ISTIO_BOOTSTRAP_OVERRIDE      value: "/etc/istio/custom-bootstrap/custom_bootstrap.json"    {{- end }}    {{- if .Values.global.meshID }}    - name: ISTIO_META_MESH_ID      value: "{{ .Values.global.meshID }}"    {{- else if .Values.global.trustDomain }}    - name: ISTIO_META_MESH_ID      value: "{{ .Values.global.trustDomain }}"    {{- end }}    {{- if and (eq .Values.global.proxy.tracer "datadog") (isset .ObjectMeta.Annotations `apm.datadoghq.com/env`) }}    {{- range $key, $value := fromJSON (index .ObjectMeta.Annotations `apm.datadoghq.com/env`) }}    - name: {{ $key }}      value: "{{ $value }}"    {{- end }}    {{- end }}    {{- range $key, $value := .ProxyConfig.ProxyMetadata }}    - name: {{ $key }}      value: "{{ $value }}"    {{- end }}    imagePullPolicy: "{{ valueOrDefault .Values.global.imagePullPolicy `Always` }}"    {{ if ne (annotation .ObjectMeta `status.sidecar.istio.io/port` .Values.global.proxy.statusPort) `0` }}    readinessProbe:      httpGet:        path: /healthz/ready        port: 15021      initialDelaySeconds: {{ annotation .ObjectMeta `readiness.status.sidecar.istio.io/initialDelaySeconds` .Values.global.proxy.readinessInitialDelaySeconds }}      periodSeconds: {{ annotation .ObjectMeta `readiness.status.sidecar.istio.io/periodSeconds` .Values.global.proxy.readinessPeriodSeconds }}      failureThreshold: {{ annotation .ObjectMeta `readiness.status.sidecar.istio.io/failureThreshold` .Values.global.proxy.readinessFailureThreshold }}    {{ end -}}    securityContext:      allowPrivilegeEscalation: {{ .Values.global.proxy.privileged }}      capabilities:        {{ if or (eq (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) `TPROXY`) (eq (annotation .ObjectMeta `sidecar.istio.io/capNetBindService` .Values.global.proxy.capNetBindService) `true`) -}}        add:        {{ if eq (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) `TPROXY` -}}        - NET_ADMIN        {{- end }}        {{ if eq (annotation .ObjectMeta `sidecar.istio.io/capNetBindService` .Values.global.proxy.capNetBindService) `true` -}}        - NET_BIND_SERVICE        {{- end }}        {{- end }}        drop:        - ALL      privileged: {{ .Values.global.proxy.privileged }}      readOnlyRootFilesystem: {{ not .Values.global.proxy.enableCoreDump }}      runAsGroup: 1337      fsGroup: 1337      {{ if or (eq (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) `TPROXY`) (eq (annotation .ObjectMeta `sidecar.istio.io/capNetBindService` .Values.global.proxy.capNetBindService) `true`) -}}      runAsNonRoot: false      runAsUser: 0      {{- else -}}      runAsNonRoot: true      runAsUser: 1337      {{- end }}    resources:  {{- if or (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU`) (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory`) (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPULimit`) (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemoryLimit`) }}    {{- if or (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU`) (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory`) }}      requests:        {{ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU`) -}}        cpu: "{{ index .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU` }}"        {{ end }}        {{ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory`) -}}        memory: "{{ index .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory` }}"        {{ end }}    {{- end }}    {{- if or (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPULimit`) (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemoryLimit`) }}      limits:        {{ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPULimit`) -}}        cpu: "{{ index .ObjectMeta.Annotations `sidecar.istio.io/proxyCPULimit` }}"        {{ end }}        {{ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyMemoryLimit`) -}}        memory: "{{ index .ObjectMeta.Annotations `sidecar.istio.io/proxyMemoryLimit` }}"        {{ end }}    {{- end }}  {{- else }}    {{- if .Values.global.proxy.resources }}      {{ toYaml .Values.global.proxy.resources | indent 4 }}    {{- end }}  {{- end }}    volumeMounts:    {{- if eq .Values.global.pilotCertProvider "istiod" }}    - mountPath: /var/run/secrets/istio      name: istiod-ca-cert    {{- end }}    - mountPath: /var/lib/istio/data      name: istio-data    {{ if (isset .ObjectMeta.Annotations `sidecar.istio.io/bootstrapOverride`) }}    - mountPath: /etc/istio/custom-bootstrap      name: custom-bootstrap-volume    {{- end }}    # SDS channel between istioagent and Envoy    - mountPath: /etc/istio/proxy      name: istio-envoy    {{- if eq .Values.global.jwtPolicy "third-party-jwt" }}    - mountPath: /var/run/secrets/tokens      name: istio-token    {{- end }}    {{- if .Values.global.mountMtlsCerts }}    # Use the key and cert mounted to /etc/certs/ for the in-cluster mTLS communications.    - mountPath: /etc/certs/      name: istio-certs      readOnly: true    {{- end }}    - name: istio-podinfo      mountPath: /etc/istio/pod     {{- if and (eq .Values.global.proxy.tracer "lightstep") .ProxyConfig.GetTracing.GetTlsSettings }}    - mountPath: {{ directory .ProxyConfig.GetTracing.GetTlsSettings.GetCaCertificates }}      name: lightstep-certs      readOnly: true    {{- end }}      {{- if isset .ObjectMeta.Annotations `sidecar.istio.io/userVolumeMount` }}      {{ range $index, $value := fromJSON (index .ObjectMeta.Annotations `sidecar.istio.io/userVolumeMount`) }}    - name: "{{  $index }}"      {{ toYaml $value | indent 4 }}      {{ end }}      {{- end }}  {{- if .ProxyConfig.ProxyMetadata.ISTIO_META_DNS_CAPTURE }}  dnsConfig:    options:    - name: "ndots"      value: "4"  {{- end }}  volumes:  {{- if (isset .ObjectMeta.Annotations `sidecar.istio.io/bootstrapOverride`) }}  - name: custom-bootstrap-volume    configMap:      name: {{ annotation .ObjectMeta `sidecar.istio.io/bootstrapOverride` "" }}  {{- end }}  # SDS channel between istioagent and Envoy  - emptyDir:      medium: Memory    name: istio-envoy  - name: istio-data    emptyDir: {}  - name: istio-podinfo    downwardAPI:      items:        - path: "labels"          fieldRef:            fieldPath: metadata.labels        - path: "annotations"          fieldRef:            fieldPath: metadata.annotations  {{- if eq .Values.global.jwtPolicy "third-party-jwt" }}  - name: istio-token    projected:      sources:      - serviceAccountToken:          path: istio-token          expirationSeconds: 43200          audience: {{ .Values.global.sds.token.aud }}  {{- end }}  {{- if eq .Values.global.pilotCertProvider "istiod" }}  - name: istiod-ca-cert    configMap:      name: istio-ca-root-cert  {{- end }}  {{- if .Values.global.mountMtlsCerts }}  # Use the key and cert mounted to /etc/certs/ for the in-cluster mTLS communications.  - name: istio-certs    secret:      optional: true      {{ if eq .Spec.ServiceAccountName "" }}      secretName: istio.default      {{ else -}}      secretName: {{  printf "istio.%s" .Spec.ServiceAccountName }}      {{  end -}}  {{- end }}    {{- if isset .ObjectMeta.Annotations `sidecar.istio.io/userVolume` }}    {{range $index, $value := fromJSON (index .ObjectMeta.Annotations `sidecar.istio.io/userVolume`) }}  - name: "{{ $index }}"    {{ toYaml $value | indent 2 }}    {{ end }}    {{ end }}  {{- if and (eq .Values.global.proxy.tracer "lightstep") .ProxyConfig.GetTracing.GetTlsSettings }}  - name: lightstep-certs    secret:      optional: true      secretName: lightstep.cacert  {{- end }}  {{- if .Values.global.podDNSSearchNamespaces }}  dnsConfig:    searches:      {{- range .Values.global.podDNSSearchNamespaces }}      - {{ render . }}      {{- end }}  {{- end }}  podRedirectAnnot:  {{- if and (.Values.istio_cni.enabled) (not .Values.istio_cni.chained) }}  {{ if isset .ObjectMeta.Annotations `k8s.v1.cni.cncf.io/networks` }}    k8s.v1.cni.cncf.io/networks: "{{ index .ObjectMeta.Annotations `k8s.v1.cni.cncf.io/networks`}}, istio-cni"  {{- else }}    k8s.v1.cni.cncf.io/networks: "istio-cni"  {{- end }}  {{- end }}    sidecar.istio.io/interceptionMode: "{{ annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode }}"    traffic.sidecar.istio.io/includeOutboundIPRanges: "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundIPRanges` .Values.global.proxy.includeIPRanges }}"    traffic.sidecar.istio.io/excludeOutboundIPRanges: "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundIPRanges` .Values.global.proxy.excludeIPRanges }}"    traffic.sidecar.istio.io/includeInboundPorts: "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeInboundPorts` (includeInboundPorts .Spec.Containers) }}"    traffic.sidecar.istio.io/excludeInboundPorts: "{{ excludeInboundPort (annotation .ObjectMeta `status.sidecar.istio.io/port` .Values.global.proxy.statusPort) (annotation .ObjectMeta `traffic.sidecar.istio.io/excludeInboundPorts` .Values.global.proxy.excludeInboundPorts) }}"  {{ if or (isset .ObjectMeta.Annotations `traffic.sidecar.istio.io/includeOutboundPorts`) (ne (valueOrDefault .Values.global.proxy.includeOutboundPorts "") "") }}    traffic.sidecar.istio.io/includeOutboundPorts: "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundPorts` .Values.global.proxy.includeOutboundPorts }}"  {{- end }}  {{ if or (isset .ObjectMeta.Annotations `traffic.sidecar.istio.io/excludeOutboundPorts`) (ne .Values.global.proxy.excludeOutboundPorts "") }}    traffic.sidecar.istio.io/excludeOutboundPorts: "{{ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundPorts` .Values.global.proxy.excludeOutboundPorts }}"  {{- end }}    traffic.sidecar.istio.io/kubevirtInterfaces: "{{ index .ObjectMeta.Annotations `traffic.sidecar.istio.io/kubevirtInterfaces` }}"  {{- if .Values.global.imagePullSecrets }}  imagePullSecrets:    {{- range .Values.global.imagePullSecrets }}    - name: {{ . }}    {{- end }}  {{- end }}values:----{  "global": {    "arch": {      "amd64": 2,      "ppc64le": 2,      "s390x": 2    },    "caAddress": "",    "centralIstiod": false,    "configValidation": true,    "controlPlaneSecurityEnabled": true,    "createRemoteSvcEndpoints": false,    "defaultNodeSelector": {},    "defaultPodDisruptionBudget": {      "enabled": true    },    "defaultResources": {      "requests": {        "cpu": "10m"      }    },    "enableHelmTest": false,    "enabled": true,    "hub": "docker.io/istio",    "imagePullPolicy": "",    "imagePullSecrets": [],    "istioNamespace": "istio-system",    "istiod": {      "enableAnalysis": false    },    "jwtPolicy": "third-party-jwt",    "logAsJson": false,    "logging": {      "level": "default:info"    },    "meshExpansion": {      "enabled": false,      "useILB": false    },    "meshID": "",    "meshNetworks": {},    "mountMtlsCerts": false,    "multiCluster": {      "clusterName": "",      "enabled": false    },    "namespace": "istio-system",    "network": "",    "omitSidecarInjectorConfigMap": false,    "oneNamespace": false,    "operatorManageWebhooks": false,    "pilotCertProvider": "istiod",    "policyNamespace": "istio-system",    "priorityClassName": "",    "proxy": {      "autoInject": "enabled",      "clusterDomain": "cluster.local",      "componentLogLevel": "misc:error",      "enableCoreDump": false,      "excludeIPRanges": "",      "excludeInboundPorts": "",      "excludeOutboundPorts": "",      "holdApplicationUntilProxyStarts": false,      "image": "proxyv2",      "includeIPRanges": "*",      "logLevel": "warning",      "privileged": false,      "readinessFailureThreshold": 30,      "readinessInitialDelaySeconds": 1,      "readinessPeriodSeconds": 2,      "resources": {        "limits": {          "cpu": "2000m",          "memory": "1024Mi"        },        "requests": {          "cpu": "100m",          "memory": "128Mi"        }      },      "statusPort": 15020,      "tracer": "zipkin"    },    "proxy_init": {      "image": "proxyv2",      "resources": {        "limits": {          "cpu": "2000m",          "memory": "1024Mi"        },        "requests": {          "cpu": "10m",          "memory": "10Mi"        }      }    },    "remotePilotAddress": "",    "remotePolicyAddress": "",    "remoteTelemetryAddress": "",    "sds": {      "token": {        "aud": "istio-ca"      }    },    "sts": {      "servicePort": 0    },    "tag": "1.7.3",    "telemetryNamespace": "istio-system",    "tracer": {      "datadog": {        "address": "$(HOST_IP):8126"      },      "lightstep": {        "accessToken": "",        "address": ""      },      "stackdriver": {        "debug": false,        "maxNumberOfAnnotations": 200,        "maxNumberOfAttributes": 200,        "maxNumberOfMessageEvents": 200      },      "zipkin": {        "address": ""      }    },    "trustDomain": "cluster.local",    "useMCP": false  },  "istio_cni": {    "enabled": false  },  "revision": "",  "sidecarInjectorWebhook": {    "alwaysInjectSelector": [],    "enableNamespacesByDefault": false,    "injectLabel": "istio-injection",    "injectedAnnotations": {},    "neverInjectSelector": [],    "objectSelector": {      "autoInject": true,      "enabled": false    },    "rewriteAppHTTPProbe": true  }}

通过配置文件,蕴含以下内容:

全局设置

蕴含tracing ,是否启用istio-cni等配置项。

template

包含 istio-initistio-proxyenable-core-dump 容器模板。

policy

默认为enabled。对于Policy有以下两种可能值:

  • disabled:sidecar 注入器默认不会注入到 pod 中。增加pod模板定义中的注解 sidecar.istio.io/inject 值为 true会启用注入性能。
  • enabled:sidecar 注入器默认会注入到 pod 中。增加pod模板定义中的注解 sidecar.istio.io/inject 值为 false会禁止注入性能。

从利用容器到 Sidecar 代理的流量

既然咱们曾经分明了如何将 sidecar 容器和 init 容器注入到利用清单中,那么 sidecar 代理如何捕捉容器之间的入站和出站流量?咱们曾简要提到过,这是通过在 pod 命名空间中设置iptable规定来实现的,而规定又是由istio-init容器实现的。

istio-iptables -p PORT -u UID -g GID [-m mode] [-b ports] [-d ports] [-i CIDR] [-x CIDR] [-h]  -p: 指定重定向所有 TCP 流量的 Envoy 端口(默认为 $ENVOY_PORT = 15001)  -u: 指定未利用重定向的用户的 UID。通常,这是代理容器的 UID(默认为 $ENVOY_USER 的 uid,istio_proxy 的 uid 或 1337)  -g: 指定未利用重定向的用户的 GID。(与 -u param 雷同的默认值)  -m: 指定入站连贯重定向到 Envoy 的模式,“REDIRECT” 或 “TPROXY”(默认为 $ISTIO_INBOUND_INTERCEPTION_MODE)  -b: 逗号分隔的入站端口列表,其流量将重定向到 Envoy(可选)。应用通配符 “*” 示意重定向所有端口。为空时示意禁用所有入站重定向(默认为 $ISTIO_INBOUND_PORTS)  -d: 指定要从重定向到 Envoy 中排除(可选)的入站端口列表,以逗号格局分隔。应用通配符“*” 示意重定向所有入站流量(默认为 $ISTIO_LOCAL_EXCLUDE_PORTS)  -i: 指定重定向到 Envoy(可选)的 IP 地址范畴,以逗号分隔的 CIDR 格局列表。应用通配符 “*” 示意重定向所有出站流量。空列表将禁用所有出站重定向(默认为 $ISTIO_SERVICE_CIDR)  -x: 指定将从重定向中排除的 IP 地址范畴,以逗号分隔的 CIDR 格局列表。应用通配符 “*” 示意重定向所有出站流量(默认为 $ISTIO_SERVICE_EXCLUDE_CIDR)。  -z: 所有进入 pod/VM 的 TCP 流量应被重定向到的端口

咱们通过一个helloworld 示例我的项目,init容器执行了如下命令:

 - istio-iptables    - -p    - "15001"    - -z    - "15006"    - -u    - "1337"    - -m    - REDIRECT    - -i    - '*'    - -x    - ""    - -b    - '*'    - -d    - 15090,15021,15020

联合下面的规定,能够看出,除15090,15021,15020端口外,所有出站流量都被重定向到15001端口,所有入站流量都被重定向到15006端口。