Skip to content

1. 概述

1.1 Istio 是什么?

Istio 是一种开源服务网格,可透明地分层到现有的分布式应用程序上。 Istio 的强大功能提供了一种统一且更高效的方式来保护、连接和监控服务。 Istio 是实现负载均衡、服务到服务身份验证和监控的途径 - 几乎无需更改服务代码。它为您提供:

  • 使用双向 TLS 加密、强大的基于身份的身份验证和鉴权在集群中保护服务到服务通信
  • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡
  • 使用丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制
  • 支持访问控制、限流和配额的可插入策略层和配置 API
  • 集群内所有流量(包括集群入口和出口)的自动指标、日志和链路追踪

1.2 Istio 如何工作的?

Istio 使用代理来拦截您的所有网络流量,从而根据您设置的配置允许使用一系列应用程序感知功能。

控制平面采用您所需的配置及其对服务的视图,并动态地编程代理服务器,并根据规则或环境的变化对其进行更新。

数据平面是服务之间的通信。如果没有服务网格,网络就无法理解正在发送的流量,也无法根据流量类型、流量来源或目的地做出任何决策。

Istio 支持两种数据平面模式:

  • Sidecar 模式,它会与您在集群中启动的每个 Pod 一起部署一个 Envoy 代理,或者与在虚拟机上运行的服务一同运行。
  • Ambient 模式,它使用每个节点的四层代理,并且可选地使用每个命名空间的 Envoy 代理来实现七层功能。

2. 安装

2.1 平台安装(Kind)

2.1.1 创建 Kind 集群

  1. 创建一个名为 istio-cluster 的集群:
shell
kind create cluster --name istio-cluster

--name 用于为集群指定一个名字。默认情况下,该集群将会名为 kind。

  1. 创建一个名为 istio-cluster 的集群,并使用 kind-config.yaml 文件作为配置文件:

当 Kind 创建 Kubernetes 集群(本质上是一组 Docker 容器)时,为 集群内的 containerd(容器运行时)配置代理和镜像源

创建kind-config.yaml 文件:

yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
   - role: control-plane
     extraMounts:
        - hostPath: ./certs.d
          containerPath: /etc/containerd/certs.d
   - role: worker
     extraMounts:
        - hostPath: ./certs.d
          containerPath: /etc/containerd/certs.d
containerdConfigPatches:
   - |-
      [plugins."io.containerd.grpc.v1.cri".registry]
        config_path = "/etc/containerd/certs.d"

宿主机上新建目录并放置配置文件

yaml
mkdir -p certs.d/docker.io
vim certs.d/docker.io/hosts.toml

内容如下:

yaml
server = "https://registry-1.docker.io"
[host."https://registry-1.docker.io"]
  capabilities = ["pull", "resolve"]
  [host."https://registry-1.docker.io".proxy]
    http = "http://172.17.0.1:7890"
    https = "http://172.17.0.1:7890"
    no_proxy = "localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,172.17.0.0/16,*.svc"
shell
kind create cluster --name istio-cluster --config kind-config.yaml

2.1.2 为 kind 设置操作界面

  1. 运行以下命令以部署操作界面:

    shell
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
  2. 验证操作界面已经部署并且正在运行。

    注意:如果节点容器中的pod由于镜像下载失败导致运行失败,在节点容器通过给 containerd 配置代理解决镜像下载失败问题后,再重新运行该命令。

    1.进入控制平面:

    shell
    docker exec -it istio-cluster-control-plane bash

    2.创建 systemd proxy 配置文件:

    shell
    mkdir -p /etc/systemd/system/containerd.service.d
    cat <<EOF >/etc/systemd/system/containerd.service.d/http-proxy.conf
    [Service]
    Environment="HTTP_PROXY=http://172.17.0.1:7890"
    Environment="HTTPS_PROXY=http://172.17.0.1:7890"
    Environment="NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,10.244.0.0/16,172.17.0.0/16,*.svc"
    EOF

    3.重新加载并重启 containerd:

    shell
    systemctl daemon-reexec
    systemctl daemon-reload
    systemctl restart containerd

    4.验证拉镜像:

    shell
    ctr -n k8s.io images pull docker.io/library/busybox:latest

    如果成功,会输出:

    unpacking docker.io/library/busybox:latest ...
    done
    shell
    kubectl get pod -n kubernetes-dashboard
    NAME                                         READY   STATUS    RESTARTS   AGE
    dashboard-metrics-scraper-76585494d8-zdb66   1/1     Running   0          39s
    kubernetes-dashboard-b7ffbc8cb-zl8zg         1/1     Running   0          39s
  3. 创建 ServiceAccount 和 ClusterRoleBinding 以提供对新创建的集群的管理权限访问。

    shell
    kubectl create serviceaccount -n kubernetes-dashboard admin-user
    kubectl create clusterrolebinding -n kubernetes-dashboard admin-user --clusterrole cluster-admin --serviceaccount=kubernetes-dashboard:admin-user
  4. 需要用 Bearer Token 来登录到操作界面。使用以下命令将 token 保存到变量。

    shell
    token=$(kubectl -n kubernetes-dashboard create token admin-user)

    使用 echo 命令显示 token 并复制它,以用于登录到操作界面。

    shell
    echo $token
  5. 使用 kubectl 命令行工具运行以下命令以访问操作界面:

    shell
    # 启动代理(默认只监听 127.0.0.1,也就是只能在本机访问。)
    kubectl proxy
    # 启动代理(监听所有网络接口,允许任何主机访问。)
    kubectl proxy --address=0.0.0.0 --accept-hosts='.*'
    Starting to serve on 127.0.0.1:8001

2.2 下载 Istio CLI

Istio 使用名为 istioctl 的命令行工具进行配置。下载该工具以及 Istio 示例应用程序:

shell
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.27.1
export PATH=$PWD/bin:$PATH

通过打印版本的命令来检查您是否能够运行 istioctl。 此时,Istio 尚未安装在您的集群中,因此您将看到没有 Pod 就绪。

shell
istioctl version

2.3 将 Istio 安装到你的集群上

istioctl 支持多种配置文件, 其中包含不同的默认选项,并可根据您的生产需求进行自定义。 ambient 配置文件中包含对 Ambient 模式的支持。使用以下命令安装 Istio:

shell
istioctl install --set profile=ambient --skip-confirmation

安装完成后,您将看到以下输出,表明所有组件已成功安装。

shell
 Istio core installed  
 Istiod installed
 CNI installed
 Ztunnel installed
 Installation complete

2.4 安装 Kubernetes Gateway API CRD

您将使用 Kubernetes Gateway API 来配置流量路由。

请注意,Kubernetes Gateway API CRD 不会默认安装在大多数 Kubernetes 集群上, 因此请确保在使用 Gateway API 之前已安装好这些 CRD:

shell
kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.3.0/standard-install.yaml

Released under the Apache-2.0 license.