点击 "阅读原文" 可以获得更好的阅读体验。

前言

Istio 一直处于快速迭代更新的过程中,它的部署方法也在不断更新,之前我在 1.0 版本中介绍的安装方法,对于最新的 1.4 版本已经不适用了。以后主流的部署方式都是用 istioctl 进行部署,helm 可以渐渐靠边站了~~

在部署 Istio 之前,首先需要确保 Kubernetes 集群(kubernetes 版本建议在 1.13 以上)已部署并配置好本地的 kubectl 客户端。

01

Kubernetes 环境准备

为了快速准备 kubernetes 环境,我们可以使用 sealos 来部署,步骤如下:

前提条件

  • 下载kubernetes 离线安装包[1]

  • 下载最新版本 sealos[2]

  • 务必同步服务器时间

  • 主机名不可重复

安装 kubernetes 集群

$ sealos init --master 192.168.0.2 \--node 192.168.0.3 \--node 192.168.0.4 \--node 192.168.0.5 \--user root \--passwd your-server-password \--version v1.16.3 \--pkg-url /root/kube1.16.3.tar.gz

检查安装是否正常:

$ kubectl get nodeNAME       STATUS   ROLES    AGE   VERSION
sealos01   Ready    master   18h   v1.16.3
sealos02   Ready    <none>   18h   v1.16.3
sealos03   Ready    <none>   18h   v1.16.3
sealos04   Ready    <none>   18h   v1.16.3

02

下载 Istio 部署文件

你可以从 GitHub 的 release[3] 页面下载 istio,或者直接通过下面的命令下载:

$ curl -L https://istio.io/downloadIstio | sh -

下载完成后会得到一个 istio-1.4.2 目录,里面包含了:

  • install/kubernetes : 针对 Kubernetes 平台的安装文件

  • samples : 示例应用

  • bin : istioctl 二进制文件,可以用来手动注入 sidecar proxy

进入 istio-1.4.2 目录。

$ cd istio-1.4.2$ tree -L 1 ./
./
├── bin
├── demo.yaml
├── install
├── LICENSE
├── manifest.yaml
├── README.md
├── samples
└── tools4 directories, 4 files

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

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

开启 istioctl 的自动补全功能

bash

将 tools 目录中的 istioctl.bash 拷贝到 $HOME 目录中:

$ cp tools/istioctl.bash ~/

在 ~/.bashrc 中添加一行:

source ~/istioctl.bash

应用生效:

$ source ~/.bashrc

zsh

将 tools 目录中的 _istioctl 拷贝到 $HOME 目录中:

$ cp tools/_istioctl ~/

在 ~/.zshrc 中添加一行:

source ~/_istioctl

应用生效:

$ source ~/.zshrc

03

部署 Istio

istioctl 提供了多种安装配置文件,可以通过下面的命令查看:

$ istioctl profile listIstio configuration profiles:minimalremotesdsdefaultdemo

它们之间的差异如下:

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

其中标记 X 表示该安装该组件。

如果只是想快速试用并体验完整的功能,可以直接使用配置文件 demo 来部署。

在正式部署之前,需要先说明两点:

Istio CNI Plugin

当前实现将用户 pod 流量转发到 proxy 的默认方式是使用 privileged 权限的 istio-init 这个 init container 来做的(运行脚本写入 iptables),需要用到 NET_ADMIN capabilities。对 linux capabilities 不了解的同学可以参考我的 Linux capabilities 系列。

Istio CNI 插件的主要设计目标是消除这个 privileged 权限的 init container,换成利用 Kubernetes CNI 机制来实现相同功能的替代方案。具体的原理就是在 Kubernetes CNI 插件链末尾加上 Istio 的处理逻辑,在创建和销毁 pod 的这些 hook 点来针对 istio 的 pod 做网络配置:写入 iptables,让该 pod 所在的 network namespace 的网络流量转发到 proxy 进程。

详细内容请参考官方文档[4]

使用 Istio CNI 插件来创建 sidecar iptables 规则肯定是未来的主流方式,不如我们现在就尝试使用这种方法。

Kubernetes 关键插件(Critical Add-On Pods)

众所周知,Kubernetes 的核心组件都运行在 master 节点上,然而还有一些附加组件对整个集群来说也很关键,例如 DNS 和 metrics-server,这些被称为关键插件。一旦关键插件无法正常工作,整个集群就有可能会无法正常工作,所以 Kubernetes 通过优先级(PriorityClass)来保证关键插件的正常调度和运行。要想让某个应用变成 Kubernetes 的关键插件,只需要其 priorityClassName 设为 system-cluster-critical 或 system-node-critical,其中 system-node-critical 优先级最高。

注意:关键插件只能运行在 kube-system namespace 中!

详细内容可以参考官方文档[5]

接下来正式安装 istio,命令如下:

$ istioctl manifest apply --set profile=demo \--set cni.enabled=true --set cni.components.cni.namespace=kube-system \--set values.gateways.istio-ingressgateway.type=ClusterIP

istioctl 支持两种 API:

  • IstioControlPlane API[6]

  • Helm API[7]

在上述安装命令中,cni 参数使用的是 IstioControlPlane API,而 values.* 使用的是 Helm API。

部署完成后,查看各组件状态:

$ kubectl -n istio-system get podNAME                                      READY   STATUS    RESTARTS   AGE
grafana-6b65874977-8psph                  1/1     Running   0          36s
istio-citadel-86dcf4c6b-nklp5             1/1     Running   0          37s
istio-egressgateway-68f754ccdd-m87m8      0/1     Running   0          37s
istio-galley-5fc6d6c45b-znwl9             1/1     Running   0          38s
istio-ingressgateway-6d759478d8-g5zz2     0/1     Running   0          37s
istio-pilot-5c4995d687-vf9c6              0/1     Running   0          37s
istio-policy-57b99968f-ssq28              1/1     Running   1          37s
istio-sidecar-injector-746f7c7bbb-qwc8l   1/1     Running   0          37s
istio-telemetry-854d8556d5-6znwb          1/1     Running   1          36s
istio-tracing-c66d67cd9-gjnkl             1/1     Running   0          38s
kiali-8559969566-jrdpn                    1/1     Running   0          36s
prometheus-66c5887c86-vtbwb               1/1     Running   0          39s
$ kubectl -n kube-system get pod -l k8s-app=istio-cni-nodeNAME                   READY   STATUS    RESTARTS   AGE
istio-cni-node-k8zfb   1/1     Running   0          10m
istio-cni-node-kpwpc   1/1     Running   0          10m
istio-cni-node-nvblg   1/1     Running   0          10m
istio-cni-node-vk6jd   1/1     Running   0          10m

可以看到 cni 插件已经安装成功,查看配置是否已经追加到 CNI 插件链的末尾:

$ cat /etc/cni/net.d/10-calico.conflist{"name": "k8s-pod-network","cniVersion": "0.3.1","plugins": [...{"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-systemistio-system 这两个 namespace,怎么做呢?

也很简单,还记得之前提到的 IstioControlPlane API 吗?可以直接通过它来覆盖之前的配置,只需要创建一个 IstioControlPlane CRD 就可以了。例如:

$catcni.yamlapiVersion:install.istio.io/v1alpha2
kind:IstioControlPlane
spec:cni:enabled:truecomponents:namespace:kube-systemvalues:cni:excludeNamespaces:-istio-system-kube-system-monitoringunvalidatedValues:cni:logLevel:info
$ istioctl manifest apply -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-calico.conflist{"name": "k8s-pod-network","cniVersion": "0.3.1","plugins": [...{"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"]}}]
}

04

暴露 Dashboard

这个没什么好说的,通过 Ingress Controller 暴露就好了,可以参考我以前写的 Istio 1.0 部署。如果使用 Contour 的可以参考我的另一篇文章:Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量。

这里我再介绍一种新的方式,istioctl 提供了一个子命令来从本地打开各种 Dashboard:

$ istioctl dashboard --helpAccess to Istio web UIsUsage:istioctl dashboard [flags]istioctl dashboard [command]Aliases:dashboard, dash, dAvailable Commands:controlz    Open ControlZ web UIenvoy       Open Envoy admin web UIgrafana     Open Grafana web UIjaeger      Open Jaeger web UIkiali       Open Kiali web UIprometheus  Open Prometheus web UIzipkin      Open Zipkin web UI

例如,要想在本地打开 Grafana 页面,只需执行下面的命令:

$ istioctl dashboard grafana
http://localhost:36813

咋一看可能觉得这个功能很鸡肋,我的集群又不是部署在本地,而且这个命令又不能指定监听的 IP,在本地用浏览器根本打不开呀!其实不然,你可以在本地安装 kubectl 和 istioctl 二进制文件,然后通过 kubeconfig 连接到集群,最后再在本地执行上面的命令,就可以打开页面啦,开发人员用来测试是不是很方便?Windows 用户当我没说。。。

05

暴露 Gateway

为了暴露 Ingress Gateway,我们可以使用 HostNetwork 模式运行,但你会发现无法启动 ingressgateway 的 Pod,因为如果 Pod 设置了 HostNetwork=true,则 dnsPolicy 就会从 ClusterFirst 被强制转换成 Default。而 Ingress Gateway 启动过程中需要通过 DNS 域名连接 pilot 等其他组件,所以无法启动。

我们可以通过强制将 dnsPolicy 的值设置为 ClusterFirstWithHostNet 来解决这个问题,详情参考:Kubernetes DNS 高阶指南。

修改后的 ingressgateway deployment 配置文件如下:

apiVersion:extensions/v1beta1
kind:Deployment
metadata:name:istio-ingressgatewaynamespace:istio-system...
spec:...template:metadata:...spec:affinity:nodeAffinity:...requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key:kubernetes.io/hostnameoperator:Invalues:-192.168.0.4# 假设你想调度到这台主机上...dnsPolicy:ClusterFirstWithHostNethostNetwork:truerestartPolicy:Always...

接下来我们就可以在浏览器中通过 Gateway 的 URL 来访问服务网格中的服务了。后面我会开启一系列实验教程,本文的所有步骤都是为后面做准备,如果想跟着我做后面的实验,请务必做好本文所述的准备工作。

脚注

[1]

kubernetes 离线安装包: http://store.lameleg.com/

[2]

最新版本sealos: https://github.com/fanux/sealos/releases

[3]

release: https://github.com/istio/istio/releases/tag/1.4.2

[4]

官方文档: https://istio.io/docs/setup/additional-setup/cni/

[5]

官方文档: https://v1-16.docs.kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/

[6]

IstioControlPlane API: https://istio.io/docs/reference/config/istio.operator.v1alpha12.pb/

[7]

Helm API: https://istio.io/docs/reference/config/installation-options/

你可能还喜欢

点击下方图片即可阅读

让你的网站用上炫酷的中文字体

云原生是一种信仰 ????

码关注公众号

后台回复◉图谱◉领取史上最强 Kubernetes 知识图谱

点击 "阅读原文" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️

云原生服务网格 Istio 1.4 部署指南相关推荐

  1. 云原生服务网格Istio:原理、实践、架构与源码解析

    华为云原生团队600多页的Istio实战精华总结,云原生服务网格Istio:原理.实践.架构与源码解析的电子书. 图书介绍 <云原生服务网格Istio:原理.实践.架构与源码解析>分为原理 ...

  2. 华为22级专家十年心血终成云原生服务网格进阶实战文档,是真的6

    前言 有人调侃我们说: 程序员不如送外卖.送外卖是搬运食物,自己是搬运代码,都不产出新的东西-- 透支体力,又消耗健康,可替代性极强,30岁之后就要面临被优化的危险-- 想跳槽,但是更高的平台难进,同 ...

  3. 精彩分享 | 欢乐游戏 Istio 云原生服务网格三年实践思考

    作者 吴连火,腾讯游戏专家开发工程师,负责欢乐游戏大规模分布式服务器架构.有十余年微服务架构经验,擅长分布式系统领域,有丰富的高性能高可用实践经验,目前正带领团队完成云原生技术栈的全面转型. 导语 欢 ...

  4. 中秋征文 | 【云原生之Docker】使用docker部署内网穿透工具FRP

    中秋征文 | [云原生之Docker]使用docker部署内网穿透工具FRP 一.卷首语 二.FRP介绍 1.frp简介 2.frp支持的系统 3.本次frp部署目的 三.检查本地docker状态 1 ...

  5. 【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(下)

    目录 一.istio 核心资源解读 1.1 Gateway 总结: 1.2 VirtualService 1.2.1 VirtualService 主要由以下部分组成 1.2.2 virtualser ...

  6. 云原生之在kubernetes环境下部署wordpress

    云原生之在kubernetes环境下部署wordpress 一.wordpress介绍 1.wordpress简介 2.wordpress特点 二.kubernetes集群介绍 1.k8s简介 2.k ...

  7. 云原生核心技术之Istio服务网格核心理论概念(一)

    Istio服务网格核心理论概念 文章目录 Istio服务网格核心理论概念 1.Service Mesh基本概念 1.1.什么是Service Mesh服务网格 1.2.服务网格的特点 1.3.服务网格 ...

  8. 阿里 双11 同款流控降级组件 Sentinel Go 正式 GA,助力云原生服务稳稳稳

    作者 | 赵奕豪(宿何)  Sentinel 开源项目负责人 来源|阿里巴巴云原生公众号 前言 微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间 ...

  9. 阿里 双11 同款流控降级组件 Sentinel Go 正式GA,云原生服务稳稳稳

    简介:微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战. 作者 | 赵奕豪(宿何)   ...

  10. 数据库降级_阿里 双11 同款流控降级组件 Sentinel Go 正式GA,云原生服务稳稳稳...

    简介:微服务的稳定性一直是开发者非常关注的话题.随着业务从单体架构向分布式架构演进以及部署方式的变化,服务之间的依赖关系变得越来越复杂,业务系统也面临着巨大的高可用挑战. 作者 | 赵奕豪(宿何) S ...

最新文章

  1. C语言数据类型:联合(union)
  2. android ViewPager动画的实现原理及效果
  3. Java学习lesson 02
  4. node.js HelloWord
  5. oracle中的tx锁影响查询吗,如何找到TM锁对应的TX锁?
  6. python读取配置文件 ConfigParser
  7. 让美团、京东、搜狐都说好的数据仓库,牛在哪?
  8. [转]Java web 开发 获取用户ip
  9. 8. 大型网站架构演化
  10. 设计模式(五) 注解方式实现AOP
  11. Python第3次作业
  12. 华为OLT(MA5680T)查看光猫光衰
  13. 联想计算机不能使用ghost,联想电脑不能GHOST的解决方法
  14. 如何彻底的卸载anaconda(包括配置文件)
  15. 【系统分析师之路】2016年系统分析师上午综合知识历年真题
  16. Java版Word开发工具Aspose.Words功能解析:查找和替换Word文档中的文本
  17. Dialog的高冷用法
  18. 如何使用 IntelliJ IDEA中配置PHP开发环境 及项目搭建
  19. git 查看/修改用户名、密码
  20. 电容的电抗|X|,总阻抗|Z|和等效电阻R

热门文章

  1. 做了个网页版的 五笔跟打器: 玫枫跟打器
  2. Blockstack: A Global Naming and Storage System Secured by Blockchains
  3. pyqt5-事件机制
  4. Nacos 中配置 Map 类型,不香
  5. python xgboost建模过程_机器学习——XGBoost大杀器,XGBoost模型原理,XGBoost参数含义...
  6. Python第四天——requests实战
  7. 利用TODA进行ORACLE数据快捷导入导出
  8. SPN线性密码分析【附code】
  9. 【线性代数笔记】正定矩阵及其性质
  10. Excel求和公式的几种用法