安装 Istio

要安装 Istio,我们需要一个运行中的 Kubernetes 集群实例。所有的云供应商都有一个管理的 Kubernetes 集群提供,我们可以用它来安装 Istio 服务网格。

我们也可以在你的电脑上使用以下平台之一在本地运行一个 Kubernetes集群。

要安装 Istio,我们需要一个运行中的 Kubernetes 集群实例。所有的云供应商都有一个管理的 Kubernetes 集群提供,我们可以用它来安装 Istio 服务网格。

我们也可以在你的电脑上使用以下平台之一在本地运行一个 Kubernetes 集群。

当使用本地 Kubernetes 集群时,确保你的计算机满足 Istio 安装的最低要求(如 16384MB 内存和 4 个 CPU)。另外,确保 Kubernetes 集群的版本是 v1.19.0 或更高。

Minikube

在这次培训中,我们将使用 Minikube 的 Hypervisor。Hypervisor 的选择将取决于你的操作系统。要安装 Minikube 和 Hypervisor,你可以按照安装说明进行。

安装了 Minikube 后,我们可以创建并启动 Kubernetes 集群。下面的命令使用 VirtualBox 管理程序启动一个 Minikube 集群。

minikube start --memory=16384 --cpus=4 --driver=virtualbox

请确保用你所使用的 Hypervisor 的名字替换 -driver=virtualbox。关于可用的选项,见下表。

标志名称 更多信息
hyperkit HyperKit
hyperv Hyper-V
kvm2 KVM
docker Docker
podman Podman
parallels Parallels
virtualbox VirtualBox
vmware VMware Fusion

为了检查集群是否正在运行,我们可以使用 Kubernetes CLI,运行 kubectl get nodes 命令。

$ kubectl get nodes
NAME       STATUS   ROLES    AGE    VERSION
minikube   Ready    master   151m   v1.19.0

注意:如果你使用 Brew 软件包管理器安装了 Minikube,你也安装了 Kubernetes CLI。

Kubernetes CLI

如果你需要安装 Kubernetes CLI,请遵循这些说明

我们可以运行 kubectl version 来检查 CLI 是否已经安装。你应该看到与此类似的输出。

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T21:51:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:23:04Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

下载 Istio

在本课程中,我们将使用 Istio 1.10.3。安装 Istio 的第一步是下载 Istio CLI(istioctl)、安装清单、示例和工具。

安装最新版本的最简单方法是使用 downloadIstio 脚本。打开一个终端窗口,打开你要下载 Istio 的文件夹,然后运行下载脚本。

$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.10.3 sh -

Istio 发行版被下载并解压到名为 istio-1.9.0 的文件夹中。为了访问 istioctl,我们应该把它添加到 path 中。

$ cd istio-1.10.3
$ export PATH=$PWD/bin:$PATH

要检查 istioctl 是否在 path 里,运行 istioctl version。你应该看到这样的输出。

$ istioctl version
no running Istio pods in "istio-system"
1.10.3

安装 Istio

Istio 支持多个配置文件(profile)。配置文件之间的区别在于所安装的组件。

$ istioctl profile list
Istio configuration profiles:
    default
    demo
    empty
    minimal
    preview
    remote

推荐用于生产部署的配置文件是 default 配置文件。我们将安装 demo 配置文件,因为它包含所有的核心组件,启用了跟踪和日志记录,并且是为了学习不同的 Istio 功能。

我们也可以从 minimal 的组件开始,以后单独安装其他功能,如 ingress 和 egress 网关。

因为我们将使用 Istio 操作员进行安装,所以我们必须先部署 Operator。

要部署 Istio Operator,请运行:

$ istioctl operator init
Using operator Deployment image: docker.io/istio/operator:1.9.0
✔ Istio operator installed
✔ Installation complete

init 命令创建了 istio-operator 命名空间,并部署了 CRD、Operator Deployment 以及 operator 工作所需的其他资源。安装完成后,Operator 就可以使用了。

要安装 Istio,我们必须创建 IstioOperator 资源,并指定我们要使用的配置配置文件。

创建一个名为 demo-profile.yaml 的文件,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: istio-system
---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: demo-istio-install
spec:
  profile: demo

我们还在文件中添加了命名空间资源,以创建 istio-system 命名空间。

我们需要做的最后一件事是创建资源:

$ kubectl apply -f demo-profile.yaml  
namespace/istio-system created
istiooperator.install.istio.io/demo-istio-install created

一旦 Operator 检测到 IstioOperator 资源,它将开始安装 Istio。整个过程可能需要5分钟左右。

为了检查安装的状态,我们可以看看 istio-system 命名空间中的Pod的状态。

$ kubectl get po -n istio-system
NAME                                    READY   STATUS    RESTARTS   AGE
istio-egressgateway-6db9994577-sn95p    1/1     Running   0          79s
istio-ingressgateway-58649bfdf4-cs4fk   1/1     Running   0          79s
istiod-dd4b7db5-nxrjv                   1/1     Running   0          111s

当所有的 Pod 都在运行时,Operator 已经完成了 Istio 的安装。

启用 sidecar 注入

正如我们在上一节中所了解的,服务网格需要与每个应用程序一起运行的 sidecar 代理。

要将 sidecar 代理注入到现有的 Kubernetes 部署中,我们可以使用 istioctl 命令中的 kube-inject 动作。

然而,我们也可以在任何 Kubernetes 命名空间上启用自动 sidecar 注入。如果我们用 istio-injection=enabled 标记命名空间,Istio 会自动为我们在该命名空间中创建的任何 Kubernetes Pod 注入 sidecar。

让我们通过添加标签来启用默认命名空间的自动 sidecar 注入。

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

要检查命名空间是否被标记,请运行下面的命令。default 命名空间应该是唯一一个启用了该值的命名空间。

$ kubectl get namespace -L istio-injection
NAME              STATUS   AGE   ISTIO-INJECTION
default           Active   32m   enabled
istio-operator    Active   27m   disabled
istio-system      Active   15m
kube-node-lease   Active   32m
kube-public       Active   32m
kube-system       Active   32m

现在我们可以尝试在 default 命名空间创建一个 Deployment,并观察注入的代理。我们将创建一个名为 my-nginx 的 Deployment,使用 nginx 镜像的单一容器。

$ kubectl create deploy my-nginx --image=nginx
deployment.apps/my-nginx created

如果我们看一下 Pod,你会发现 Pod 里有两个容器。

$ kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6b74b79f57-hmvj8   2/2     Running   0          62s

同样地,描述 Pod 显示 Kubernetes 同时创建了一个 nginx 容器和一个 istio-proxy 容器:

$ kubectl describe po my-nginx-6b74b79f57-hmvj8
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  118s  default-scheduler  Successfully assigned default/my-nginx-6b74b79f57-hmvj8 to minikube
  Normal  Pulling    117s  kubelet            Pulling image "docker.io/istio/proxyv2:1.9.0"
  Normal  Pulled     116s  kubelet            Successfully pulled image "docker.io/istio/proxyv2:1.9.0" in 1.102544635s
  Normal  Created    115s  kubelet            Created container istio-init
  Normal  Started    115s  kubelet            Started container istio-init
  Normal  Pulling    115s  kubelet            Pulling image "nginx"
  Normal  Created    78s   kubelet            Created container nginx
  Normal  Pulled     78s   kubelet            Successfully pulled image "nginx" in 36.157915646s
  Normal  Started    77s   kubelet            Started container nginx
  Normal  Pulling    77s   kubelet            Pulling image "docker.io/istio/proxyv2:1.9.0"
  Normal  Pulled     76s   kubelet            Successfully pulled image "docker.io/istio/proxyv2:1.9.0" in 1.050876635s
  Normal  Created    76s   kubelet            Created container istio-proxy
  Normal  Started    76s   kubelet            Started container istio-proxy

运行下面的命令,删除部署:

$ kubectl delete deployment my-nginx
deployment.apps "my-nginx" deleted

更新和卸载 Istio

如果我们想更新当前的安装或改变配置文件,我们将需要更新先前部署的 IstioOperator 资源。

要删除安装,我们必须删除 IstioOperator,比如说:

$ kubectl delete istiooperator -n istio-system demo-istio-install

一旦 Operator 删除了Istio,我们也可以通过运行下面的命令来删除 Operator:

$ istioctl operator remove

请确保在删除 Operator 之前先删除 IstioOperator 资源。否则,可能会有剩余的 Istio 资源。

Copyright © 2017-2022 | Distributed under CC BY 4.0 | jimmysong.io all right reserved. Updated at 2022-05-26 22:46:16

results matching ""

    No results matching ""