搭建集群

安装

按照 kubernetes 官方文档中安装 kubeadm 的部分进行安装

  • 禁用 swap 分区
    1
    swapoff -a
  • 把 iptables 工具切换到“旧版”模式,按照文档的说明,在较新的 Linux 发行版本中,iptables 工具使用 nftables 后端,其与 kubeadm 不兼容。
    1
    2
    3
    4
    update-alternatives --set iptables /usr/sbin/iptables-legacy
    update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
    update-alternatives --set arptables /usr/sbin/arptables-legacy
    update-alternatives --set ebtables /usr/sbin/ebtables-legacy
  • 安装 docker :
    1
    apt install docker.io
  • 安装 kubeadm、kubelet 和 kubectl(国外)
    1
    2
    3
    4
    5
    6
    7
    8
    sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
    deb https://apt.kubernetes.io/ kubernetes-xenial main
    EOF
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
  • 安装 kubeadm、kubelet 和 kubectl(国内)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     sudo apt-get update && sudo apt-get install -y apt-transport-https curl
    curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
    EOF
    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    // 下载镜像(worker节点)
    kubeadm config images list
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.1
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.1 k8s.gcr.io/kube-proxy:v1.20.1
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
    docker pull quay.io/coreos/flannel:v0.13.1-rc1

Master 节点

Master 节点我选用了一台已有的 vps 机器中配置最高的,4核8G内存。

  • 初始化 Master 节点
    1
    2
    3
    4
    kubeadm init --pod-network-cidr=10.244.0.0/16 \
    --apiserver-cert-extra-sans ${MASTER_PUBIP} \
    --apiserver-advertise-address ${MASTER_PUBIP} \
    --node-name master01
  • -pod-network-cidr:指定 pod 网络的 IP 地址范围
  • -apiserver-advertise-address: API 服务器所公布的其正在监听的 IP 地址。使用 Master 节点的公网 ip 地址,在 linode 上可以运行,在一些云服务商上如果公网 ip 没有绑定到网卡上时会无法启动 ETCD
  • -apiserver-cert-extra-sans:用于 API Server 服务证书的可选附加主题备用名称(SAN)
  • -node-name:节点的 name
  • 运行 kubectl(root 用户)
    1
    export KUBECONFIG=/etc/kubernetes/admin.conf
  • 安装 Pod 网络附加组件
    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Worker 节点

Worker 节点上运行蜜罐容器。配置:1核1G内存。跟官方文档推荐的配置有点差距,但也够用了

  • 加入节点
    1
    2
    kubeadm join ${MASTER_PUBIP}:6443 --token ${TOKEN} \
    --discovery-token-ca-cert-hash sha256:${HASH}
  • 给工作节点打上标签 type=worker 和位置标签 loc=cn or foreign
    1
    2
    kubectl label nodes ${NODE_NAME} type=worker
    kubectl label nodes ${NODE_NAME} loc=foreign

配置信息

蜜罐容器需要读取配置文件,我创建了三种配置文件:

  • 私有镜像仓库密钥,敏感数据,使用 Secret
  • 蜜罐的配置文件,包含数据管道的地址和验证信息,敏感数据,使用 Secret
  • cowrie 的配置文件,非敏感数据,使用 ConfigMap

创建用于私有镜像仓库鉴权的 Secret

1
kubectl create secret docker-registry dockerhubsecret --docker-username=${USERNAME}  --docker-password=${PASSWORD}

创建蜜罐配置文件的 Secret

1
kubectl create secret generic honeypot-config --from-file=config/config.toml

创建 cowrie 配置文件的 ConfigMap

1
kubectl create configmap cowrie-config --from-file=etc/

创建 ServiceAccount

向 ServiceAccount 中添加镜像拉取密钥可以不必为每个 pod 都单独进行镜像拉取密钥的添加操作

1
2
3
4
5
6
apiVersion: v1
kind: ServiceAccount
metadata:
name: sa
imagePullSecrets:
-name: dockerhubsecret

创建 Deployment

因为 GFW 的存在,在国内和国外部署的蜜罐需要使用不同的数据管道,也就需要使用不同的 ConfigMap。在国内和国外我们创建了两个 Deployment。每个 pod 包含两个容器,分别是我们的蜜罐和 cowrie。

  • 升级策略:spec.strategy 使用了 Recreate,即在升级时一次性删除所有旧版本的pod后再创建新pod
  • 节点选择器:spec.template.spec.nodeSelector 选择之前设置的 type 标签选择 worker 节点。根据不同的地址位置选择 loc 标签
  • 非亲缘性:spec.template.spec.affinity 定义 podAntiAffinity 强制 pod 调度到不同的节点上。
  • 赋值 ServiceAccount:spec.template.spec.serviceAccountName
  • 使用宿主节点的网络空间:spec.template.spec.hostNetwork
  • 使用特权模式运行pod:spec.template.spec.containers.securityContext
  • 挂载配置文件:spec.template.spec.containers.volumeMounts
  • 存活指针:spec.template.spec.containers.livenessProbe

完整的配置文件放在了最后。

END

  • 在部署工作节点时,如果节点的公网 IP 没有绑定到网卡上,需要在 Master 上设置 iptables 规则,将内网 IP 转向外网 IP。参考
  • 当前的集群配置比较初级,后续还有很大的改进空间。
  • 《Kubernetes in Action》真的很不错。

honeypot-deployment-cn.yaml

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
52
53
54
55
56
57
58
59
60
61
apiVersion: apps/v1
kind: Deployment
metadata:
name: honeypot-cn
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: honeypot
template:
metadata:
labels:
app: honeypot
spec:
nodeSelector:
type: "worker"
loc: "cn"
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels:
app: honeypot
serviceAccountName: sa
hostNetwork: true
containers:
- image: xxxxx/xxxxxx
name: main
volumeMounts:
- name: honeypot-config
mountPath: /config/
securityContext:
privileged: true
livenessProbe:
tcpSocket:
port: xxx
initialDelaySeconds: 20
timeoutSeconds: 5
periodSeconds: 600
- image: cowrie/cowrie
name: cowrie
volumeMounts:
- name: cowrie-config
mountPath: /cowrie/cowrie-git/etc
livenessProbe:
tcpSocket:
port: xxx
initialDelaySeconds: 20
timeoutSeconds: 5
periodSeconds: 10
volumes:
- name: honeypot-config
secret:
secretName: honeypot-config
- name: cowrie-config
configMap:
name: cowrie-config