使外部API来自kubernetes

时间:2018-09-01 11:48:24

标签: kubernetes

我正在运行Kubernetes服务,并且我们有一个依赖于此服务的外部API。

如果有任何服务重启,我们希望收到通知。每次重新启动服务时都有可能击中API端点吗?

2 个答案:

答案 0 :(得分:1)

嗨,欢迎来到社区!

有多种方法可以实现这一目标。一个非常简单的容器(如Thomas所指出的)是一个Init容器。有关如何使它们运行的​​更多信息,请参考Kubernetes docs!一旦Pod启动,此init容器就不会向外部API发送HTTP请求,然后立即终止。

另一种方式要复杂得多,需要您自己编写一些代码。您要做的就是编写自己的控制器,该控制器通过Kubernetes API监视实体,并在重新安排Pod的时间,杀死它们或使其死亡时通知您的外部服务。 (不过,您可以使用外部服务来确定为什么直接访问kube-api ...)

答案 1 :(得分:0)

enzian's comment上扩展有关使用initContainers的知识。这是一个使用基于Curl的initContainer并安装元数据作为环境变量在调用中传递的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: some-service
  namespace: the-project
  labels:
    app: some-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: some-service
  template:
    metadata:
      labels:
        app: some-service
    spec:
      initContainers:
      - name: service-name-init
        image: txn2/curl:v3.0.0
        - name: SOME_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        command: [
          "/bin/sh",
          "-c",
          "/usr/bin/curl -sX GET example.com/notify/$(SOME_NAME)"
        ]
      containers:
      - name: ok
        image: txn2/ok
        imagePullPolicy: Always
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
        ports:
        - name: ok-port
          containerPort: 8080