
介绍
istio的安装方式 官方推荐使用istioctl,Helm 的安装方法已被弃用。
要开始使用 Istio,只需遵循以下三个步骤:
搭建平台
*载下** Istio
安装 Istio
搭建平台
在安装 Istio 之前,需要一个运行着 Kubernetes 的兼容版本的 cluster。如果还没有Kubernetes集群的可以关注私信我,回复ansible-k8s即可。整个过程全自动。
Istio 1.4.5 已经在 Kubernetes 版本1.16.6 中测试过。
如果已经安装完istio可跳过本节。
*载下**istio
wget https://github.com/istio/istio/releases/download/1.4.5/istio-1.4.5-linux.tar.gz
tar -xf istio-1.4.5-linux.tar.gz
tree -L 2
├── bin
│ └── istioctl
├── cloud-native-istio
│ ├── authors
│ ├── chapter-files
│ ├── install
│ ├── LICENSE
│ ├── qrcode.png
│ └── README.md
├── cni.yaml
├── install
│ ├── consul
│ ├── gcp
│ ├── kubernetes
│ ├── README.md
│ └── tools
├── LICENSE
├── manifest.yaml
├── README.md
├── samples
│ ├── bookinfo
│ ├── certs
│ ├── custom-bootstrap
│ ├── external
│ ├── fortio
│ ├── health-check
│ ├── helloworld
│ ├── httpbin
│ ├── https
│ ├── kubernetes-blog
│ ├── multicluster
│ ├── operator
│ ├── rawvm
│ ├── README.md
│ ├── security
│ ├── sleep
│ ├── tcp-echo
│ └── websockets
└── tools
├── convert_RbacConfig_to_ClusterRbacConfig.sh
├── dump_kubernetes.sh
├── _istioctl
├── istioctl.bash
└── packaging
安装目录包含如下内容:
- install/kubernetes 目录下,有 Kubernetes 相关的 YAML 安装文件
- samples/ 目录下,有示例应用程序
- bin/ 目录下,包含 istioctl 的客户端文件。istioctl 工具用于手动注入 Envoy sidecar 代理
cp bin/istioctl /usr/bin/istioctl
cp tools/istioctl.bash /root/istioctl.bash && source /root/istioctl.bash
istioctl version
client version: 1.4.5
control plane version: 1.4.5
data plane version: 1.4.5 (7 proxie
安装istio
istio 支持以下几种模式安装
istioctl profile list
Istio configuration profiles:
default
demo
minimal
remote
sds
也可以使用istio生成yaml文件直接安装:
istioctl profile dump default > 1.yaml
istioctl profile dump demo > 2.yaml
istioctl profile diff 1.yaml 2.yaml
他们的差异如下:

安装命令如下:
istioctl manifest apply --set profile=demo \
--set cni.enabled=true \
--set cni.components.cni.enabled=true \
--set values.cni.logLevel=info \
--set cni.components.cni.namespace=kube-system \
--set values.gateways.istio-ingressgateway.type=ClusterIP \
--set values.gateways.istio-ingressgateway.resources.requests.cpu=1000m \
--set values.gateways.istio-ingressgateway.resources.requests.memory=1Gi \
--set values.gateways.istio-ingressgateway.resources.limits.cpu=2000m \
--set values.gateways.istio-ingressgateway.resources.limits.memory=2Gi \
--set values.global.disablePolicyChecks=false \
--set values.pilot.policy.enabled=true \
--set values.global.proxy.accessLogFile="/dev/stdout"
注意:记得每次修改都要全部参数带上,不然就是default部署。建议还是到处yaml管理或helm
Istio CNI 插件
默认情况下,Istio 会在网格中部署的 pods 上注入一个 initContainer:istio-init。 istio-init 容器会将 pod 的网络流量劫持到 Istio sidecar 代理上。 这需要用户或部署 pods 的 Service Account 具有足够的部署 NET_ADMIN 容器的 Kubernetes RBAC 权限。 Istio 用户权限的提升,对于某些组织的安全政策来说,可能是难以接受的。 Istio CNI 插件就是一个能够替代 istio-init 容器来实现相同的网络功能但却不需要 Istio 用户申请额外的 Kubernetes RBAC 授权的方案。
Istio CNI 插件会在 Kubernetes pod 生命周期的网络设置阶段完成 Istio 网格的 pod 流量转发设置工作,因此用户在部署 pods 到 Istio 网格中时,不再需要配置 NET_ADMIN 功能需求了。 Istio CNI 插件代替了 istio-init 容器所实现的功能。
前提条件
安装支持 CNI 的 Kubernetes 集群,并且 kubelet 使用 --network-plugin=cni 参数启用 CNI 插件。AWS EKS、Azure AKS 和 IBM Cloud IKS 集群具备这一功能。Google Cloud GKE 集群需要启用网络策略功能,以让 Kubernetes 配置为 network-plugin=cni。OpenShift 默认启用了 CNI。
Kubernetes 需要启用 ServiceAccount 准入控制器。Kubernetes 文档中强烈建议所有使用 ServiceAccounts 的 Kubernetes 安装实例都启用该控制器
部署完成后,查看各组件状态:
kubectl -n istio-system get pod
NAME READY STATUS RESTARTS AGE
grafana-6b65874977-7p28g 1/1 Running 0 16m
istio-citadel-7bcc69d486-blqq2 1/1 Running 0 63m
istio-egressgateway-6b6f694c97-qqzqb 1/1 Running 0 16m
istio-galley-6cf8f58d7b-tlrdq 1/1 Running 0 16m
istio-ingressgateway-8c9c9c9f5-vd57x 1/1 Running 0 16m
istio-pilot-c6dbc54b9-5g4bt 1/1 Running 0 16m
istio-policy-66c4cf95c5-6dl96 1/1 Running 0 16m
istio-sidecar-injector-79ccdf54c4-hxzmk 1/1 Running 0 63m
istio-telemetry-7bf96cb54f-bsbn6 1/1 Running 0 16m
istio-tracing-c66d67cd9-gjtnc 1/1 Running 0 16m
kiali-8559969566-rqr8f 1/1 Running 0 16m
prometheus-66c5887c86-wm4cd 1/1 Running 0 63m
kubectl -n kube-system get pod -l k8s-app=istio-cni-node
NAME READY STATUS RESTARTS AGE
istio-cni-node-5wfm6 2/2 Running 0 21m
istio-cni-node-fznwq 2/2 Running 0 21m
istio-cni-node-n6npc 2/2 Running 0 21m
istio-cni-node-xp4rw 2/2 Running 0 21m
可以看到 cni 插件已经安装成功,查看配置是否已经追加到 CNI 插件链的末尾:
cat /etc/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "istio-cni",
"log_level": "info",
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig",
"cni_bin_dir": "/opt/cni/bin",
"exclude_namespaces": [
"istio-system"
]
}
}
]
}
默认情况下除了 istio-system namespace 之外,istio cni 插件会监视其他所有 namespace 中的 Pod,然而这并不能满足我们的需求,更严谨的做法是让 istio CNI 插件至少忽略 kube-system、istio-system 这两个 namespace,怎么做呢?
也很简单,还记得之前提到的 IstioControlPlane API 吗?可以直接通过它来覆盖之前的配置,只需要创建一个 IstioControlPlane CRD 就可以了。例如:
cat cni.yaml
apiVersion: install.istio.io/v1alpha2
kind: IstioControlPlane
spec:
cni:
enabled: true
components:
namespace: kube-system
values:
cni:
excludeNamespaces:
- istio-system
- kube-system
- monitoring
unvalidatedValues:
cni:
logLevel: info
istioctl manifest apply --set profile=demo \
--set cni.enabled=true \
--set cni.components.cni.enabled=true \
--set values.cni.logLevel=info \
--set cni.components.cni.namespace=kube-system \
--set values.gateways.istio-ingressgateway.type=ClusterIP \
--set values.gateways.istio-ingressgateway.resources.requests.cpu=1000m \
--set values.gateways.istio-ingressgateway.resources.requests.memory=1Gi \
--set values.gateways.istio-ingressgateway.resources.limits.cpu=2000m \
--set values.gateways.istio-ingressgateway.resources.limits.memory=2Gi \
--set values.global.disablePolicyChecks=false \
--set values.pilot.policy.enabled=true \
--set values.global.proxy.accessLogFile="/dev/stdout" \
- f cni.yaml
删除所有的 istio-cni-node Pod:
kubectl -n kube-system delete pod -l k8s-app=istio-cni-node
再次查看 CNI 插件链的配置:
cat /etc/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
},
{
"type": "istio-cni",
"log_level": "info",
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/ZZZ-istio-cni-kubeconfig",
"cni_bin_dir": "/opt/cni/bin",
"exclude_namespaces": [
"istio-system",
"kube-system",
"monitoring"
]
}
}
]
}
暴露gateway为nodeport模式
kubectl -n istio-system edit svc istio-ingressgateway
在最底部修改

暴露jeager、Prometheus、grafana、kiali同样使用nodeport方式。
至此istio安装基本完成了。



如果对您有帮助,记得不要忘了给个关注哦!!!#上海IT故事#
还可以关注我之前的文章:
@监控系列 Prometheus
@公司IT系统账号大统一体系
@kube-prometheus