使用 Istioctl 在 Kubernetes 中安装 Istio

使用 Istioctl 在 Kubernetes 中安装 Istio

文章目录

  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。


系统环境:

  • kubernetes 版本:1.6.6
  • istio 版本:1.4.3

参考地址:

机器分布:

IP地址 Hostname 备注
192.168.2.11 k8s-node-2-11 Master节点
192.168.2.12 k8s-node-2-12 工作节点
192.168.2.13 k8s-node-2-13 工作节点

一、下载 istio 与 istioctl 安装文件

下载安装文件:

如果因无法正常解析 github 而导致无法执行该命令,很可能是服务访问 Github 导致。所以,请更改 /etc/hosts 文件手动添加 Github DNS 映射关系,解决不能访问 Github 问题。

1$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.4.3 TARGET_ARCH=x86_64 sh

下载完成后,会看到 istio-1.4.3 文件夹,进入该文件夹可以看到如下内容:

1.
2├── bin             #istioctl 的二进制文件
3├── install         #istio 的安装文件
4├── LICENSE         #istio 许可声明文件
5├── manifest.yaml   #istio 列表清单
6├── README.md       #istio 介绍信息的 MD 文档
7├── samples         #istio 学习的示例文件
8└── tools           #istio 工具文件

二、安装配置 istioctl 工具

istioctl 是用于部署 istio 的命令行工具,可以灵活配置 istio 的安装参数然后进行安装 istio,下面介绍下如何安装配置 istioctl 工具。

1、配置 istioctl

将 istioctl 拷贝到 /usr/local/bin/ 中:

1$ cp bin/istioctl /usr/local/bin/

2、开启 istioctl 自动补全

开启 istioctl 的自动补全功能:

1## 将 tools 目录中的 istioctl.bash 拷贝到 $HOME 目录中:
2$ cp tools/istioctl.bash ~/
3
4## 在 ~/.bashrc 中添加一行下面配置
5source ~/istioctl.bash
6
7## 使配置生效
8$ source ~/.bashrc

三、查看与比较 istio 的多种安装配置方案

1、查看可用安装配置

istioctl 提供多种安装配置,使用不同的配置将安装不同的 istio 组件,来开启不同的功能,可以输入 istioctl profile list 命令查询可用的配置,例如:

1$ istioctl profile list
2
3Istio configuration profiles:
4    minimal
5    remote
6    sds
7    default
8    demo
  • minimal: 使用Istio的流量管理功能所需的最少组件集。
  • remote: 用于配置共享控制平面的多集群服务网格 multicluster mesh。
  • sds: 类似于默认配置文件,但也启用 Istio 的 SDS(秘密发现服务)。此配置文件附带默认情况下启用的其他身份验证功能(严格双向TLS)。
  • demo: 旨在展示 Istio 功能且资源需求适中的配置。适合运行 Bookinfo 应用程序和相关任务。这是随快速入门说明一起安装的配置,但是,如果您想探索更高级的任务,则可以稍后自定义配置以启用其他功能。 此配置文件可实现高级别的跟踪和访问日志记录,因此不适合进行性能测试。
  • default: 根据 IstioControlPlaneAPI 的默认设置启用组件(建议用于生产部署)。您可以通过运行命令显示默认设置 istioctl profile dump。

2、配置间的区别

上面已经知道 istio 有很多套安装配置,它们不同配置间会影响在安装 istio 时,按照不同配置来安装不同组件,主要区别是:

  • 核心组件:
default demo minimal sds remote
istio-citadel
istio-egressgateway
istio-galley
istio-ingressgateway
istio-nodeagent
istio-pilot
istio-policy
istio-sidecar-injector
istio-telemetry
  • 附加组件:
default demo minimal sds remote
Grafana
istio-tracing
kiali
prometheus

3、查看不同配置的配置参数

可以输入 istioctl profile dump 命令查看不同配置中的配置参数的设置,例如查看 demo 配置的参数,可以输入下面命令:

 1$ istioctl profile dump demo
 2
 3autoInjection:
 4  components:
 5    injector:
 6      enabled: true
 7      k8s:
 8        replicaCount: 1
 9        strategy:
10          rollingUpdate:
11            maxSurge: 100%
12            maxUnavailable: 25%
13  enabled: true
14cni:
15  enabled: false
16configManagement:
17  components:
18    galley:
19      enabled: true
20      k8s:
21        replicaCount: 1
22......()

四、安装前注意问题

在安装前需要了解一些问题,便于知道安装过程中的一些知识点。

1、isito-ingressgateway Service 类型

istio 的 values.gateways.istio-ingressgateway.type 参数是设置 istio gateway 组件的 service 中类型,它的默认值是 LoadBalancer,由于很多平台不支持 LoadBalancer,所以这里将 values.gateways.istio-ingressgateway.type 设置为 ClusterIP。

2、CNI 插件

默认情况下,Istio 会在网格中部署的 pods 中注入一个 initContainer,即 Istio-init。Istio-init 容器是用于设置从 Istio sidecar 代理的 pod 网络流量重定向。这要求网格中的 pod 拥有有足够的 Kubernetes RBAC 权限来部署 NET_ADMIN 容器。 如果 pod 拥有一定的 RBAC 权限会导致一些潜在的安全问题。

Istio CNI 插件是 Istio-init 容器的替代品,它执行相同的网络功能,但是不需要 pod 拥有一定 Kubernetes RBAC 权限。Istio CNI 插件在 Kubernetes Pod 生命周期的网络设置阶段执行 Istio Mesh Pod 流量重定向,从而消除了将 Pod 部署到 Istio Mesh 中的用户的 NET_ADMIN 功能要求。

Istio CNI 插件取代了 istio-init 容器提供的功能,所以,我们安装时候选择应用 CNI 插件。

五、安装部署 istio

接下来将安装 istio,为了后续实践不同的 istio 功能,所以这里使用功能最全的 demo 配置进行安装。

1、创建 istio 自定义配置文件

创建 istio 自定义配置文件,这里面方便定制化配置 Istio 的安装选项,这里现在主要是为了开启 CNI 插件,如下配置:

istio-control-plane.yaml

 1apiVersion: install.istio.io/v1alpha2
 2kind: IstioControlPlane
 3spec:
 4  cni:                      #开启 CNI 插件,并且配置它所在的 Namespace
 5    enabled: true
 6    components:
 7      namespace: kube-system
 8  values:
 9    cni:
10      excludeNamespaces:    #设置 CNI 插件忽略下面的 Namespace
11       - istio-system
12       - kube-system
13  unvalidatedValues:
14    cni:
15      logLevel: info

2、安装 istio

使用 itsioctl 按照下面配置参数执行 istio 的安装部署:

1$ istioctl manifest apply \
2   --set profile=demo \
3   --set values.gateways.istio-ingressgateway.type=ClusterIP \
4   -f istio-control-plane.yaml 
  • profile=demo: 使用 demo 配置。
  • values.gateways.istio-ingressgateway.type=ClusterIP: 将 gateway 组件的 service 访问类型改为 ClusterIP。

3、查看安装的 istio 组件

查看 kubernetes 中部署的 istio 组件:

 1$ kubectl get pods -n istio-system
 2
 3NAME                                      READY   STATUS    RESTARTS   AGE
 4grafana-6b65874977-n95sc                  1/1     Running   0          60s
 5istio-citadel-f78ff689-8h4lf              1/1     Running   0          60s
 6istio-egressgateway-7b6b69ddcd-xfzrq      1/1     Running   0          60s
 7istio-galley-69674cb559-dnl62             1/1     Running   0          60s
 8istio-ingressgateway-649f9646d4-d25kv     1/1     Running   0          114s
 9istio-pilot-7989874664-ldb47              1/1     Running   0          60s
10istio-policy-5cdbc47674-wvkqg             1/1     Running   1          60s
11istio-sidecar-injector-7dd87d7989-h77fz   1/1     Running   0          60s
12istio-telemetry-6dccd56cf4-hpqdz          1/1     Running   1          60s
13istio-tracing-c66d67cd9-scz24             1/1     Running   0          107s
14kiali-8559969566-dn5h2                    1/1     Running   0          60s
15prometheus-66c5887c86-dwcsr               1/1     Running   0          60s

查看 cni 插件配置:

 1$ cat /etc/cni/net.d/10-calico.conflist
 2
 3{
 4    .....
 5    {
 6      "type": "istio-cni",          #istio cni 插件
 7      "log_level": "info",
 8      "kubernetes": {
 9        "kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig",
10        "cni_bin_dir": "/opt/cni/bin",
11        "exclude_namespaces": [
12          "istio-system",
13          "kube-system"
14        ]
15      }
16    }
17  ]
18}

4、修改 istio-ingressgateway 组件

istio-ingressgateway 是 istio 中对外的入口,由于部署的机器非公网云环境,不支持 LoadBlances 模式,所以需要对网关进行一些修改。

(1)、为 istio-ingressgateway 添加 Node 亲和性

下面使用 kubectlpatch 命令来修改 istio-ingressgateway 配置,添加 Node 亲和性,让其只能部署在特定的节点上。

本人这里设置 istio-ingressgateway 组件启动在 192.168.2.12 节点上,该节点的 hostnamek8s-node-2-12,所以需要按下面配置:

 1{
 2  "spec": {
 3    "template": {
 4      "spec": {
 5        "affinity": {
 6          "nodeAffinity": {
 7            "requiredDuringSchedulingIgnoredDuringExecution": {
 8              "nodeSelectorTerms": [
 9                {
10                  "matchExpressions": [
11                    {
12                      "key": "kubernetes.io/hostname",
13                      "operator": "In",
14                      "values": [
15                        "k8s-node-2-12" 
16                      ]
17                    }
18                  ]
19                }
20              ]
21            }
22          }
23        }
24      }
25    }
26  }
27}

执行 kubectl patch 命令进行修改:

1$ kubectl patch deployment istio-ingressgateway -p '{"spec":{"template":{"spec":{"affinity":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node-2-12"]}]}]}}}}}}}' -n istio-system

(2)、修改 istio-ingressgateway 对外端口

修改 istio-ingressgateway 端口配置,添加 hostPort 端口,这样会将容器所在节点服务器的 hostPort 设置的值的端口绑定,每次访问该节点 IP + hostPort 端口就能将对应的流量代理进入 gateway 中,方便后续 istio 对访问流量执行对应访问策略。

  • 修改 istio-ingressgateway 中的 containerPort":80 端口添加 hostPort: 80 端口。
  • 修改 istio-ingressgateway 中的 containerPort":443 端口添加 hostPort: 443 端口。
  • 修改 istio-ingressgateway 中的 dnsPolicy 策略为 ClusterFirstWithHostNet
1$ kubectl patch deployment istio-ingressgateway -p '{"spec":{"template":{"spec":{"containers":[{"name":"istio-proxy","ports":[{"containerPort":80,"hostPort":80},{"containerPort":443,"hostPort":443}]}],"dnsPolicy":"ClusterFirstWithHostNet"}}}}' -n istio-system

六、运行应用进行测试

1、部署测试应用

下面将部署测试用例,需要注意的是部署的测试用例,需要按照 istio 部署规定,应用的 Service 端口 name 参数必须指定网络协议,例如 http、http2、grpc 等等。

helloworld.yaml

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: helloworld
 5  labels:
 6    app: helloworld
 7spec:
 8  type: ClusterIP
 9  ports:
10  - port: 5000
11    name: http          #告知istio使用http协议
12  selector:
13    app: helloworld
14---
15apiVersion: apps/v1
16kind: Deployment
17metadata:
18  name: helloworld-v1
19  labels:
20    version: v1
21spec:
22  replicas: 1
23  selector:         
24    matchLabels:        
25      app: helloworld   
26      version: v1       
27  template:
28    metadata:
29      labels:           #根据规则,需要设置两个标签 app 与
30        app: helloworld #- app 标签设置为应用名称 version
31        version: v1     #- version标签设置为应用版本号
32    spec:
33      containers:
34      - name: helloworld
35        image: docker.io/istio/examples-helloworld-v1
36        ports:
37        - containerPort: 5000

在 kubernetes 中部署应用:

1$ kubectl apply -f helloworld.yaml

2、部署测试应用的 itio gateway 路由规则

接下来讲配置上面示例项目的 istio 网关路由规则,方面我们进行测试。

helloworld-gateway.yaml

 1apiVersion: networking.istio.io/v1alpha3
 2kind: Gateway
 3metadata:
 4  name: helloworld-gateway
 5spec:
 6  selector:
 7    istio: ingressgateway
 8  servers:
 9  - port:
10      number: 80
11      name: http
12      protocol: HTTP
13    hosts:
14    - "*"       #指定为*则匹配全部域名
15---
16apiVersion: networking.istio.io/v1alpha3
17kind: VirtualService
18metadata:
19  name: helloworld
20spec:
21  hosts:
22  - "*"
23  gateways:
24  - helloworld-gateway
25  http:
26  - match:
27    - uri:
28        exact: /hello
29    route:
30    - destination:
31        host: helloworld
32        port:
33          number: 5000

在 kubernetes 中部署 istio gateway 路由规则:

1$ kubectl apply -f helloworld-gateway.yaml

3、输入

上面配置的网关 istio-ingressgateway 组件在 192.168.2.11 服务器上,且上面配置的 gateway 路由规则是 * 所以这里输入 网关 IP 地址与 api 路径: http://192.168.2.12/hello 进行测试示例服务是否正常运行,显示如下:

七、卸载 istio

如果想卸载 istio,则可以使用下面命令:

1$ istioctl manifest generate --set profile=demo | kubectl delete -f -

---END---


  !版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。