使用iptables做4层端口转发
用途:有两台机器,需要用其中的一台机器做跳板,转发另一台机器一个特定的端口,机器列表如下
机器
IP
iptables机器
10.0.0.41
web服务器
10.0.0.42:8000
开启内核转发功能临时开启永久开启1sudo sysctl -w net.ipv4.ip_forward=1
或者
1echo "1" > /proc/sys/net/ipv4/ip_forward1234567sudo vim /etc/sysctl.conf# 保证是这个配置net.ipv4.ip_forward=1# 立即生效sudo sysctl -p
转发请求到目标主机1iptables -t nat -A PREROUTING -4 -p tcp -d 10.0.0.41 --dport 80 -j DNAT --to-destination 10.0.0.42:8000
转发数据包回路1iptables -t nat -A POSTROUTING -4 -p tcp -d 10.0.0.42 --dport 8000 -j MASQUER ...
编译安装MySQL5.7
编译需要耗时,且对系统的依赖更为复杂,更容易出错, 如果没有必要,可以参考使用二进制安装MySQL5.7
安装编译依赖Ubuntu和DebianCentOS和Fedora1sudo apt-get install -y build-essential cmake libaio-dev libncurses5-dev pkg-config1sudo yum -y install zlib-devel openssl-devel libaio-devel ncurses-devel cmake gcc-c++
编译设置安装路径12export BASE_DIR="/usr/local/mysql"export DATA_DIR="/data/mysql"
准备工作1234wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.38.tar.gztar xf mysql-boost-5.7.38.tar.gz && cd mysql-5.7.38[[ -d bu ...
Prometheus手动打标签
有时候需要给Prometheus打标签,比如说联邦集群接入,需要知道是哪个集群,remote write写入的时候也需要做个标记。
直接在集群打标签vim prometheus.yml
12345678910global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). external_labels: env: uat dept: ops project: xxx...
这样就可以给集群内的所有metrics打上这三个标签。
通过联邦集群打标签如果集群不好进行操作,可以通过联邦集群接入,在联邦主节点进行配置
1234567891011 ...
基于VictoriaMetrics的大规模监控实战
victoriametrics原生支持水平扩展,并且大部分兼容Prometheus语法,官方文档地址:https://docs.victoriametrics.com/
这个是victoriametrics官方的集群架构
公司用到的集群架构
目前用到3台机器
IP
部署的服务
10.200.4.74
vmauth、vmselect、vminsert、vmstorage、vmalert
10.200.4.75
vmselect、vminsert、vmstorage
10.200.4.76
vmselect、vminsert、vmstorage
vmstorage首先需要把存储部署上,多个存储之间数据是不同步的,也就是说所有的storege组件之间是感知不到彼此的。通过vmselect和vminsert采用一致性hash算法来确定读取/写入哪台节点。
vmstorage启动命令
12345678./vmstorage-prod -httpListenAddr "0.0.0.0:8482" \ # vmstorage监听端口 ...
使用Keepalived来实现Nginx高可用
公有云不会考虑这些,不过自建机房,使用nginx做入口,keepalived是唯一的选择。
节点
IP
keepalived主
192.168.13.45
keepalived备
192.168.13.44
vip
192.168.13.46
keepalived主节点配置单播模式组播模式12345678910111213141516171819202122232425262728293031323334global_defs { script_user root # 脚本执行者 enable_script_security # 标记脚本安全}vrrp_script check_script { script "killall -0 nginx" # 脚本路径, 返回值为0则正常,不为0认为不正常 interval 2 # 脚本执行间隔,单位s weight -20 ...
Prometheus通过remote_write写入数据到另一台Prometheus
比如要从Prometheus_A写入到Prometheus_B
B开启remote_write_receiverPrometheus_B需要打开接收远程写入的功能,通过增加启动参数--web.enable-remote-write-receiver:
1./prometheus --web.enable-remote-write-receiver --web.config.file=web.yml --web.listen-address=0.0.0.0:9090
远程写的接口地址/api/v1/write
B开启认证参考Prometheus开启basic_auth认证
A开启remote_writePrometheus_A需要将remote_write写入到A的接口
12345678910111213141516remote_write:- url: "http://127.0.0.1:9090/api/v1/write" basic_auth: # 开启认证后需要配置 username: admin ...
Prometheus开启basic_auth认证
考虑将公司的联邦集群(pull)换成remote_write(push)这种形式, 所以需要将Prometheus开放到公网,看了看认证相关的配置
也可以使用Nginx来反向代理,可以参考 Nginx开启基本http认证, 不过Prometheus原生带了basic auth 和ssl认证
开启web配置文件1./prometheus --web.config.file="web.yml" --web.listen-address="0.0.0.0:9001"
生成密码密码需要bcrypt加密,这里使用htpasswd工具生成
Ubuntu和Debian安装CentOS和Fedora安装1apt install apache2-utils1yum install httpd-tools
1htpasswd -nB 'admin'
web配置文件vim web.yml
12basic_auth_users: admin: $2y$05$UKSS18ztdsUNoEuXYScr2OE1TCMe1hWnmD6JuwUi/u ...
Ingress Nginx 的灰度方案
在k8s环境下进行灰度,ingress-nginx自带了灰度注解, 这篇文章挺详细的https://v2-1.docs.kubesphere.io/docs/zh-CN/quick-start/ingress-canary/
再此之前有个需求, 根据请求header有没有特定的值,来判断是否进入灰度环境。当时的做法是在集群内用nginx
12345# 如果有个header叫grayif ($http_gray = "true") { proxy_pass http://nginx.test1:80; break;}
这种方式可以实现需求, 不过不灵活, 也不优雅, 搜了一下, 发现ingress nginx原生提供了灰度的方案
ingress自带canary部署简单来说就是部署了两套环境, 这两套一模一样, 只是在不同的namespace(同一个namespace需要取不同的名字),service和ingress域名都配置成一样的, 然后在canary环境的ingress上添加注解即可。
1234567891011121314151 ...
Nginx四层反向代理后端记录真实IP
使用k8s的ingress暴露服务,会有使用负载均衡反向代理ingress的情况,那么我们的ingress获取到的ip都是4层负载的ip,比如常用架构图
4层Proxy Protocol透传tcp工作在网络第4层,Proxy Protocol就是在tcp中增加一个小的报头,用来存储额外的信息
代理协议即 Proxy Protocol,是haproxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取客户IP时非常有用。其本质是在三次握手结束后由代理在连接中插入了一个携带了原始连接四元组信息的数据包。
目前 proxy protocol有两个版本,v1仅支持human-readable报头格式(ASCIII码),v2需同时支持human-readable和二进制格式,即需要兼容v1格式proxy protocol的接收端必须在接收到完整有效的 proxy protocol 头部后才能开始处理连接数据。因此对于服务器的同一个监听端 ...
Nginx配置双向认证
单项认证只需要服务器提供证书即可, 不验证客户端证书, 而双向认证需要验证服务器证书,也需要验证客户端证书, 不满足要求的客户端可以不允许其访问, 并且可以通过后期吊销证书的方式禁止其访问.
证书签名可以参考:
使用certbot自动申请ssl证书
使用acme.sh来自动更新https证书
制作和使用自签名证书
本文提到的 client.crt server.crt 都是通过ca签发的
服务器配置Nginx配置:
1234567891011121314151617server { listen 443 ssl; server_name localhost; ssl_certificate ssl/server.crt; # 配置证书位置 ssl_certificate_key ssl/server.key; # 配置私钥位置 ssl_client_certificate ssl/ca.crt; # 客户端证书 ssl_verify_c ...