在 Kubernetes 中快速开始

依照本文说明,在各种平台的 Kubernetes 集群上快速安装 Istio。这里无需安装 Helm,只使用基本的 Kubernetes 命令,就能设置一个预配置的 Istio demo

前置条件

  1. 下载 Istio 发布包

  2. 各平台下 Kubernetes 集群的配置:

  3. 复查 Istio 对 Pod 和服务的要求

安装步骤

  1. 使用 kubectl apply 安装 Istio 的自定义资源定义(CRD),几秒钟之后,CRD 被提交给 Kubernetes 的 API-Server:

    $ for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
    
  2. 从下列的几个演示配置中选择一个进行安装。

如果使用 mutual TLS 的宽容模式,所有的服务会同时允许明文和双向 TLS 的流量。在没有明确配置客户端进行双向 TLS 通信的情况下,客户端会发送明文流量。可以进一步阅读了解双向 TLS 中的宽容模式的相关内容。

这种方式的适用场景:

  • 已有应用的集群;
  • 注入了 Istio sidecar 的服务有和非 Istio Kubernetes 服务通信的需要;
  • 需要进行存活和就绪检测的应用;
  • Headless 服务;
  • StatefulSet

运行下面的命令即可完成这一模式的安装:

$ kubectl apply -f install/kubernetes/istio-demo.yaml

确认部署结果

  1. 确认下列 Kubernetes 服务已经部署并都具有各自的 CLUSTER-IP

    $ kubectl get svc -n istio-system
    NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                                                                                                      AGE
    istio-citadel            ClusterIP      172.21.113.238   <none>          8060/TCP,15014/TCP                                                                                                           8d
    istio-egressgateway      ClusterIP      172.21.32.42     <none>          80/TCP,443/TCP,15443/TCP                                                                                                     8d
    istio-galley             ClusterIP      172.21.137.255   <none>          443/TCP,15014/TCP,9901/TCP                                                                                                   8d
    istio-ingressgateway     LoadBalancer   172.21.229.108   158.85.108.37   80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31324/TCP,15030:31752/TCP,15031:30314/TCP,15032:30953/TCP,15443:30550/TCP   8d
    istio-pilot              ClusterIP      172.21.100.28    <none>          15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                       8d
    istio-policy             ClusterIP      172.21.83.199    <none>          9091/TCP,15004/TCP,15014/TCP                                                                                                 8d
    istio-sidecar-injector   ClusterIP      172.21.198.98    <none>          443/TCP                                                                                                                      8d
    istio-telemetry          ClusterIP      172.21.84.130    <none>          9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                       8d
    prometheus               ClusterIP      172.21.140.237   <none>          9090/TCP                                                                                                                     8d
    
  2. 确认必要的 Kubernetes Pod 都已经创建并且其 STATUS 的值是 Running

    $ kubectl get pods -n istio-system
    NAME                                      READY     STATUS      RESTARTS   AGE
    istio-citadel-5c4f467b9c-m8lhb            1/1       Running     0          8d
    istio-cleanup-secrets-1.1.0-rc.0-msbk7    0/1       Completed   0          8d
    istio-egressgateway-fbfb4865d-rv2f4       1/1       Running     0          8d
    istio-galley-7799878d-hnphl               1/1       Running     0          8d
    istio-ingressgateway-7cf9598b9c-s797z     1/1       Running     0          8d
    istio-pilot-698687d96d-76j5m              2/2       Running     0          8d
    istio-policy-55758d8898-sd7b8             2/2       Running     3          8d
    istio-sidecar-injector-5948ffdfc8-wz69v   1/1       Running     0          8d
    istio-telemetry-67d8545b68-wgkmg          2/2       Running     3          8d
    prometheus-c8d8657bf-gwsc7                1/1       Running     0          8d
    

部署应用

现在就可以部署你自己的应用,或者从 Istio 的发布包中找一个示例应用(例如 Bookinfo)进行部署了。

在使用 kubectl apply 进行应用部署的时候,如果目标命名空间已经打上了标签 istio-injection=enabledIstio sidecar injector 会自动把 Envoy 容器注入到你的应用 Pod 之中。

$ kubectl label namespace <namespace> istio-injection=enabled
$ kubectl create -n <namespace> -f <your-app-spec>.yaml

如果目标命名空间中没有打上 istio-injection 标签, 可以使用 istioctl kube-inject 命令,在部署之前手工把 Envoy 容器注入到应用 Pod 之中:

$ istioctl kube-inject -f <your-app-spec>.yaml | kubectl apply -f -

删除

删除 RBAC 权限、istio-system 命名空间及其所有资源。因为有些资源会被级联删除,因此会出现一些无法找到资源的提示,可以忽略。

  • 根据启用的 mutual TLS 模式进行删除:
$ kubectl delete -f install/kubernetes/istio-demo.yaml
  • 也可以根据需要删除 CRD:

    $ for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl delete -f $i; done