k8s 配置

k8s objects

官方文档。k8s objects 是 k8s 系统中的持久化实体,用来表示服务集群的状态。

Spec 和 Status

每个 k8s object 包含两个字段,spec 和 status。spec 是事先设置的期望的状态,由使用者指定。status 用来描述当前的状态,由 k8s 系统维护。

描述 k8s objects

当在 k8s 系统中创建 object 时,需要指定 object spec,来描述期望的状态,以及基础信息。

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
46
47
48
49
50
51
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署的名字
name: nginx-deployment
spec:
# 用于选择要管理的Pod对象,该选择器匹配与Deployment相关联的Pod, 所有标签都匹配才行
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
# 定义 pod 相关信息
template:
metadata:
labels:
app: nginx
spec:
# 定义容器,可以多个
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
env:
- name: ENV_NAME
value: ENV_VALUE
# 按标签选择机器
nodeSelector:
<label-name>: <label-value>
# 设置机器亲和性
affinity:
# 设置 node 亲和性
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: <label-name>
operator: In
values:
- <label-value>
# 设置 pod 亲和性
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- <pod-name>
- <pod-name>
topologyKey: kubernetes.io/hostname

需要的字段

  • apiVersion - 创建 k8s object 时使用的 API 版本
  • kind - 创建的 object 的类型
  • metadata - 用来唯一标识 object,包括 nameUIDnamespace
  • spec - k8s object 期望的状态

服务

端口

  • ClusterIP,集群内可以访问,也可以使用 port-forward (用于测试)的方式访问
  • NodePort,直接通过节点访问(k8s 节点,master & work)
    • 需要定义 nodePort
    • 不同的流量会被转发到不同的 pod
  • LoadBalancer,负载均衡方式访问(需要负载均衡器)

ant design

Upload 集成在菜单/下拉框选项

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
let items = [            
{
label: <Upload
multiple={false}
showUploadList={false}
accept=".json"
customRequest={onSelect}>导入</Upload>,
icon: <ImportOutlined/>,
key: 1
}
]

<Menu
selectedKeys={1}
items={menuItems}
/>

// 自定义上传逻辑
const onSelect = (info: any) => {
let {file} = info
let reader = new FileReader();
reader.onload = (e: ProgressEvent<FileReader>) => {
if (e && e.target && e.target.result) {
let space: string = e.target.result.toString();
importSpace(JSON.parse(space)) // importSpace: 发送请求, 返回 Promise 对象
.then(() => {
message.success("导入成功");
})
.catch(e => message.error("导入失败"));
}
};
reader.readAsText(file);
};

pyenv

安装

脚本安装

1
curl https://pyenv.run | bash

HomeBrew 安装

1
2
3
4
5
# 安装 brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装 pyenv
brew install pyenv

生效

1
eval "$(pyenv init -)"

Python 版本管理

可安装版本

1
pyenv install -l

安装

1
pyenv install 3.9.10

使用版本

1
pyenv global 3.9.10

问题排查

依赖

1
sudo apt install libreadline-dev libbz2-dev libncurses-dev libffi-dev libssl-dev sqlite3 libsqlite3-dev

openssl 错误

1
2
3
...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
...

解决

1
2
3
4
PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA=openssl@1.0 pyenv install 2.7.16

# 或者尝试
CFLAGS=-I/usr/include/openssl LDFLAGS=-L/usr/lib pyenv

flink

Protobuf

设置自定义序列化

引入依赖

1
2
3
4
5
<dependency>
<groupId>com.twitter</groupId>
<artifactId>chill-protobuf</artifactId>
<version>0.10.0</version>
</dependency>

设置自定义序列化类

1
2
3
import com.twitter.chill.protobuf.ProtobufSerializer

env.getConfig.registerTypeWithKryoSerializer(classOf[PbMessage], classOf[ProtobufSerializer])

参数

1
2
3
4
5
6
7
8
9
10
-m    address of job manager which to connect
-d detached mode
-yd yarn detached mode
-ynm yarn application name
-yn number of yarn container to allocate = Number of Task Managers
-ys Number of slots per TaskManager
-yjm Memory for JobManager Container with optional unit (default: MB)
-ytm Memory per TaskManager Container with optional unit (default: MB)
-p The parallelism with which to run the program.
-c class to run