k8s调研学习方向

网络 flannel/calico 组网和calico的ipam的实现 cilium 全面了解这个网络插件 metallb 全面了解这个网络插件,底层实现 kube-proxy 主要关注iptables规则,ipset和ipvs的使用 存储 csi 关注这个接口的具体定义实现 juicefs 关注源码层面的原理 glusterfs 试用与了解 minio 源码级研究 etcd 源码级研究 核心组件 kube-apiserver 主要关注存储的实现,性能与横向扩展 kubelet 主要关注底层创建pod的完整流程,包括cgroup,存储,cri,网络配置等 kube-scheduler 主要看调度的整体流程,以及基于批的调度实现 扩展组件 client-go 关注list-watch机制,informer原理,apiserver端的实现 operator和controller-runtime库,以及自己实现一个operator,并支持api多版本…

linux配置多级服务器登录和隧道映射

通常,办公环境的电脑无法直接连接到开发测试服务器,往往需要进行多次ssh跳转。这时可通过配置ssh支持自动跳转登录功能。假设有2台服务器A和B在我们的开发测试环境中,本地我们只能连接到A服务器,而A服务器可以连接到B服务器。编辑~/.ssh/config文件,输入下列内容: Host serverA User root HostName 10.1.2.3 IdentityFile /home/myusername/.ssh/id_rsa Port 22 Host serverB User root HostName 192.168.1.3 IdentityFile /home/myusername/.ssh/id_rsa port 22 ProxyJump serverA 此时,在本地即可通过ssh serverB直接连接到服务器B的ssh服务。如果要使用免密方式进行登录。则需要执行ssh-copy-id root@serverA和ssh-copy-id root@serverB进行配置免密。 在进行了这样的配置之后,我们也可以更加方便的建立隧道来使用了。比如在服务器上有一个8080的http服务,想要在本地浏览器里访问。那么,可以执行下列命令建立隧道: ssh -Nf -Llocalhost:8080:192.168.1.3:8080 serverB 此命令会将serverB上的8080端口映射到本地的8080端口上,在浏览器中我们只需要输入http://localhost:8080可以访问到serverB上的web服务。 同样,也可以通过-R选项将本地端口映射到serverB的某个端口上,比如在微信公众号开发测试的时候,可以将配置在公众平台的服务器地址上的服务映射到本地。 为了避免网络连接中断导致隧道断开连接,可以使用systemd来保活,隧道进程退出后自动将其拉起: # cat /lib/systemd/system//my-http-proxy.service [Unit] Describe=my nginx agent After=network.target [Service] LimitNOFILE=10000 Type=simple User=root Group=root ExecStart=/usr/bin/ssh -oExitOnForwardFailure=yes -oPubkeyAuthentication=yes -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oServerAliveInterval=5 -oServerAliveCountMax=3 -Llocalhost:8080:localhost:8080 -N root@serverB Restart = always RestartSec = 1s StartLimitInterval = 0 [Install] WantedBy=network.target 执行systemctl…

timescaledb性能测试

link:https://github.com/timescale/timescaledb[timescaledb]是postgresql数据库的一个插件,通过hypertable实现对时间序列数据库进行分块,通过把大表分为多个小表的方式,新的数据总是插入到最新的块上,由于进行了分块,使得索引数据变小,保持索引一直处于内存当中,不用去磁盘交换数据,因此加快了数据的插入速度。timescaledb官方提供了数据库性能测试工具和数据,可参考link:https://github.com/timescale/benchmark-postgres[benchmark-postgres]。 官方也有link:https://blog.timescale.com/timescaledb-vs-6a696248104e[测试报告],随着数据量的增加,数据插入的性能一直处于稳定状态,而相比之下,postgresql则表现为指数级下降。 本测试采用官方提供的数据和程序,测试环境为阿里云ecs.g5.large云服务器,具体配置如下: * 2核cpu * 8GB内存 * 两块100GB ssd云盘,1800 IOPS * 系统为Debian 9.2 ## 测试步骤: 分别挂在两块ssd云盘到/data和/data1。 安装postgresql-9.6,安装timescaledb扩展。修改配置,修改配置: ```ini shared_preload_libraries = 'timescaledb' data_directory = ‘/data/pgdb’ shared_buffers = 2GB ``` 保存后重启postgresql。具体步骤参考相应的文档。 下载官方提供的link:https://timescaledata.blob.core.windows.net/datasets/benchmark_postgres.tar.bz2[数据]并解压到/data1目录下,cpu-data.csv中包含1亿条数据,每条数据格式如下: ```shell 2016-01-03 23:59:30+00,host_1999,80.6521114433705,60.9865370795396,38.7496729040943,11.5620089238801,47.2124408432341,82.4793308352443,41.6463534391737,85.2477509705689,53.843722695106,52.3795963946359 ``` 下载测试程序,安装go环境,并编译3个程序,并将测试程序拷贝到/data1目录下。 创建benchmark数据,并初始化cpu_ts和cpu_pg表: ```shell postgres@debian:/data1$ psql -c 'CREATE DATABASE benchmark;' postgres@debian:/data1$ psql -d benchmark benchmark-setup-timescaledb.sql postgres@debian:/data1$ psql -d benchmark benchmark-setup-postgresql.sql ``` 分别想cpu_pg和cpu_ts数据库插入数据: ``` postgres@debian:/data1$ ./copy --db-name=benchmark --table=cpu_pg --verbose --reporting-period=30s --file=cpu-data.csv --connection='host=localhost user=postgres password=postgres' postgres@debian:/data1$ ./copy…

reStructuredText标记语言参考规范

译自http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html reStructuredText是纯文本格式,采用简单直观的结构表示结构化的文档。这些结构很容易阅读和处理。本篇文档本身就是reStructuredText例子。reStructureText解析器是Docutils的一个组件。 用简单,隐式的标记来表示特殊的结构,如节标题,无序列表和强调。使用的标记尽可能的简单和恰当。不经常使用的标记可能会比较复杂或有明确的标记。 reStructuredText既可以应用于篇幅较小的文档(如内联程序文档,如python文档),也可一个用于篇幅很长的文档(如本文)。 第一部分通过例子来展示一些reStructuredText基本语法,然后会给出详细的语法规范。 本篇文章通过文本块来展示示例。 内容 语法概览 语法详细 空白字符 空行 缩进 转义机制 引用名称 文档结构 文档 节 转换 主体元素 段落 无序列表 有序列表 定义列表 字段列表 书目字段 RCS关键字 选项列表 文本块 缩进文本块 引用文本块 行块 块引用 Doctest块 表格 网格表格 简单表格 显示标记块 脚注 自动编号脚注 自动符号脚注 手动和自动编号混合脚注 引文 链接目标 匿名链接 指令 替代定义 注释 隐士链接目标 内联标记 内联标记识别规则 识别顺序 字符级内联标记 强调 着重强调 解释文本 内联文本 超链接引用 嵌入式URI和别名 内联内部目标 脚注引用 引文引用 替代引用 标准超链接 单位 长度单位 百分比单位 错误处理 语法概述 reStructuredText文档由主体或块级元素构成,还可以结构化为节。节是根据标题样式(下划线和可选的上划线)决定的。节包含主体元素和/或子节。主体元素包含更多的元素,如列表项,段落和其他主体元素。其他的,例如段落包含文本和内联标记元素。 下面是一些主体元素示例:…

阿里云发送短信 python3实现

import uuid import datetime import hmac import base64 import requests from urllib.parse import urlencode, quote class AliyunSMS(object): def __init__(self, app): self.app = app self.format = app.config.get("ALIYUN_API_FORMAT") or "JSON" self.version = "2016-09-27" self.key = app.config["ALIYUN_API_KEY"] self.secret = app.config["ALIYUN_API_SECRET"] self.signature = "" self.signature_method = "HMAC-SHA1" self.signature_version = "1.0" self.signature_nonce = str(uuid.uuid4()) self.timestamp = datetime.datetime.utcnow().isoformat("T") self.region_id = app.config["ALIYUN_API_REGION_ID"] self.gateway = app.config["ALISMS_GATEWAY"] self.action = "" self.sign = "" self.template = "" self.params = {}…

jabberd2认证配置之mysql配置

jabberd2自带了的authreg支持mysql、sqlite、ldap、pipe等方式。通常情况下,你有一个网站为用户提供服务,用户在你的网站注册了,用户名和密码信息存储在网站服务器的数据库中。而现在你用jabberd2为用户搭建了一个xmpp聊天服务器,并且希望你的用户能够通过在你的网站上注册的用户名和密码登录聊天服务器,而不是在聊天服务器上创建新用户,那么你可以使用jabberd2自带的authreg_mysql模块。要使用authreg_mysql模块,你需要在c2s.xml的mysql节修改或添加如下配置: <mysql> <!-- 数据库服务器的地址和端口 --> <host>localhost</host> <port>3306</port> <!-- 数据库名 --> <dbname>jabberd2</dbname> <!-- 数据库用户和密码 --> <user>jabber</user> <pass>jabber</pass> <!-- table_name为数据库中存储用户表的表名 --> <table>table_name</table> <field> <!-- username_field为表中用户名字段 --> <username>username_field</username> <!-- password_field为表中密码字段 --> <username>password_field</username> <!-- realm_filed,c2s.xml中配置的realm --> <username>realm_filed</username> </field> </mysql> 如果你的用户表中,没有关于real的字段,所有的用户属于同一区域下,你可以使用下面这种配置: <mysql> <!-- 数据库服务器的地址和端口 --> <host>localhost</host> <port>3306</port> <!-- 数据库名 --> <dbname>jabberd2</dbname> <!-- 数据库用户和密码 --> <user>jabber</user> <pass>jabber</pass> <sql> <!-- 替换_password,_usertable,_username,_realm为真实的名称,_realm与c2s.xml中配置的相同 --> <select>select `_password` from `_usertable` where `_username` = '%s' and '%s' = '_realm'</select> </sql> </mysql> 更多信息请参考https://github.com/jabberd2/jabberd2/blob/master/storage/authreg_mysql.c。…

openvpn systemd 配置

[Unit] Description=OpenVPN Service [Service] Type=forking ExecStartPre=/sbin/iptables-restore /etc/iptables-save ExecStart=/usr/sbin/openvpn --cd /etc/openvpn --config /etc/openvpn/server.conf --daemon [Install] WantedBy=multi-user.target…

TCP粘包处理

[Docs] [txt|pdf] [Tracker] [Email] [Nits] Versions: 00 INTERNET-DRAFT C. Sapuntzakis Cisco Systems <draft-csapuntz-tcpmsgbnd-00.txtAugust 2000 Expires February 2001 TCP Message Boundary Option Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents…

PHP中的引用详解

我们首先看下官方英文文档的解释。 PHP中的引用意味着你可以用不同的变量名访问同一个变量内容。在PHP中变量名和变量内容是不同的,引用是符号表别名。引用不同于C语言中的指针,你不能对其进行数学运算。最形象的比喻就是Unix的文件系统,变量名对应文件系统中的文件名,而变量内容对应文件系统中实际的文件内容,引用即为系统中的硬链接。 那么PHP中的引用和C语言中的指针有什么不同呢?C语言中加入定义一个整形指针“int *p”,我们可以对指针进行加操作“p++”,那么它就指向了下一个内存地址。或者我们进行赋值操作,给指针p一个新的地址“p = n”,那么p就指向了n所指向的地址,他们都指向同一个地址。而在PHP中我们不可以对引用使用加减操作,因为通过引用赋值时,如“$b=&$a”,新的$b只是一个变量名而已,和$a是一样的,&的作用就是使$b的变量内容指向了$a的变量内容,$b终究只是一个变量名,用官方的说法是$a的别名。说的直白点就是,使用了“&”的话就不会分配新的内存空间,引用的结果是新变量指向现有的内存空间。 PHP中引用的作用是什么呢?引用有三个基本的作用:引用赋值、引用传递和引用返回。 引用赋值 对于“$a=$b”,$a和$b是完全一样的,他们都指向同一个内容。 引用传递 PHP中函数参数的传递都是值传递,都是将实参的值拷贝一份传递到函数中。如果想在函数中修改函数外部的值,那么就需要引用。 引用返回 可以使用引用进行函数返回,而不是返回值的拷贝。 具体的作用介绍可参考http://php.net/manual/en/language.references.whatdo.php。 需要我们注意的是,在PHP5中的对象变量,我们需要深刻理解。PHP5中的对象变量已经不再保存整个对象的值,只是保存一个标识符来访问真正的对象内容。当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。 可以参考下列代码对本篇文章进行理解。 <?php $a = 1; $b = $a; $b = 4; echo $a . '<br>'; // 1 $b = &$a; $b = 4; echo $a . '<br>'; // 4 $c = $b; $c = 5; echo $b . '<br>'; // 4 echo $a . '<br><br>'; // 4 $a= 1; function func (&$args){ $args = 6;…

4. Posix基本正则表达式

Posix基本正则表达式可实现不同的工具之间保持一致性,例如grep和awk。对于传统的unix工具,并没有实现扩展正则表达式。 历史 传统的unix正则表达式语法在各个工具之间都不同,posix正则表达式被ieee开发,它还具有一套宽展语法。这些标准的设计考虑到尽可能兼容简单正则表达式语法,并为unix工具提供一套标准的语法。 语法 在posix基本正则表达式语法中,大多数字符都被理解为字面意思,它们只匹配它们自己。除此之外为元字符,元字符的定义如下表。 元字符 描述 . 匹配任何单一字符(许多应用程序不对换行符进行匹配,因为换行符根据字符编码和平台相关,但是假设总是匹配换行符是安全的),在posix括号表达式“[]”中,“.”字符总是匹配本身,例如[a.c]匹配“a”、“.”或“c”。 [ ] 匹配括号中的单一字符,例如[abc]匹配“a”、“b”或“c”,[a-z]表示匹配小写字母a到小写字母 z的一个范围。这种形式可以混合使用,如[abcx-z]表示匹配”a”、“b”、“c”、“x”、“y”和”z”,[a-cx-z]具有同样效果。如果“-”是括号中的第一个或者最后一个字符,那么它将理解为字面含义“-”。“]”字符可以出现在括号表达式中,如果他是第一个字符的话,例如“[]abc]”。括号表达式中也可包含”字符类”,“等价类”和”整理字符”。 [^ ] 匹配除了括号中的任一字符,结构和用法同“[]”。 ^ 如果是正则表达式的第一个字符,将匹配字符串的起始位置。 $ 如果是正则表达式的最后一个字符,将在字符串的结尾处进行匹配 * 匹配前一个匹配元素0次或多次,如“ab*c”将匹配”ac”,“abc”和“abbbc”等。“[xyz]*”匹配“”,“x”,”y”,“z”,“zx”,“zyx”,“xyzzy”等。 BRE: \{m\} ERE: {m} 指定前一个匹配元素的匹配次数,如”a\{3\}”仅匹配“aaa”。 BRE: \{m,\} ERE: {m,} 匹配前一个匹配元素最少m次,例如“a\{3,\}”匹配“aaa”,“aaaa”,”aaaaa”等。 BRE: \{m,n\} ERE: {m,n} 匹配前一个匹配元素最少m次,最多n次,例如“a\{3,5\}”匹配“aaa”,”aaaa”,“aaaaa”。 BRE: \( \) ERE: ( ) 定义一个子表达式,将对待该元素为单一元素,例如“ab*”匹配“a”,“ab”,“abb”等。而“\(ab\)*”匹配”“,”abab”,”ababab“等。被匹配的字符串稍后可以被调用,请参考”\n“。 BRE only: \n 取得第n个子表达式的值,n为1到9。This construct is theoretically irregular (an expression with this construct does not obey the mathematical definition of regular expression), and was not adopted…