UUBlog

UUBlog

流量暴涨

接到告警,业务的Kafka出口流量异常,这个kafka一直是订单类在用,平时插入的数据不会达到这个规模。其次,入口带宽很少,出口带宽这么多,掐指一算,大概率是消费的服务出现问题了。一般入口带宽和出口带宽 不是消费组特别多的情况下,两个的带宽相差不会太悬殊。

查找凶手

iftop 看了一下大致流量情况

image-20220128145022454

发现主要流量流出到3.843.85这两台机

tcpdump -i eth0 host <kafka ip> and host <xxx.xxx.3.84> -w test.cap 抓取了几秒这两个主机相关的包

基本确定了流量使用多的端口,主要是 3.141:9093(Kafka) 发送给 3.84:15630 的流量比较多。

tcp流

看了下(3.84:15630 -> 3.141:9093 )的内容 基本可以确定是哪个topic和消费组。

不抓包的话 用netstat来简单过滤下,如果两个主机间建立的连接比较少的话,基本也能定位出是哪个端口,如下

1
2
3
[root@xxx-xxx-3.141 ~]#netstat -ano|grep xxx.xxx.3.84
tcp 0 0 xxx.xxx.3.141:9093 xxx.xxx.3.84:15556 ESTABLISHED keepalive (4.24/0/0)
tcp 0 4128896 xxx.xxx.3.141:9093 xxx.xxx.3.84:15630 ESTABLISHED on (0.20/0/0)

接下来就需要找出3.84:15630是哪个服务监听的端口。

到3.84这台机执行 lsof -i:端口 得到进程ID

然后用 ps aux | grep 或者 lsof -p 找出具体进程信息。

Read more »

关注公众号 尹安灿

我们在持续构建中,经常遇到编译或者运行需要安装大量依赖。像php,java,go,nodejs,python等等。似乎现在没个包管理的语言都不敢出来推广。

但是在使用多阶段构建后,经常遇到依赖反复安装导致构建时间变成的事情。

后面发现了BuildKit可以完成这个事情。

比如下面一个基于nodejs前端工程化的例子:

npm安装依赖后,执行npm run build,将build生成的dist目录下的文件复制到nginx容器提供服务。

而–mount 可以挂载一个具名的缓存来缓存依赖目录,build的时候同样挂载进去即可。下次构建的时候挂载同样的缓存,就不用重复安装了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# syntax = docker/dockerfile:experimental
FROM node:10-alipine3.9 as builder
WORKDIR /code
COPY . .
RUN --mount=type=cache,target=/code/node_modules,id=my_app_npm_module,sharing=locked --mount=type=cache,target=/root/.npm,id=npm_cache npm install --registry=https://registry.npm.taobao.org
RUN --mount=type=cache,target=/code/node_modules,id=my_app_npm_module,sharing=locked npm run build
FROM nginx:1.19.2-alpine
RUN echo $'server {\n\
listen 80;\n\
listen [::]:80;\n\
server_name localhost;\n\
location / {\n\
root /usr/share/nginx/html;\n\
try_files $uri $uri /index.html;\n\
}\n\
}' > /etc/nginx/conf.d/default.conf
COPY --from=builder /code/dist /usr/share/nginx/html
Read more »

关注公众号 尹安灿

基础数据类型

  • 整数类型 int[8/16/32/64]
  • 浮点类型 float[32/64]
  • 字符型 byte
  • 布尔类型 bool
  • 字符串类型 string

复杂数据类型

  • 指针类型 Pointer
  • 数组 Array
  • 结构体 Struct
  • 管道 Channel
  • 函数 Func
  • 切片 Slice
  • 接口 Interface
  • map

类型相关

import(
“fmt”
“unsafe”
)

1
2
3
4
5
6
7
8
9
10
var a byte = 'a'
var b int = '哈'
// 打印字符
fmt.Printf('%c %c', a, b)
// 输出类型
fmt.Printf('%t %t', a, b)
// 打印占用空间
fmt.Printf('%d %d', unsafe.Sizeof(a), unsafe.Sizeof(b))
// 打印出对应的码值
fmt.Printf('%d %d', a, b)

关注公众号 尹安灿

内建变量

  • bool
  • string
  • (u)int[8/16/32/64],uintptr
  • byte
  • rune go的char类型,长度32位
  • float[32/64]
  • complex[64/128] 复数类型

变量定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 1 单个定义
var a int
var b string

// 2 多个定义
var a, b int = 3, 4

// 3 类型判断 省略类型 TypeDeduction
var a, b , = 3, "4", true

// 4 省略var
a,b = 1, 2

// 5 函数外定义 包内部定义
var(
aa = 1
bb = "bb"
)

常量与枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 1 单个定义
const filename = "xxx"

// 2 多个定义
const a, b = 1, 3

// 3 定义多个
const (
...
)

// 4 枚举类型 iota表示值自增
func enums() {
const(
cpp = iota
- //可跳过一个值
java
python
golang
javascript
)
}

// 5 枚举类型 iota计算
const(
b = 1 << (10 * iota)
kb
mb
gb
tb
pg
)
Read more »

关注公众号 尹安灿

Basic Commands

命令 描述
create/apply 从文件或stdin创建资源
expose 为deployment、pod创建service
run 在集群中运行指定的镜像
set 在对象上设置一个specific
get 最基本的查询命令 可以get一切资源信息
explain 查看资源定义,如 kubectl explain replicaset
edit 使用系统编辑器编辑资源 kubectl edit deploy/foo
delete 删除指定资源,支持文件名、资源名、label selector。kubectl delete po -l foo=bar

Deploy Commands

命令 描述
rollout Deployment、DaemonSet的升级过程管理 查看状态、操作历史、暂停升级、恢复升级、回滚
rolling-update 客户端滚动升级,仅限ReplicationController
scale 修改Deployment、ReplicaSet、ReplicationController,Job的实例数
autoscale 为Deployment、ReplicaSet、ReplicationController配置自动伸缩规则,依赖heapster和hpa
Read more »

关注公众号 尹安灿

核心功能

  • 服务发现与负载均衡
  • 容器自动装箱
  • 存储编排
  • 自动容器护肤
  • 自动发布与回滚
  • 配置与密文管理
  • 批量执行
  • 水平伸缩

Pod

  • 一组功能相关的Container的封装
  • 共享存储和Network Namespace
  • 容易走失,需要Workload和Service的呵护

Pod调度过程

Pod调度过程

Workloads

含Deployment、StatefulSet、DaemonSet、Job、Cronjob

Service

  • Pos 防失联
  • 给一组Pod设置反向代理
Read more »

关注公众号 尹安灿

Istio策略和遥测的原理

Istio通过专门的服务端组件,提供一种扩展机制来手机服务运行的遥测数据和服务间的访问,执行一定的策略。

应用场景

采集数据、存储数据、检索数据

通过Sidecar Inbound和Outbound都想Mixer上报数据。Mixer提供对应APM的Adapter。解耦Sidecar和APM的通讯,由Mixer来集中对接。

工作原理

每个插件都是一个Adapter,Mixer通过它们与不同的基础设施后端连接。提供日志、监控、配额、ACL检查等功能。

因为每个基础设施后端都有不同的接口和操作,所以需要自定义代码进行处理,这就是Mixer的Adapter机制。

Mixer通过Protobuf格式定义Adapter的配置。

属性

Envoy上报的数据istio中称为属性 attribute。属性是一小块数据,描述服务请求或者服务运行环境的信息。

属性列表: https://istio.io/docs/reference/config/policy-and-telemetry/attribute-vocabulary/

属性表达式

属性表达式: https://istio.io/docs/reference/config/policy-and-telemetry/expression-language/

Mixer的匹配模型

istio主要通过handler、instance、rule这三个资源对象来描述Adapter的配置。

业务处理 Handler

Handler来描述Adapters及其配置。Mixer每个Adapter都需要一些配置才能运行。不同额Adapter有不同的配置,比如服务后端信息之类的。

如果Adapter看做是一个模板的定义的话,Handler就是这个模板的实现。

Read more »

关注公众号 尹安灿

安装及启动

1
2
3
4
5
6
curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v1.5.2/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

minikube start --image-mirror-country cn \
--iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.5.1.iso \
--registry-mirror=https://kucfkskm.mirror.aliyuncs.com

Install kubectl on Linux

1
2
3
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.0/bin/linux/amd64/kubectl &&\
chmod +x ./kubectl &&\
sudo mv ./kubectl /usr/local/bin/kubectl

参考资料

关注公众号 尹安灿

常用到,记录一下

1
2
3
4
5
wget https://www.php.net/distributions/php-7.2.25.tar.gz
tar zxvf php-7.2.25.tar.gz
cd php-7.2.25/
./configure --help

1
2
3
4
5
6
7
8
9
10
11
yum install -y systemd-devel libpng-devel openjpeg-devel libxml2-devel curl-devel libicu-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel
./configure --prefix=/usr/local/php7 --with-fpm-user=www --with-fpm-group=www --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --with-openssl --enable-exif --disable-fileinfo --enable-ftp --with-gd --enable-mbstring --enable-zip --with-curl --enable-bcmath --with-fpm-systemd --enable-sockets --with-mhash --with-zlib --with-gettext --with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib --enable-pcntl --enable-opcache --enable-intl --enable-session
make
make install
---
ln -s /usr/local/php7/etc/ /etc/php7
cp php.ini-production /usr/local/php7/etc/php.ini
加入 zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service
cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
Read more »

关注公众号 尹安灿

Istio流量治理原理

istio流量治理主要有以下流程

控制面:

  1. 管理员通过命令行或者api创建流量规则
  2. Pilot将流量规则转换为Envoy的标准格式
  3. Pilot将规则下发给Envoy

数据面:

  1. Envoy拦截Pod上本地容器Inbound和Outbound的流量
  2. 在流量经过Envoy时,执行对应的流量规则,进行流量治理

负载均衡

主要用户服务间访问。通过它可以在多个服务实例找到一个合适的后端把请求转发过去。

Pilot维护服务发现数据,下发给Envoy,Envoy根据负载均衡策略选择一个实例转发请求。

服务熔断

istio的熔断控制无需侵入代码,有别与hystrix。

常见的熔断器状态流转

序号 初始状态 条件 迁移状态
1 熔断关闭 请求成功 熔断关闭
2 熔断关闭 请求失败,调用失败次数自增,不超过阀值 熔断关闭
3 熔断关闭 请求失败,调用失败次数自增,超过阀值 熔断开启
4 熔断开启 熔断器维护计时器,计时未到 熔断开启
5 熔断开启 熔断器维护计时器,计时到了 熔断半开启
6 熔断半开启 访问成功 熔断关闭
7 熔断半开启 访问失败 熔断开启

故障注入

有些故障是不会经常触发的,以前模拟故障通常需要修改代码来模拟。而Istio也提供了这个能力。

灰度发布

  1. 蓝绿发布
    类似热发布。先部署新版本,等新版可用后,全流量切换过去。
  2. AB测试
    部署对等的两个版本A和B,分流一部分去a,一部分去b,然后根据运营收集数据,根据反馈选择使用哪个版本。
  3. 金丝雀发布/灰度发布

你叫像AB测试发布,先让小部分用户尝试新版本。观察一段时间后决定使用哪个版本。

Read more »

关注公众号 尹安灿

0%