iptables 学习总结

参考文章:朱双印 iptables

防火墙概念

逻辑分类:

  • 主机防火墙:对单个主机进行防护
  • 网络防火墙:通常处于网络的入口/出口,服务于其背后的局域网

物理分类:

  • 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
  • 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低

iptables 概念

iptables 是一个客户端程序,与内核空间的 netfilter 交互。

netfilter 是集成到 linux 内核协议栈中的一套防火墙系统,用户可通过运行在用户空间的 iptables 来把相关配置下发给 netfilter。

netfilter 分为多个模块,各个模块的用户空间配置工具为:

  • 链路层:ebtables
  • 网络层ipv4:iptables
  • 网络层 ipv6:ip6tables
  • 专门用于 ARP 协议:arptables

wikipedia 关于 netfilter 中数据包的流图:

网络层部分的流图:


Read more...

2020-06-20

Kubernetes Scheduler

schedulerCache:Pod 与 Node 的缓存

type schedulerCache struct {
	stop   <-chan struct{}
	ttl    time.Duration
	period time.Duration

	// This mutex guards all fields within this cache struct.
	mu sync.RWMutex
	// a set of assumed pod keys.
	// The key could further be used to get an entry in podStates.
	assumedPods map[string]bool
	// a map from pod key to podState.
	podStates map[string]*podState
	nodes     map[string]*nodeInfoListItem
	// headNode points to the most recently updated NodeInfo in "nodes". It is the
	// head of the linked list.
	headNode *nodeInfoListItem
	nodeTree *nodeTree
	// A map from image name to its imageState.
	imageStates map[string]*imageState
}
  • nodes:维护节点名称到节点信息的映射
  • headNode:按照更新时间由大到小排序节点信息
  • nodeTree:维护 zone 和 node 关系
    • 一个 node 只属于一个 zone
    • 一个 zone 可以包含多个 node
  • imageStates:维护镜像名称到节点的关系

  • podStates:
    • pod:Pod 的最新状态
    • deadline:在结束绑定之后,等待多久没有从 apiserver 接收到绑定完成的事件,就会由 cache.cleanupExpiredAssumedPods 从缓存中删除
    • bindingFinished:是否已经完成绑定
  • assumedPods:值为 true 说明调度器为 Pod 分配了一个 Node

Pod 的调度状态变化:UnScheduled Pod -> (assume) -> Assumed Pod -> (bind) -> Scheduled Pod。


Read more...

2020-03-28

Kubernetes API 资源对象的删除和 GarbageCollector Controller

参考文档:

Kubernetes API 资源对象的删除方式

Foreground cascading deletion

显示级联删除,根对象首先进入 deletion in progress 状态。在 deletion in progress 状态会有如下的情况:

  • 对象仍然可以通过 REST API 可见。
  • 会设置对象的 ObjectMeta.DeletionTimestamp 字段。
  • 对象的 metadata.finalizers 字段包含了值 foregroundDeletion。

一旦对象被设置为 deletion in progress 状态,垃圾收集器在删除了所有 Blocking 状态的 dependents(ownerReference.blockOwnerDeletion=true)之后,对象才会被删除。

Background cascading deletion

隐式级联删除,kubernetes-apiserver 会立即删除对象,然后垃圾收集器会在后台删除 dependents。

Orphan

非级联删除,根对象首先进入 deletion in progress 状态。在 deletion in progress 状态会有如下的情况:

  • 对象仍然可以通过 REST API 可见。
  • 会设置对象的 deletionTimestamp 字段。
  • 对象的 metadata.finalizers 字段包含了值 orphan。

一旦对象被设置为 deletion in progress 状态,垃圾收集器在解除所有 dependents 的关联之后,对象才会被删除。

Gracefully terminate

针对 Pod 特有的删除方式,允许优雅地终止容器。先发送 TERM 信号,过了宽限期还未终止,则发送 KILL 信号。

kube-apiserver 先设置 ObjectMeta.DeletionGracePeriodSeconds,默认为 30s,再由 kubelet 发送删除请求,请求参数中 DeleteOptions.GracePeriodSeconds = 0,kube-apiserver 判断到 lastGraceful = *options.GracePeriodSeconds = 0,就直接删除对象了。


Read more...

2020-03-17

Kubernetes Informer 与 Lister 详解

简介

  • Informer:
    • 同步本地缓存,把 API 资源对象缓存一份到本地
    • 根据发生的事件类型,触发事先注册好的控制器回调
  • Lister:从本地缓存中获取 API 资源对象

Read more...

2020-03-05

Kubernetes ReplicaSet controller 详解

与 ReplicationController 区别

  • ReplicaSet 支持 Set-based requirement 和 Equality-based requirement 类型的 Label selectors,而 ReplicationController 只支持 Equality-based requirement 类型的 Label selectors
  • ReplicaSet 会通过 ownerReference 接管 Pod,而 ReplicationController 只通过 Label selectors 接管 Pod。

Read more...

2020-03-03

Kubernetes Deployment Controller 详解

创建与启动

  • ctx.AvailableResources:可用的 GVR,由 cmd/kube-controller-manager/app.GetAvailableResources 通过 pkg/controller.SimpleControllerClientBuilder 创建的 client-go/kubernetes.Clientset 调用 kube-apiserver 的接口获得。
func startDeploymentController(ctx ControllerContext) (http.Handler, bool, error) {
    if !ctx.AvailableResources[schema.GroupVersionResource{Group: "apps", Version: "v1", Resource: "deployments"}] {
        return nil, false, nil
    }
    // 创建控制器
    dc, err := deployment.NewDeploymentController(
        ctx.InformerFactory.Apps().V1().Deployments(),
        ctx.InformerFactory.Apps().V1().ReplicaSets(),
        ctx.InformerFactory.Core().V1().Pods(),
        ctx.ClientBuilder.ClientOrDie("deployment-controller"),
    )
    if err != nil {
        return nil, true, fmt.Errorf("error creating Deployment controller: %v", err)
    }
    // 启动控制器
    go dc.Run(int(ctx.ComponentConfig.DeploymentController.ConcurrentDeploymentSyncs), ctx.Stop)
    return nil, true, nil
}

Read more...

2020-02-22

Kubernetes API 资源对象的版本控制

一个 API 资源对象的 Schema 的唯一标识由 apiVersion 和 kind 组成,其中 apiVersion 又分为 Group 和 Version。例如:

Group    Version    Kind
apps     v1         Deployment

Read more...

2020-02-17