云-Istio-Service Mesh介绍
Service Mesh 基本概念2019年,在众多热门技术趋势中,云原生的关注度居高不下,很多开发者都对由此兴起的一众技术十分追捧,众多企业又开始探索云原生架构的转型与落地。这一年,中国的开发者们经历了从关注“云原生概念”到关注“云原生落地实践”的转变。而 Service Mesh 技术也因此越来越火热,受到越来越多开发者的关注,并拥有了大批拥趸。那么 Service Mesh 是什么呢?它为什么会受到开发者的关注?它和传统微服务应用有什么区别?
Service Mesh 一词最早由开发 Linkerd 的 Buoyant 公司提出,并于 2016 年 9 月29 日第一次公开使用了这一术语。William Morgan,Buoyant CEO,对 Service Mesh 这一概念定义如下:
A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of re ...
Kubernetes-服务暴露-ingress
Ingress 简介在客户端访问我们k8s服务时,四层调度器本身是没有办法解除ssl会话的,这就意味着客户端必须与后端服务器(pod)之间直接建立ssl会话,这里还有个显著的问题在于如果调度器在ssl会话建立以后的下一个请求被调度到第二台服务器上那么这个ssl还要重新建立,因此我们只要认为内部网络是安全的那么我们可以把会话在前端调度器上卸载,但是四层调度是不能卸载的,因此我们需要七层的负载均衡机制。因此如果他们是http服务我们又期望构建https,那么我们只需要他在互联网上这个不安全的网络中传输实现https,内网中使用http,因此我们需要使用卸载器,但是我们Service调度时,无论是iptables还是ipvs都只是四层调度,因此也就意味着如果你想要在k8s上运行一个应用基于https提供服务,我们就必须得在后端每一个pod上配置https,因为只有这样他们才会建立起https联系,所以我们现在也期望在接入那一层上就能够卸载ssl,向内部调度时就不再是ssl了。对这种需求,k8s采用一种很独特的方式来实现,我们在整个集群中,在进行调度时后端被代理的pod资源是不配置https的 ...
Kubernetes-网络模型
前言k8s对Pods之间如何进行组网通信提出了要求,k8s对集群的网络有以下要求:
所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信
所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信
每个Pod自己看到的自己的ip和其他Pod看到的一致
k8s网络模型设计基础原则:每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。 所以不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。
由于 Kubemetes 的网络模型假设 Pod 之间访问时使用的是对方 Pod 的实际地址,所以一个 Pod 内部的应用程序看到的自己的 IP 地址和端口与集群内其他 Pod 看到的一样。它们都是 Pod 实际分配的IP地址 (从dockerO上分配的)。将IP地址和端口在Pod内部和外部都保持一致, 我们可以不使用 NAT 来进行转换,地址空间也自然是 ...
Kubernetes-安全机制
Kubernetes平台由6个组件组成:apiserver、scheduler、controller-manager、kubelet、kube-proxy、etcd,其中etcd是Kubernetes数据库,在生产环境中一般不允许直接访问。平台通过apiserver组件对外提供HTTPS协议服务接口,其它scheduler、controller-manager、kubelet、kube-proxy组件不提供交互接口。运维中对平台的管理操作都需要通过apiserver提供的功能接口完成,因此Kubernetes总体的API安全防护机制是对用户访问操作HTTPS服务接口的控制。
Kubernetes只对以下的API请求属性进行检查:
user - username,uid
group - user group
“extra”- 额外信息
API - API资源的对象
Request path - 请求资源的路径(k8s使用resultful风格接口的API)
http://Node_IPaddr:6443/apis/apps/v1/namespaces/namespaces_nam ...
GOLANG-08-函数
函数Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。
函数定义Go语言中定义函数使用func关键字,具体格式如下:
123func 函数名(参数)(返回值){ 函数体}
其中:
函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。
参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。
返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。
函数体:实现指定功能的代码块。
我们先来定义一个求两个数之和的函数:
123func intSum(x int, y int) int { return x + y}
函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:
123func sayHello() { fmt.Println("Hello kinmfer")}
函数的调用定义了函数之后,我们可以通过函数名()的方式 ...
GOLANG-07-map
map定义map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。
Go语言中 map的定义语法如下:
1map[KeyType]ValueType
其中,
KeyType:表示键的类型。
ValueType:表示键对应的值的类型。
map类型的变量默认初始值为nil,需要使用make()函数来分配内存。语法为:
1make(map[KeyType]ValueType, [cap])
其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
map基本使用map中的数据都是成对出现的,map的基本使用示例代码如下:
12345678func main() { scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["小明"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["小明"]) fmt. ...
GOLANG-06-切片
引因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 例如:
1234567func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ sum = sum + v } return sum}
这个求和函数只能接受[3]int类型,其他的都不支持。 再比如,
1a := [3]int{1, 2, 3}
数组a中已经有三个元素了,我们不能再继续往数组a中添加新元素了。
切片切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。
切片是一个引用类型(可以理解为Python的浅拷贝),它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。
地址是指切片中第一个元素指向的内存空间
长度是指当前元素的数量
容量是指底层数组最大能放多少元素(注意是从该切片底层数组的对应的切片首地址开始的)
切片的定义声明切片类型的基本语法如下:
1var n ...
GOLANG-05-数组
数组概念数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法:
12// 定义一个长度为3元素类型为int的数组avar a [3]int
数组定义1var 数组变量名 [元素数量]T
比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分。一旦定义,长度不能变。 [5]int和[10]int是不同的类型。
123var a [3]intvar b [4]inta = b //不可以这样做,因为此时a和b是不同的类型
数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,访问越界(下标在合法范围之外),则触发访问越界,会panic。
数组的初始化数组的初始化也有很多方式。
方法一初始化数组时可以使用初始化列表来设置数组元素的值。
12345678func main() { var testArray [3]int //数组会初始化为int类型的零值 var numArray = [3]int{1, 2& ...
GOLANG-04-流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。
Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。
if else(分支结构)if条件判断基本写法Go语言中if条件判断的格式如下:
1234567if 表达式1 { 分支1} else if 表达式2 { 分支2} else{ 分支3}
当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3。 if判断中的else if和else都是可选的,可以根据实际需要进行选择。
Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个if或else if右边的大括号在同一行。
举个例子:
12345678910func ifDemo1() { ...
GOLANG-03-运算符
Go 语言内置的运算符有:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
算数运算符
运算符
描述
+
相加
-
相减
*
相乘
/
相除
%
求余
注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。
关系运算符
运算符
描述
==
检查两个值是否相等,如果相等返回 True 否则返回 False。
!=
检查两个值是否不相等,如果不相等返回 True 否则返回 False。
>
检查左边值是否大于右边值,如果是返回 True 否则返回 False。
>=
检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。
<
检查左边值是否小于右边值,如果是返回 True 否则返回 False。
<=
检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。
逻辑运算符
运算符
描述
&&
逻辑 AND 运算符。 如果两边的操作数都是 True,则为 True,否则为 False。
||
逻辑 OR 运 ...