管理节点和 Pod

使用 kwok 管理节点和 Pod #

本文档将指导您如何使用 kwok 管理节点和 Pod。

节点管理 #

适用于所有节点 #

使用 --manage-all-nodes=true 参数,kwok 将负责集群中的所有节点,并维护它们与 API 服务器的心跳。通过这种方式,所有节点将表现得像真实节点一样,并保持在 Ready 状态。

适用于具有注释的特定节点 #

使用 --manage-nodes-with-annotation-selector=kwok.x-k8s.io/node=fake 参数,kwok 仅管理具有注释 kwok.x-k8s.io/node=fake 的节点。如果注释不存在,kwok 将不会管理该节点。

适用于具有标签的特定节点 #

使用 --manage-nodes-with-label-selector=kwok.x-k8s.io/node=fake 参数,kwok 仅管理具有标签 kwok.x-k8s.io/node=fake 的节点。如果标签不存在,kwok 将不会管理该节点。

适用于单个节点 #

使用 --manage-single-node=fake-node 参数,kwok 仅管理名为 fake-node 的节点。

创建节点 #

使用 kwok,您可以通过简单地创建 v1.Node 对象来加入任意节点

状态可以是任何值。

kubectl apply -f - <<EOF
apiVersion: v1
kind: Node
metadata:
  annotations:
    node.alpha.kubernetes.io/ttl: "0"
    kwok.x-k8s.io/node: fake
  labels:
    beta.kubernetes.io/arch: amd64
    beta.kubernetes.io/os: linux
    kubernetes.io/arch: amd64
    kubernetes.io/hostname: kwok-node-0
    kubernetes.io/os: linux
    kubernetes.io/role: agent
    node-role.kubernetes.io/agent: ""
    type: kwok
  name: kwok-node-0
spec:
  taints: # Avoid scheduling actual running pods to fake Node
  - effect: NoSchedule
    key: kwok.x-k8s.io/node
    value: fake
status:
  allocatable:
    cpu: 32
    memory: 256Gi
    pods: 110
  capacity:
    cpu: 32
    memory: 256Gi
    pods: 110
  nodeInfo:
    architecture: amd64
    bootID: ""
    containerRuntimeVersion: ""
    kernelVersion: ""
    kubeProxyVersion: fake
    kubeletVersion: fake
    machineID: ""
    operatingSystem: linux
    osImage: ""
    systemUUID: ""
  phase: Running
EOF

在创建节点后,kwok 将维护其心跳并将其保持在 ready 状态。

$ kubectl get node -o wide
NAME          STATUS   ROLES   AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE    KERNEL-VERSION   CONTAINER-RUNTIME
kwok-node-0   Ready    agent   5s    fake      196.168.0.1   <none>        <unknown>   <unknown>        <unknown>

创建 Pod #

现在,我们创建一些 Pod 以验证它们是否可以降落在之前创建的节点上

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fake-pod
  namespace: default
spec:
  replicas: 10
  selector:
    matchLabels:
      app: fake-pod
  template:
    metadata:
      labels:
        app: fake-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: type
                operator: In
                values:
                - kwok
      # A taints was added to an automatically created Node.
      # You can remove taints of Node or add this tolerations.
      tolerations:
      - key: "kwok.x-k8s.io/node"
        operator: "Exists"
        effect: "NoSchedule"
      containers:
      - name: fake-container
        image: fake-image
EOF

在创建 Pod 后,我们可以看到所有 Pod 都降落在该节点上并处于 Running 状态。

$ kubectl get pod -o wide
NAME                        READY   STATUS    RESTARTS   AGE   IP          NODE          NOMINATED NODE   READINESS GATES
fake-pod-59bb47845f-4vl9f   1/1     Running   0          5s    10.0.0.5    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-bc49m   1/1     Running   0          5s    10.0.0.4    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-cnjsv   1/1     Running   0          5s    10.0.0.7    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-g29wz   1/1     Running   0          5s    10.0.0.2    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-gxq88   1/1     Running   0          5s    10.0.0.10   kwok-node-0   <none>           <none>
fake-pod-59bb47845f-pnzmn   1/1     Running   0          5s    10.0.0.9    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-sfkk4   1/1     Running   0          5s    10.0.0.3    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-vl2z5   1/1     Running   0          5s    10.0.0.8    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-vpfhv   1/1     Running   0          5s    10.0.0.6    kwok-node-0   <none>           <none>
fake-pod-59bb47845f-wxn4b   1/1     Running   0          5s    10.0.0.1    kwok-node-0   <none>           <none>

更新节点或 Pod 的规范 #

kwok 上下文中,节点和 Pod 只是纯 API 对象,因此可以随意更改其 API 规范以执行任何您想要的模拟或测试。