此文档编写日期:2023-01-17
istio客户端和服务端版本:1.16.1(截止文档编写日期的最新版本)
istio部署方式:官方客户端istioctl部署,非helm部署,部署方式介绍可以参考官方安装介绍
一:下载安装istio客户端istioctl
参考链接:官方下载地址及文档
curl -L https://istio.io/downloadIstio | sh -
此命令会根据你的系统自动去github的releases下载对应你系统的客户端版本并解压,解压后会删除原tar包。所以得到的成品就是一个istio-1.16.1目录。
我是使用Mac 进行客户端安装和部署,因为有测试预发布正式三个环境,为了避免每个环境都安装istio客户端,所以使用Mac客户端进行统一管理。
下载完成后将istio-1.16.1/bin/istioctl二进制文件移至PATH路径下。
二:配置文件编辑
istio目录中有3个目录需要关注:
bin/目录下对应istio客户端二进制文件。
manifests/目录对应istio安装的实际配置文件。
samples/目录下是官方提供的示例应用程序配置文件,istio安装完成后,可以使用通过kubectl apply -f 将示例应用程序安装至k8s集群,然后配合官方示例程序(任务)文档进行操作以便理解。
istio官方默认提供了9种配置档,可以通过istioctl profile list
进行查看。
注:由于作者有3个环境,所以针对每个环境的istioctl进行了命令alias设置,本文档中ict均代表istioctl,上图中ict profile list
实际命令为istioctl profile list
,文档后续中均不赘述。
istio中和k8s一样,默认读取~/.kube/config配置文件和k8s apiserver进行连接,如果你的kubeconfig文件路径不一致,使用istioctl --kubeconfig kubeconfig路径
或者istioctl -c kubeconfig路径
进行指定,例如作者就是使用alias ict="istioctl --kubeconfig ~/.kube/config-test"
进行环境区分。
上述9种配置档中,例如demo配置档可用于测试环境学习,default默认用于正式环境。本文档选择default配置档进行配置更改及安装。其他配置档雷同。
1:修改istio镜像地址为私有镜像地址。
配置档yaml文件在manifests/profiles/下,查看manifests/profiles/default.yaml中默认镜像下载地址。
默认镜像下载地址为docker.io,使用跳板机将以下镜像下载到本地,从新构建将时区设置为东八区上海时区,默认为UTC时间。
- istio核心官方镜像下载
docker pull docker.io/istio/install-cni:1.16.1
docker pull docker.io/istio/operator:1.16.1
docker pull docker.io/istio/pilot:1.16.1
docker pull docker.io/istio/proxyv2:1.16.1
- 编写DockerFile
目录文件如下:
需要将宿主机中上海时区文件复制至DockerFile目录中:cp /usr/share/zoneinfo/Asia/Shanghai ./
DockerFile内容如下:
通过docker build -f pilot -t 私有镜像地址/pilot:1.16.1 .
构建镜像,然后通过docker push 私有镜像地址/pilot:1.16.1
上传镜像到私有镜像仓库。
其中operator和pilot的dockerfile中需注意,要先设置USER为root权限才能进行时区文件更改,时区更改完成后需要将USER设置为1337:1337。官方默认使用1337:1337用户执行命令,可以通过harbor构建历史查看。
- 修改istio配置文件镜像地址
找到你安装的配置档文件,我安装的default档,配置档文件为manifests/profiles/default.yaml,只需在spec.values.global下添加:hub: 私有镜像地址前缀即可,注意是镜像地址前缀。
2:修改日志格式
默认日志格式参考官方文档
使用istio后,所有流量都会由Sidecar(istio-proxy)容器代理,所以istio-ingressgateway和istio-proxy的日志尤为重要,default配置档默认没有开启日志输出,demo配置档默认开启,可以通过kubectl logs 查看日志,当然也可以以挂载的方式将日志输入至其他地方,默认istio-ingressgateway和istio-proxy日志输出如下:
- 修改istio-ingressgateway和istio-proxy日志格式
修改对应配置档的yaml文件,我安装的default档,配置档文件为manifests/profiles/default.yaml,在spec.meshConfig下添加如下内容,这里是参考腾讯云istio的日志输出格式。
accessLogFile: /dev/stdout
accessLogEncoding: JSON
accessLogFormat: '
"authority": "%REQ(:AUTHORITY)%",
"bytes_received": "%BYTES_RECEIVED%",
"bytes_sent": "%BYTES_SENT%",
"downstream_local_address": "%DOWNSTREAM_LOCAL_ADDRESS%",
"downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
"duration": "%DURATION%",
"istio_policy_status": "%DYNAMIC_METADATA(istio.mixer:status)%",
"method": "%REQ(:METHOD)%",
"path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
"protocol": "%PROTOCOL%",
"request_id": "%REQ(X-REQUEST-ID)%",
"requested_server_name": "%REQUESTED_SERVER_NAME%",
"response_code": "%RESPONSE_CODE%",
"response_flags": "%RESPONSE_FLAGS%",
"route_name": "%ROUTE_NAME%",
"start_time": "%START_TIME%",
"upstream_cluster": "%UPSTREAM_CLUSTER%",
"upstream_host": "%UPSTREAM_HOST%",
"upstream_local_address": "%UPSTREAM_LOCAL_ADDRESS%",
"upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
"upstream_transport_failure_reason": "%UPSTREAM_TRANSPORT_FAILURE_REASON%",
"user_agent": "%REQ(USER-AGENT)%",
"x_forwarded_for": "%REQ(X-FORWARDED-FOR)%"'
修改后的istio-ingressgateway和istio-proxy日志输出如下:
3:istioingress Service相关
- Service类型选择
istioingress默认Service类型为LoadBalancer,但是大部分内网测试环境没有LoadBalancer,使用NodePort方式进行访问,需要将Service更改为NodePort类型。否则Service EXTERNAL-IP 字段将为Pending,虽然通过NodePort也可以访问,如下图
修改对应配置档的yaml文件,我安装的default档,配置档文件为manifests/profiles/default.yaml,将spec.values.gateways.istio-ingressgateway.type修改为NodePort即可。
- 获取访问者源地址
默认设置是无法获取访问者源地址的,但是很多实际情况下,我们都会希望获取到访问者的源地址以便分析,设置对应配置档中istio-ingressgateway的service中externalTrafficPolicy为Local即可。即添加spec.values.gateways.istio-ingressgateway.externalTrafficPolicy为Local。
需要注意的是,设置为Local后,外部流量只能通过istio-ingressgateway Pod所在Node节点进入,无法从其他Node节点进入,也就是说,如果istio-ingressgateway Deployment 副本只有一个,将无法实现负载均衡,建议Pod数量大于2个并设置亲和性,避免2个副本同时落在同一Node上。
上述Service设置图如下:
三:部署
- 安装
ict install --manifests=manifests/
需要指定manifests目录路径,如果不指定,将使用默认配置。如果需要指定demo配置档,添加 --set profile=demo即可。
- 自动注入 Envoy 边车代理
选择你需要自动注入边车代理的命名空间,例如我需要给default命名空间注入,输入以下命令即可:
kubectl label namespace default istio-injection=enabled
注:命令空间已存在的Pod不会自动注入,新增Pod才会注入,如果需要给已存在Pod自动注入,Delete Pod 重建即可。
- 资源查看
istio默认安装在istio-system命名空间中
- 配置更新
如果更改了manifests/目录中的文件,需要更新,例如将Service类型更改为LoadBalancer,通过以下命令即可更新。
ict upgrade --manifests=manifests/
- 卸载
如果你需要完全卸载istio,输入以下命令即可完全卸载,卸载完成后,会保留istio-system命名空间,已注入边车代理的Pod销毁后重建即可。
ict uninstall --purge
建议多查看官方文档,官方文档已支持中文。
标签:Isito1.16,部署,配置,istio,manifests,default,镜像,docker From: https://www.cnblogs.com/big-cousin/p/17057848.html