Istio安装

先决条件

  1. 正确安装的kubernetes集群
  2. Kubernetes集群中的Pod和Service必须满足以下要求:
    • 命名的服务端口:Service 的端口必须命名。端口名键值对必须按以下格式:name: <protocol>[-<suffix>]
    • Service关联:每个Pod必须至少属于一个Kubernetes Service,不管这个 Pod 是否对外暴露端口。如果一个 Pod 同时属于多个Kubernetes Service,那么这些 Service不能同时在一个端口号上使用不同的协议(比如:HTTP 和 TCP)。
    • 带有app和version标签(label)的Deployment:我们建议显式地给Deployment加上app和version标签。
    • 应用 UID:确保你的Pod不会以用户ID(UID)为1337的用户运行应用。
    • NET_ADMIN功能:如果你的集群执行Pod安全策略,必须给Pod配置NET_ADMIN功能。

下载istio

  1. https://github.com/istio/istio/releases中选择最新稳定版本
    1
    wget https://github.com/istio/istio/releases/download/1.10.3/istio-1.10.3-linux-amd64.tar.gz
  2. 解压下载的压缩包,并复制istioctl到/usr/local/bin目录,如下:
    1
    2
    3
    [root@dev-test01 ~]# tar -zxf istio-1.10.3-linux-amd64.tar.gz
    [root@dev-test01 ~]# cd istio-1.10.3
    [root@dev-test01 istio-1.10.3]# cp bin/istioctl /usr/local/bin

使用默认配置安装Istio

  1. 使用如下命令安装istio,安装过程如下图:
    1
    istioctl install --set values.gateways.istio-egressgateway.enabled=true --set values.gateways.istio-ingressgateway.type=NodePort
  2. 查看安装的组件pod,如下图:
  3. 给命名空间添加标签,指示Istio在部署应用的时候,自动注入Envoy sidecar  
    根据实际服务部署的命名空间添加标签,下面命令是在默认命名空间中添加标签。
    1
    kubectl label namespace default istio-injection=enabled

配置Ingress Gateway

  1. 使用外部负载均衡  
    如果环境中有使用外部负载均衡,使用下列命令进行配置ingress IP和端口。
    1
    2
    3
    4
    export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
    export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
  2. 环境中未使用外部负载均衡
    若环境未使用外部负载均衡器,需要通过Node Port访问。执行如下命令设置ingress IP和端口。
    1
    2
    3
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].nodePort}')