istio安装 (istio1.5安装)

istio安装,istio架构及技术

介绍

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

他们的差异如下:

istio安装,istio架构及技术

安装命令如下:

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

在最底部修改

istio安装,istio架构及技术

暴露jeager、Prometheus、grafana、kiali同样使用nodeport方式。

至此istio安装基本完成了。

istio安装,istio架构及技术

istio安装,istio架构及技术

istio安装,istio架构及技术

如果对您有帮助,记得不要忘了给个关注哦!!!#上海IT故事#

还可以关注我之前的文章:

@监控系列 Prometheus

@公司IT系统账号大统一体系

@kube-prometheus