安装
- 环境变量配置,也存在坑,中英文文档不一致,采用nodeport的部署配置方式
- 在poenshift中安装时需要注意配置自动注入,注意的配置见采坑记录.这个是通过k8s的Admission Webhook机制实现了sidecar的自动注入(envoy的实现原理)
- 需要调整istio-demo.yaml中的privileged配置,调整为true否则deployment自动注入的init阶段会产生错误,详细修改方法见采坑记录
下载安装包
- 下载istio的安装包
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.0 sh -
- 或到版本库中自选版本
https://github.com/istio/istio/releases
- 设置istio的环境变量
export ISTIO_HOME=/opt/istio
export PATH=$ISTIO_HOME/bin:$ISTIO_HOME
集群环境预设
不同的集群需要进行不同的预设配置,根据自身集群进行配置(配置地址)
- openshift集群需要配置特权模式以及anyuid的权限。并配置自动注入(可以不做自动注入的配置,如果不做自动注入需要使用istioctl的命令对接入isitio的deployment yaml进行改写,并不方便,还是建议使用自动注入)
这里注意一下,尽量不要使用中文文档,可能是中文文档更新迭代速度过慢,文档配置内容与实际对应版本的配置方式不同。会导致配置后不能达到自动注入的功能
- 为istio服务账户开放用户权限(默认情况下,openshift不允许使用用户ID 0运行容器)
$ oc adm policy add-scc-to-user anyuid -z istio-ingress-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z default -n istio-system
$ oc adm policy add-scc-to-user anyuid -z prometheus -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-egressgateway-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-citadel-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-ingressgateway-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-cleanup-old-ca-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-mixer-post-install-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-mixer-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-pilot-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-sidecar-injector-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-galley-service-account -n istio-system
$ oc adm policy add-scc-to-user anyuid -z istio-security-post-install-account -n istio-system
- 要对默认的serviceaccount添加特权模式
$ oc adm policy add-scc-to-user privileged -z default -n <target-namespace>
- 启用webhook和证书签名请求才可能使自动注入生效,需要修改集群主节点的主配置文件
默认情况下可以在主机中找到主配置文件
/etc/origin/master/master-config.yaml
在主配置文件的同级目录中创建一个名为master-config.patch
的文件
admissionConfig:
pluginConfig:
MutatingAdmissionWebhook:
configuration:
apiVersion: apiserver.config.k8s.io/v1alpha1
kubeConfigFile: /dev/null
kind: WebhookAdmission
ValidatingAdmissionWebhook:
configuration:
apiVersion: apiserver.config.k8s.io/v1alpha1
kubeConfigFile: /dev/null
kind: WebhookAdmission
在同级目录中执行命令,将配置补充道yaml中并重启对应服务
$ cp -p master-config.yaml master-config.yaml.prepatch
$ oc ex config patch master-config.yaml.prepatch -p "$(cat master-config.patch)" > master-config.yaml
$ master-restart api
$ master-restart controllers
安装步骤
安装模式
- 宽容模式:
- 适合场景:集群中只有
部分
服务需要被istio监管 - 安装命令:
$ kubectl apply -f install/kubernetes/istio-demo.yaml --k8s $ oc apply -f install/kubernetes/istio-demo.yaml --openshift
- 适合场景:集群中只有
- 严格模式:
- 适合场景:集群中
所有
的服务都需要被istio监管 - 安装命令:
$ kubectl apply -f install/kubernetes/istio-demo-auth.yaml --k8s $ oc apply -f install/kubernetes/istio-demo-auth.yaml --openshift
- 适合场景:集群中
修改部署文件
在离线环境中,istio-demo.yaml使用的镜像都需要独立提取,tag成本地镜像后修改yaml中的镜像名称,注意一点有一个镜像是通过json拼装的镜像,该镜像是docker.io/istio/proxy_init:1.2.0
- 拼装方式:
{{- if contains "/" .Values.global.proxy_init.image }}
image: "{{ .Values.global.proxy_init.image }}"
{{- else }}
image: "{{ .Values.global.hub }}/{{ .Values.global.proxy_init.image }}:{{ .Values.global.tag }}"
{{- end }}
需要把Values.global.hub替换为:<本地镜像仓库地址>/istio
还需要将Values.global.proxy.privileged修改为true开启特权模式,具体原因见下文注意事项
确认部署结果
- 确认服务都已经部署,并具有各自的cluster-ip
$ kubectl get svc -n istio-system
$ oc get svc -n istio-system
- 确认必要的pod都已经创建,切其status的值为running (其中cleanup、install节点都是安装使用的节点状态为completed)
kubectl get pods -n istio-system
oc get pods -n istio-system
环境变量
外部负载平衡器模式
- 需要先确认当前集群是否支持在外部负载平衡器的环境运行
$ kubectl get svc istio-ingressgateway -n istio-system
如果返回值中的cluster-ip存在值,则代表环境具有可用于入口网关的外部负载平衡器。如果值为或者则代表不支持外部负载平衡器,这种情况下只能选择nodeport模式
- 设置Ingress IP和端口(openshift将kubectl替换为oc)
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}')
nodeport模式
- 配置Ingress端口(openshift将kubectl替换为oc)
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}')
- 配置Ingress的IP
不同的集群的配置方式不同(配置地址)
大部分环境使用(openshift将kubectl替换为oc):
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
配置GATEWAY_URL
- GATEWAY_URL目前看是bookinfo测试项目使用的变量,实际上就是提取了服务的访问地址。后面看到Gateway再判断是否需要配置该变量,暂留。
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
注意事项
- 这里还有一个需要着重注意的地方,istio会在pod启动节点插入一个init任务,使用iptables将pod的流量全部拦截来控制pod的调度。而部分集群中,这种操作是需要特权模式的,如果不配置会出现init阶段不断地报错重启。
- 具体表现:使用
oc logs -f [podname] -c istio-init
中能看到iptables的问题istio no chain/target/match by that name
- 解决方法:修改istio-demo.yaml中的configmap内容,将Values.global.proxy.privileged修改为true开启特权模式
- 具体表现:使用