Kubernetes Notes
  • README
  • 序:Kubernetes之道
  • 搭建开发环境
    • 搭建本地开发测试环境
  • 基本概念
    • Workloads
      • StatefulSet
    • 认证鉴权
      • 理解证书
      • Kubelet配置
    • 垃圾回收
    • Service
  • 基础组件
    • Scheduler
    • 自动扩缩容(HPA)
  • 容器运行时(Container Runtime)
    • CRI
    • Docker
      • 安装配置Docker
      • Docker FAQ
    • Containerd
  • 资源隔离与限制
    • 基础知识
      • Cgroup
      • Namespaces
    • CPU
    • Memory
    • 网络出/入带宽
    • GPU
    • Container
    • FAQ
  • 网络
    • 基础知识
      • Linux network interfaces
      • Iptables
      • Overlay network
    • CNI
    • Flannel
      • Flannel原理
      • host-gw
      • vxlan
      • ipip
    • Calico
    • Cilium
  • Service Mesh
    • Istio
  • 扩展Kubernetes
    • Admission controller
    • Custom resource definition(CRD)
    • Scheduler extender
    • 扩展资源维度
    • Kubectl plugin
    • Aggregator
    • Device plugin
  • 现网问题
    • Kubernetes
    • ETCD
    • Docker
  • 最佳实践
    • 各组件参数配置调优
    • 各大公司生产环境实践
    • 如何打造一个Kubernetes平台
  • 生产力小工具
    • 生成特定权限和配额的kubeconfig
  • 社区贡献
  • 学习资料
  • 附录:RTFSC
    • Informer
    • Pod deletion
Powered by GitBook
On this page
  • 1. 代码
  • 2. Issue
  • 3. 参考资料

Was this helpful?

  1. 附录:RTFSC

Pod deletion

1. 代码

所有的rest请求都会转到api server,由apiserver处理。

staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go(其他接口也在这,比如: GET)

// Delete removes the item from storage.
func (e *Store) Delete(ctx genericapirequest.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error)

参数里有个DeleteOptions,是为了实现graceful shutdown。

staging/src/k8s.io/apiserver/pkg/endpoints/installer.go在install rest api handler时会对这种支持DeleteOptions的handler进行特殊处理,从http body里取出delete options相关的参数。

func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storage, ws *restful.WebService, proxyHandler http.Handler) (*metav1.APIResource, error) {
    ...
    gracefulDeleter, isGracefulDeleter := storage.(rest.GracefulDeleter)
    ...
    switch {
    case isGracefulDeleter:
        versionedDeleteOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind("DeleteOptions"))
        if err != nil {
            return nil, err
        }
        versionedDeleterObject = indirectArbitraryPointer(versionedDeleteOptions)
        isDeleter = true
    case isDeleter:
        gracefulDeleter = rest.GracefulDeleteAdapter{Deleter: deleter}
    }
    ...
            case "DELETE": // Delete a resource.
            article := getArticleForNoun(kind, " ")
            doc := "delete" + article + kind
            if hasSubresource {
                doc = "delete " + subresource + " of" + article + kind
            }
            handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulDeleteResource(gracefulDeleter, isGracefulDeleter, reqScope, admit))
            route := ws.DELETE(action.Path).To(handler).
                Doc(doc).
                Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
                Operation("delete"+namespaced+kind+strings.Title(subresource)+operationSuffix).
                Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
                Writes(versionedStatus).
                Returns(http.StatusOK, "OK", versionedStatus)
            if isGracefulDeleter {
                route.Reads(versionedDeleterObject)
                if err := addObjectParams(ws, route, versionedDeleteOptions); err != nil {
                    return nil, err
                }
            }
            addParams(route, action.Params)
            routes = append(routes, route)
}

注意:如果是gracefulDeleter,则最终传给store.go#Delete函数的options参数一定不为nil。

删除pod的接口如下:

Delete(name string, options *meta_v1.DeleteOptions)

最后,Pod etcd strategy在文件夹pkg/registry/core/pod下。

2. Issue

  • Graceful delete

  • 具体的应用,怎么删除一个pod

3. 参考资料

  • 保证at most on instance,避免多实例,对statefulset格外重要

PreviousInformer

Last updated 6 years ago

Was this helpful?

options为nil时,将会使用default graceful period(默认为30s)。如果要强制直接从etcd上把pod删除,可以指定graceful period为0(metav1.NewDeleteOptions(0))。具体的例子可见

Proposal - Pod safety and termination guarantees:

Make StatefulSets safe during cluster failure:

Node status down -> pod status unknown -> pod cant be deleted, cordon doesnt finish.:

Consistently support graceful and immediate termination for all objects:

Deleting pods and other resources with graceful shutdown:

k8s: delete pod with 0 grace period:

Pod Safety, Consistency Guarantees, and Storage Implications:

Termination of Pods:

https://github.com/coreos/etcd-operator/pull/273。
https://github.com/kubernetes/kubernetes/pull/34160
https://github.com/kubernetes/features/issues/119
https://github.com/kubernetes/kubernetes/issues/51333
https://github.com/kubernetes/kubernetes/issues/1535
https://github.com/kubernetes/kubernetes/issues/2789
https://github.com/coreos/etcd-operator/pull/273
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/pod-safety.md
https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods