1. 系统性能

psutil是一个跨平台进程和系统监控的Python库,gopsutil是其Go语言版本的实现。适合做一些诸如采集系统信息和监控的服务

1
go get github.com/shirou/gopsutil/cpu
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
33
34
35
36
37
38
39
40
41
42
43
44
45
func getCpuInfo() {
cpuInfos, _ := cpu.Info()

for _, ci := range cpuInfos {
fmt.Println(ci)
}

// CPU 使用率
for {
percent, _ := cpu.Percent(time.Second, false)
fmt.Printf("cpu percent: %v\n", percent)
}
}

func getMemInfo() {
memInfo, _ := mem.VirtualMemory()
fmt.Printf("mem info: %v\n", memInfo)
}

func getHostInfo() {
hostInfo, _ := host.Info()
fmt.Printf("host info: %v\n", hostInfo)
}

func getDiskInfo() {
parts, _ := disk.Partitions(true)

for _, part := range parts {
fmt.Printf("part: %v\n", part.String())
diskInfo, _ := disk.Usage(part.Mountpoint)
fmt.Printf("disk info: used=%v, free=%v\n", diskInfo.Used, diskInfo.Free)
}

ioStat, _ := disk.IOCounters()
for k, v := range ioStat {
fmt.Printf("%v: %v\n", k, v)
}
}

func getNetInfo() {
infos, _ := net.IOCounters(true)
for i, v := range infos {
fmt.Printf("%v: %v, send: %v, recv: %v\n", i, v, v.BytesSent, v.BytesRecv)
}
}

1. Getting Started

1
2
go get github.com/jmoiron/sqlx
github.com/go-sql-driver/mysql

2. Handle Types

4 handle types:

sqlx database/sql
sqlx.DB sql.DB
sqlx.Tx sql.Tx
sqlx.Stmt sql.Stmt
sqlx.NamedStmt

2 cursor types:

sqlx database/sql from
sqlx.Rows sql.Rows Queryx
sqlx.Row sql.Row QueryRowx

1. Ubuntu

1.1 修改IP

Ubuntu 16, 18:

1
2
3
4
5
6
7
8
9
10
sudo vi /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.80.20
netmask 255.255.255.0
gateway 192.168.80.2
dns-nameservers 8.8.8.8

sudo ip addr flush ens33
sudo systemctl restart networking

1. 重定向

1.1 proxy_pass

302跳转,不能传递原来请求的header

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name a.example.com;
listen 443 ssl;

location = /xx {
proxy_pass http://b.example.com/xx;
proxy_set_header Host b.example.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
break;
}
}

1. select

select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。

1
2
3
4
5
6
7
while true {
select(streams[])
for i in streams[] {
if i has data
read until unavailable
}
}

1. 概述

Redis:Remote Dictionary Server,高性能非关系型(NoSQL)键值对数据库

Redis特性:

  • key-value 存储
  • 支持数据可靠性存储及落地
  • 单进程但线程高性能服务器
  • crash safe & recovery slow
  • 单机qps可达10W
  • 适合小数据量高速读写访问

1. Helm

Helm:让应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成的k8s资源清单文件 (deployment.yaml, service.yaml),然后调用kubectl自动执行k8s资源部署。

Helm 包管理工具,是部署环境的流程封装

Helm 两个重要概念:

  • chart: 创建一个应用的信息集合,包含各种kubernetes对象的配置模板、参数定义、依赖关系、文档说明等。chart是应用部署的自包含逻辑单元,即yum中的安装包
  • release: chart的运行实例。当chart被安装到kubernetes中,就生成一个release。chart能够多次安装到同一个集群,每次安装都是一个realease

helm 包含两个组件:Helm 客户端 和 Tiller 服务器

helm

Helm客户端: 负责chart和release的创建和管理、和Tiller的交互

Tiller服务器:运行在kubernetes集群节点中,处理Helm客户端请求,与API Server交互

1. 机制说明

API Server 是集群内部各个组件通讯的中介,也是外部控制的入口。k8s 使用认证(Authentication)、鉴权(Authorization)、准入控制(Admission Control) 三步来确保API Server的安全。

2. 认证 (Authentication)

  • HTTP Token:HTTP Request Header 的 Token字段

  • HTTP Base: 客户端通过base64 USERNAME:PASSWORD, 填充 HTTP Request Header 的 Authorization字段,服务端收到后解码获取用户名和密码

  • HTTPS: 基于CA根证书签名的客户端身份认证方式。(推荐)

1. 调度说明

1.1 简介

Scheduler 是 K8S 的调度器,主要任务是把定义的 pod 分配到集群节点上。它主要考虑如下问题:

  • 公平: 如何确保每个节点都被分配资源
  • 资源高利用率:集群所有资源最大化被使用
  • 效率:调度性能要好,能够尽快地对大批量的 pod 完成调度工作
  • 灵活:允许用户根据自己的需求控制调度的逻辑

Scheduler 作为独立的进程允许,启动后会一直监听API Server,获取 PodSpec.NodeName 为空的pod,对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上

1. ConfigMap

提供向容器注入配置信息的机制,可以用来保存单个属性,也可以用来保存整个配置文化或 JSON 二进制大对象

1.1 创建 ConfigMap

1.1.1 文件

--from-file:指定文件或目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ cat > ./ui.properties <<EOF
color=red
background=cyan
EOF

$ kubectl create configmap ui-config --from-file=./ui.properties

$ kubectl get cm ui-config -o yaml
apiVersion: v1
data:
ui.properties: | # key 为文件名称
color=red
background=cyan
kind: ConfigMap
metadata:
...