原文链接:Istio 1.4 部署指南

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

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

1. Kubernetes 环境准备

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

前提条件

安装 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 node

NAME       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

2. 下载 Istio 部署文件

你可以从 GitHub 的 release 页面下载 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
└── tools 4 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

3. 部署 Istio

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

$ istioctl profile list

Istio configuration profiles:
minimal
remote
sds
default
demo

它们之间的差异如下:

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 进程。

详细内容请参考官方文档

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

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

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

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

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

接下来正式安装 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:

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

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

$ kubectl -n istio-system get pod

NAME                                      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-node

NAME                   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 就可以了。例如:

$ 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 -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"
]
}
}
]
}

4. 暴露 Dashboard

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

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

$ istioctl dashboard --help

Access to Istio web UIs

Usage:
istioctl dashboard [flags]
istioctl dashboard [command] Aliases:
dashboard, dash, d Available Commands:
controlz Open ControlZ web UI
envoy Open Envoy admin web UI
grafana Open Grafana web UI
jaeger Open Jaeger web UI
kiali Open Kiali web UI
prometheus Open Prometheus web UI
zipkin Open Zipkin web UI

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

$ istioctl dashboard grafana
http://localhost:36813

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

5. 暴露 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-ingressgateway
namespace: istio-system
...
spec:
...
template:
metadata:
...
spec:
affinity:
nodeAffinity:
...
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- 192.168.0.4 # 假设你想调度到这台主机上
...
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
restartPolicy: Always
...

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

微信公众号

扫一扫下面的二维码关注微信公众号,在公众号中回复◉加群◉即可加入我们的云原生交流群,和孙宏亮、张馆长、阳明等大佬一起探讨云原生技术

Istio 1.4 部署指南的更多相关文章

  1. 首发福利!全球第一开源ERP Odoo系统架构部署指南 电子书分享

    引言 Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块.Odoo适用于各种规 ...

  2. [转]Nginx反向代理和负载均衡部署指南

    Nginx反向代理和负载均衡部署指南   1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最 ...

  3. NTP 集群简略部署指南

    NTP 集群简略部署指南 by 无若 1. NTP 简介 网络时间协议(英语:Network Time Protocol,简称NTP)是在数据网络潜伏时间可变的计算机系统之间通过分组交换进行时钟同步的 ...

  4. Web项目部署指南

    Web项目部署指南 本文记录了部署Vue项目到阿里云服务器上的过程,其中云服务器的操作系统是CentOS 7,Web服务器用的是nginx.因为项目涉及发送异步请求,而由Flask编写的后端应用监听的 ...

  5. docker在CentOS7下部署指南

    docker只支持CentOS7.x系统,所以近期根据docker官网指南自己搭建了一套,供大家参考. 1.部署Centos7.x系统,查看系统版本. 2.执行 sudo yum update 更新到 ...

  6. RabbitMQ生产部署指南

    像RabbitMQ这样的数据服务通常有许多可调参数.一些配置对开发有很大的意义,但并不适合生产,本指南旨在为此提供帮助 虚拟主机 例如,在单租户环境中,当您的RabbitMQ集群专门为生产中的单个系统 ...

  7. Istio 1.1部署实践

    前提条件 正确安装配置Kubernetes集群 CentOS Linux release 7.5.1804 安装 下载istio 1.1版本 [root@vm157 ~]# wget https:// ...

  8. ELK+KAFKA安装部署指南

    一.ELK 背景 通常,日志被分散的储存不同的设备上.如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志.这样是不是感觉很繁琐和效率低下.当务之急我们使用集中化的日志管理,例如: ...

  9. FastDFS 单机部署指南

    简介 FastDFS是一个开源的分布式文件系统,官方介绍有详细的介绍,不多赘述.本文主要是FastDFS的搭建及采坑指南. Step By Step Guide 系统 阿里云ECS Ubuntu 16 ...

随机推荐

  1. open_basedir restriction in effect,解决php引入文件权限问题 解决方法

    如下: 出现问题的原因: 查看问题描述以及资料,发现是php open_basedir 配置的问题,PHP不能引入其授权目录上级及其以上的文件: 一般情况下是不会出现这种问题的,之所以出现这个问题绝大 ...

  2. 【AMAD】schema -- 使用pythonic的方式进行schema验证

    动机 简介 用法 个人评分 动机 验证数据是否符合规范是很有用的,比如: 用于单元测试 用于验证用户提交的数据是否合法 简介 schema1是一个用来验证python数据结构的库. 可以用来验证诸如: ...

  3. mysql数据的备份

    一.备份方式 1.备份:逻辑备份(mysqldump,mydumper).物理备份(xtrabackup.tar.cp.rsync)    2.冗余:主备模式.数据库集群 二.备份对象 1.数据(库. ...

  4. 前端数据Mock

    参考链接:https://www.clloz.com/programming/front-end/js/2019/05/10/data-mock/?utm_medium=hao.caibaojian. ...

  5. 1. centos7 的安装

    选择上海时间 我们选择桌面版 选择手动配置分区 选择标准分区 修改主机名 开始安装 设置密码 设置用户名 接下来等待安装完 同样的操作再安装3台机器!!这里不多赘述. 安装完之后就重启 接下来给不同机 ...

  6. java 统计素数个数问题

    题目:判断101-200之间有多少个素数,并输出所有素数. 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. package Study ...

  7. ThreadPoolExecutor的重要参数

    一.ThreadPoolExecutor的重要参数 1.corePoolSize:核心线程数         * 核心线程会一直存活,及时没有任务需要执行         * 当线程数小于核心线程数时 ...

  8. Storm本地启动拓扑报错:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout

    问题描述: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology ...

  9. Unity VR-播放demo模型后无法移动视角

    资源源于:小意思VR 唉..可怜一下自己,这个问题百度google也不知道怎么搜,没搜出来,在群里问出来的. 当时感觉自己Unity有问题..(就是因为自己啥也不会看不懂) 按右键.或者WASD视角都 ...

  10. <<C++ Primer>> 第 6 章 函数

    术语表 第 6 章 函数 二义性调用(ambiguous call): 是一种编译时发生的错误,造成二义性调用的原因时在函数匹配时两个或多个函数提供的匹配一样好,编译器找不到唯一的最佳匹配.    实 ...