繁体   English   中英

基于一个 pod 的生命周期时如何删除另一个 pod

[英]How to delete another pod when based on lifeCycle of one pod

当“service2-deployment”中发生容器重启时,我需要删除“service1-deployment”的所有 pod。

我发现我们可以通过 lifeCycle 事件处理程序“service2-deployment”来做到这一点

https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

但是我们不能在这里指定kubeclt delete pod命令,因为它在 pod 内运行。 有没有什么简单的方法可以根据 1st Pod 的生命周期事件重新启动 2nd pod?

您可以调用rest API of api-server来删除另一个部署的 pod。

您可以在生命周期事件执行后调用您的自定义API

免责声明- 正如评论中提到的,您应该避免这种解决方案( 微服务应该是独立的),直到您真的别无选择。


您可以设置postStartpreStop处理程序(用于安装kubectl二进制文件和从部署中删除 pod),但首先您需要为 pod 和具有删除 pod 权限的 角色(绑定)创建适当的服务帐户

apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: role-for-hook
subjects:
- kind: ServiceAccount
  name: service-account-for-hook
  namespace: default
roleRef:
  kind: ClusterRole
  name: delete-pods-role
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: service-account-for-hook
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: delete-pods-role
  labels:
    # Add these permissions to the "view" default role.
    rbac.authorization.k8s.io/aggregate-to-view: "true"
rules:
- apiGroups: ["*"]
  resources: ["pods"]
  verbs: ["delete","list"]

然后,您可以在 pod/部署定义中使用新创建的服务帐户 + postStartpreStop处理程序 - 例如 NGINX 映像。 我假设,来自Service1的 Pod 的 label 是app=service1

apiVersion: apps/v1
kind: Deployment
metadata:
  name: service2-deployment
spec:
  selector:
    matchLabels:
      app: service2
  replicas: 2
  template:
    metadata:
      labels:
        app: service2
    spec:
      serviceAccountName: service-account-for-hook
      containers:
      - name: service2
        image: nginx:latest
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "apt update && apt install curl && curl -L https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl -o /usr/local/bin/kubectl && chmod +x /usr/local/bin/kubectl"] 
          preStop:
            exec:
              command: ["/bin/sh", "-c", "kubectl delete pods -l app=service1"]
        ports:
          - containerPort: 80

然后,如果Service2的 pod 重新启动, Service1的 pod 也会重新启动。

命令中使用的command:对您来说可能会有所不同,这取决于您用于应用程序的基本映像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM