Kubernetes Hollow Node
在做K8s相关开发时,有时会需要通过Node的增删改的事件来测试代码功能,而对已有环境进行Node的真实增删改可能会对现有开发测试有影响。
通过模拟Node的增删改事件是一个更好的方式。在K8s中,为模拟大型集群进行性能测试提供了一个名为Kubemark的工具。本文就将利用Kubemark工具来模拟构建一个Hollow Node。
创建Hollow Node
在Kubemark中,模拟真实Node的过程是通过创建Hollow Node来实现。如Hollow这个前缀名所提示的,“Hollow”表示组件的实现/实例化中,所有“移动”部分都被模拟出来。Hollow Nodes 使用现有的fake Kubelet(称为 SimpleKubelet),它使用 pkg/kubelet/fake-docker-manager.go 模拟其运行时管理器,因此大多数处理逻辑都有模拟。下面介绍如何在一个现有集群里添加Hollow Node。
- 创建 kubemark namespace
kubectl create ns kubemark
- 创建secret
将集群的kubeconfig文件拷贝并命名为config
kubectl create secret generic kubeconfig --type=Opaque --namespace=kubemark --from-file=kubelet.kubeconfig=config --from-file=kubeproxy.kubeconfig=config
- 创建Hollow Node
创建Hollow Node的yaml模版文件是hollow-node_simplified_template.yaml
hollow-node_simplified_template.yaml
文件中{{numreplicas}}
, {{kubemark_image_registry}}
和{{kubemark_image_tag}}
是必须替换的参数。
这里贴出一个可用的yaml文件内容供参考。拷贝下面的内容保存为hollow-node.yaml
后,运行kubectl apply -f hollow-node.yaml
后,可以通过kubectl get nodes
看到最新创建的以hollow-node
为前缀的模拟Node,比如hollow-node-sv8rr
。
apiVersion: v1
kind: ReplicationController
metadata:
name: hollow-node
namespace: kubemark
spec:
replicas: 1
selector:
name: hollow-node
template:
metadata:
labels:
name: hollow-node
spec:
initContainers:
- name: init-inotify-limit
image: docker.io/busybox:latest
command: ['sysctl', '-w', 'fs.inotify.max_user_instances=200']
securityContext:
privileged: true
volumes:
- name: kubeconfig-volume
secret:
secretName: kubeconfig
- name: logs-volume
hostPath:
path: /var/log
containers:
- name: hollow-kubelet
image: antrea/kubemark:v1.18.4
ports:
- containerPort: 4194
- containerPort: 10250
- containerPort: 10255
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
command:
- /kubemark
args:
- --morph=kubelet
- --name=$(NODE_NAME)
- --kubeconfig=/kubeconfig/kubelet.kubeconfig
- --alsologtostderr
- --v=2
volumeMounts:
- name: kubeconfig-volume
mountPath: /kubeconfig
readOnly: true
- name: logs-volume
mountPath: /var/log
resources:
requests:
cpu: 20m
memory: 50M
securityContext:
privileged: true
- name: hollow-proxy
image: antrea/kubemark:v1.18.4
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
command:
- /kubemark
args:
- --morph=proxy
- --name=$(NODE_NAME)
- --use-real-proxier=false
- --kubeconfig=/kubeconfig/kubeproxy.kubeconfig
- --alsologtostderr
- --v=2
volumeMounts:
- name: kubeconfig-volume
mountPath: /kubeconfig
readOnly: true
- name: logs-volume
mountPath: /var/log
resources:
requests:
cpu: 20m
memory: 50M
tolerations:
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists