2021-07-07
前面几节内容学习了容器网络接口CNI及CNI规范的一些基础知识,从本节开始学习开源虚拟网络方案Calico。
Calico是一个可用于容器、虚拟机和本机主机工作负载的开源网络和网络安全解决方案。
Calico支持广泛的平台,包括Kubernetes, OpenShift, Docker EE, OpenStack和裸金属服务。
Calico同时实现并提供了calico网络CNI插件,因此可以将Calico用作容器网络插件。
本文将回到原始时代,从零开始纯手工以二进制形式部署Calico,这样能先从整体上理解Calico的各个组件。
...2021-07-06
故障注入是指将故障注入系统,便于检查系统在存在故障时的行为,以检查系统在可用性方面是否按我们期望的方式运行,测试应用系统的弹性。
本节将基于istio官方文档https://istio.io/latest/zh/docs/tasks/traffic-management/fault-injection/体验istio在流量管理方面的故障注入功能。
基于使用前面已经部署好的bookinfo应用,执行下面的命令初始化bookinfo应用的路由:
...2021-07-05
本节开始学习istio对微服务的流量管理功能,先来看如何配置请求路由,使用istio的流量路由规则可以很容易的控制服务之间的流量和调用。
本节先基于官方文档https://istio.io/latest/zh/docs/tasks/traffic-management/request-routing/完成配置请求路由
的实操演练,后续再理解一些概念性的东西。
bookinfo应用简介
#
前面我们部署的bookinfo应用由4个独立的微服务组成:
...2021-07-04
Istio由Google、IBM和Lyft开源,是第二代服务网格产品。在Istio中使用了Lyft公司的Envoy作为Sidecar。Istio的功能十分丰富,包含以下4个方面:
- 流量管理: 流量管理是istio的基本功能,使用istio的流量路由规则可以轻松控制服务之间的流量和API调用
- 策略控制: 应用策略以确保其得到执行,并且资源在消费者之间公平分配
- 可观测性: 通过自动链路追踪、监控和服务的日志可以全面了解服务如何与其它服务以及istio组件本身进行交互
- 安全认证: 通过托管的身份认证、授权和服务之间通信的加密自动保护服务的安全。Istio Security提供了全面的安全方案来解决这些问题
Istio从2017年5月发布0.1,到现在已经发展到1.10,早期的版本曾提供对非Kubernetes环境的支持,发展到现在基本只支持在Kubernetes上使用。
...2021-07-03
本文基于istio官方文档https://istio.io/latest/zh/docs/setup/getting-started/。
试验环境是一个3节点的k8s集群,k8s版本是1.21。
1.下载istio
#
到istio的发布页面https://github.com/istio/istio/releases/下载安装包,此时版本为1.10.2,下载并解压缩:
1wget https://github.com/istio/istio/releases/download/1.10.2/istio-1.10.2-linux-amd64.tar.gz
2tar -zxvf istio-1.10.2-linux-amd64.tar.gz
进入解压缩后的安装包目录:
1cd istio-1.10.2
2
3tree -L 1
4.
5├── bin 该目录下包含客户端二进制文件istioctl
6├── LICENSE
7├── manifests
8├── manifest.yaml
9├── README.md
10├── samples 该目录下包含示例的应用程序
11└── tools
将istioctl添加到系统PATH环境变量:
...2021-07-01
前面学习了CNI为容器网络创建定义的配置格式及基本的操作执行流程。
本节将从源码加深对CNI接口的理解。
CNI项目https://github.com/containernetworking/cni
的libcni
下包含CNI接口,供容器运行时调用,转发调用具体的CNI插件。
libcni.CNI
就是具体的go语言的接口,源码如下:
...2021-06-29
容器运行时在调用CNI插件创建容器网络时,CNI插件需要为容器网络接口分配和维护一个IP地址,并配置该网络接口所需要的路由,着给了CNI插件很大的灵活性,但也给它们带来了很大负担。
许多CNI插件需要重复编写相同的代码来支持用户可能需求的集中IP管理方案(如:dhcp, host-local)。为了减轻第三方CNI插件的编写负担,将IP管理功能独立出来,CNI规范定义了第二种插件类型
IP Address Management插件(IPAM插件)
。这样,CNI插件就可以在执行过程中需要的时候直接调用相应的IPAM插件,由IPAM插件负责确定IP/子网、网关、路由并将这些信息返回到主CNI插件中。
IPAM插件可以从协议(例如DHCP)、本地文件系统存储的数据、网络配置文件中的ipam
,或者以上这些方式的组合中来获取IP/子网、网关、路由等信息。
...2021-06-27
本节来学习CNI的网络配置。
CNI网络配置(Network Configuration)
#
CNI的网络配置是JSON格式的,可以是存储在磁盘中的文件,也可以由容器运行时以其他方式生成。
下面是cni json配置文件中的一些重要字段:
cniVersion
(string): 描述cni配置遵循的cni规范版本(版本号为语义化版本,如0.4.0)name
(string): 表示network name,在主机(或其他管理域)上的所有容器中应该是唯一的type
(string): 表示cni插件的可执行文件名args
(dictionary, optional): 由容器运行时提供的可选参数。例如,可以通过将标签添加到args下的标签字段,将标签字典传递给CNI插件ipMasq
(boolean, optional): 如果插件支持此字段,将为这个网络上的主机设置一个ip伪装(ip masquerade)。如果主机将充当分配给容器的子网的网管,那么这个配置字段是必须的ipam
(boolean, optional): 包含具体IPAM(IP地址管理)值的键值对type
(string) 表示ipam插件的可执行文件名,如dhscp
, host-local
, static
dns
(dictionary, optional): 包含具体DNS配置的键值对nameservers
(list of strings, optional): 一个对配置网络可见的按优先级顺序排列的dns服务器列表,列表中的每个值是一个IPV4或IPV6的字符串domain
(string, optional): 用于短主机名查找的本地域名search
(list of strings, optional): 用于短主机名查找的优先级排序搜索域列表,被大多数解析器(resolver)在解析时优先于domain
options
(list of strings, optional): 一组可以传递给解析器(resolver)的选项值
cni网络的JSON配置除了上面这些标准字段外,某个具体的插件还可以定义自己的附加字段,但如果配置了插件未定义的字段将会报错。args
中配置的附加字段可以用来传递任意数据,如果插件不认识args中传递的字段,将会直接忽略而不会报错。
...2021-06-25
kubeadm是Kubernetes官方提供的用于快速安部署Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
...2021-06-23
CNI(容器网络接口)是云原生计算基金会(CNCF)的一个项目,它定义了一个规范,同时提供了一个Go语言的库(Library),用于开发在Linux容器中配置网络接口的插件,CNI项目还内置提供了一系列受支持的插件。
CNI只关心容器创建时的网络分配,以及当容器被删除时已经分配网络资源的释放。 CNI作为容器网络的标准,使得各个容器管理平台可以通过相同的接口调用各种各样的网络插件来为容器配置网络。
...