자바가 자신의는 Kubernetes 컨트롤러를 개발하여, 당신은 시도하려는?

저자 | 니콜라 프랭클

번역기 | Inf를, Zebian | 쑤의 Veyron

표지 사진은 | CSDN는 시각적 인 중국을 다운로드

이 글에서, 우리는 자신의는 Kubernetes 컨트롤러를 개발하기 시작합니다. 

기술 스택은 파이썬, NodeJS 또는 루비를 할 수 있습니다. 이 블로그는 "자바 괴짜 '로 명명하고 있기 때문에, 따라서 자바가 정상인지를 선택합니다. 

사용 사례로서, 우리는 사이드카 모드를 달성 : 포드가 예약 될 때마다, 사이드카 포드는 예약됩니다. 당신이 이전을 삭제하면, 후자의 필수도 삭제.

올바른 도구를 선택

 

자바 REST 호출을 수행하려면 먼저 바인딩을 생성해야합니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 이 작업이 수동으로 수행되는 가장 성가신 : 조심스럽게 가능한 조합 JSON 요청 및 응답을 모두 제어 할 필요가 각각의 자바 객체 직렬화 프레임 워크와 JSON의 개발은 HTTP 클라이언트를 선택합니다. 차선 옵션은 고유 코드 발생기, 예컨대 자신감 (https://swagger.io/) 또는 양봉장 (https://apiary.io/)를 사용하는 것이다. 이것은 가능한 형식을 제공하기 위해 API 제공 모델을 필요로한다. 단점은 도구를 사용할 필요가있다. 때로는 다소 개방 형성 예를 들어, OpenAPI를 사양 (https://swagger.io/specification/). 이 경우, 포맷에서 선택된 공구를 실현할 수있다. 최선의 경우,이 바인딩을 제공하고 있습니다.

는 Kubernetes 경우입니다 : 이 프로젝트는 다양한 언어 (https://kubernetes.io/docs/reference/using-api/client-libraries/) 바인딩 자체를 제공합니다. 문제는 매우 가까운 저자의 언어 REST API의 래퍼 너무 잘 알고있다. 예를 들어,이 목록에있는 모든 공간 포드 방법의 모든 이름이다 :

ApiClient client = Config.defaultClient();
CoreV1Api core = new CoreV1Api(client);
V1PodList pods =
    core.listPodForAllNamespaces(null, null, null, null, null, null, null, null);  

참고 : 모든 널 매개 변수가 전달 될 필요가있다.

이 수단 "래퍼 코드가 매우 가까운 REST API에있다"입니다. 다행히도, 또 다른 옵션이 있습니다. Fabric8 조직은 Github에서의 부드러운 자바 API를 제공한다. 등가 코드 위에 코드이다 :

KubernetesClient client = new DefaultKubernetesClient();
PodList pods = client.pods().inAnyNamespace().list();    

注意:无需传递无用的null参数。

Fabric8 조직은 Github에서의 부드러운 자바 API를 제공한다 :

https://github.com/fabric8io/kubernetes-client)

Fabric8 빠른 개요

 

Fabric8에게 API를 사용하여 간단한 용어에서, 모든는 Kubernetes 자원은 예를 들어, KubernetesClient 인스턴스에서 사용할 수 있습니다 :

  • client.namespaces ()

  • client.services ()

  • client.nodes ()

자원의 특성에 따라, 그 범위는 네임 스페이스를 할 수있다, 당신은 할 수 없습니다 :

  • client.pods (). inAnyNamespace을 ()

  • client.pods (). inNamespace ( "NS")

이 시점에서, 당신은이 작업을 호출 할 수 있습니다 : 

포드 목록 모든 공간의 모든 이름 :

client.pods().inAnyNamespace().list();

모든 포드 네임 스페이스 ns의에서 삭제 :

client.pods().delete(client.pods().inNamespace("ns").list().getItems());

创建一个名为ns的新名称空间:

client.namespaces()
  .createNew()
    .withApiVersion("v1")
    .withNewMetadata()
      .withName("ns")
    .endMetadata()
  .done();



제어 루프를 달성하기 위해,

원하는 상태로 조정할 모니터 클러스터의 상태를, 단지 하나 개의 제어 루프는 Kubernetes 컨트롤러를 해당 주. 일정 / 삭제 이벤트가 가능하도록하기 위해, 옵저버 패턴을 사용합니다. 가 발생할 때 응용 프로그램이 같은 사건에 가입되며, 관련 콜백이 트리거됩니다.

다음은 아주 간단한 API지도는 다음과 같습니다       

진정으로 모니터링 프로그램을 구현하려면 다음 코드 줄을 실행합니다 :

public class DummyWatcher implements Watcher<Pod> {

  @Override
  public void eventReceived(Action action, Pod pod) {
    switch (action) {
      case ADDED:    //注意1        
        break;
      case MODIFIED: //注意2       
        break;
      case DELETED:  //注意3
        break;
      case ERROR:    //注意4       
        break;
    }
  }

  @Override
  public void onClose(KubernetesClientException cause) {
           //注意5               
  }
}

client.pods()
  .inAnyNamespace()
  .watch(DummyWatcher());

注意:

  1. 새로운 포드 작품을 추가 할 때

  2. 기능 기존의 포드를 수정

  3. 때 포드의 작품을 삭제

  4. 오류가 발생하면 그것은 작동

  5. 어떤 자원을 청소합니다. 클라이언트가 제대로 닫혀있는 경우, 원인은 null가됩니다

구체적인 내용은

 

이제, 우리는 필요한 사이드카 모드를 달성하기 위해 모든 것을 갖추고 있습니다. HTTPS : 나는 GitHub의에서 찾을 수있는 모든 코드가 표시되지 않습니다 //github.com/nfrankel/jvm-controller을하지만, 중요한 내용의 일부를 강조하는 것이 중요하다.

1) 마크 사이드카

기본적으로 뷰어 필요가 새 포드를 추가 할 때 사이드카 포드를 추가하고, 당신이 그것을 제거 할 때를 제거합니다. 이 기본적인 접근은하지 작동합니다 : 당신은 사이드카 포드를 예약 할 경우, 관찰자를 트리거, 새로운 사이드카 포드 사이드카를 추가합니다. 그리고이 상황은 계속 될 것이다. 따라서, 라벨 사이드카 포드는 필수적이다. 포드 (pod)를 감지, 그것은 생성 로직 실행되지 않습니다.

표시 사이드카 포드의 몇 가지 방법이 있습니다 :

  • 사이드카 POD 플러스 특정 문자열의 이름 후, 예를 들어, 사이드카

  • 다음과 같은 특정 태그를 추가합니다

client.pods()
  .inNamespace("ns")
  .createNew()
    .withNewMetadata()
      .addToLabels("sidecar", "true")
    .endMetadata()
  .done();

2) 함께 포드와 함께 사이드카를 제거

포드는 사이드카해야한다. 위에서 언급 한 바와 같이 당신이 포드를 추가하고 후자를 삭제해야합니다 삭제할 ​​때, 그것은 만들어야합니다.

따라서, 기본 모음에 대한 참조는 사이드카에 부가되어야한다. 포드가 제거 될 때 사이드카가 아니라면 따라서, 우리는 사이드카 할당을 찾아서 삭제해야합니다.

주요 포드를 삭제할 때 첫 번째 방법은 명시 적으로 삭제 사이드카에 간단하다. 하지만이 많은 작업은 시간이 많이 소요된다. 는 Kubernetes는 다른 포드 포드 라이프 사이클에 라이프 사이클을 결합 할 수 있습니다. 그런 다음는 Kubernetes 자체로 논리적 인 처리를 삭제합니다. 이 ownerReference의 개념을 지원합니다.

API는 쉽게 구현할 수 있습니다 :

client.pods()
  .inNamespace("ns")
  .createNew()
    .withNewMetadata()
      .addNewOwnerReference()
        .withApiVersion("v1")
        .withKind("Pod")
        .withName(podName)
        .withUid(pod.getMetadata().getUid())
      .endOwnerReference()
    .endMetadata()
  .done();

3) 始终保持一个sidecar

사이드카를 추가하면 항상 그런 식으로 남아있을 것입니다 의미하지 않는다. 예를 들어, 배포에 속하는 포드 삭제할 수 있습니다. 배포 목표는 복사본의 수를 달성하기 위해, 포드를 다시 작성하는 것입니다.

주요 포드를 유지하면서 사이드카를 삭제하면 마찬가지로, 당신은 새로운 사이드카를 생성하기 위해 올바른 참조를 사용해야합니다.

 

결론

 

이 문서에서는, 우리는 JVM에서 자바 언어는 Kubernetes 컨트롤러를 사용하는 방법에 대해 설명합니다. Fabric8 API를 통해 작업이 달성하기 매우 간단합니다 . 극단적 인 경우에 스케줄러 / 삭제 로직에서 가장 큰 문제. 이 시리즈 (마지막) 문서의 기사에서, 우리는 마침내 배포하고 코드를 실행하는 방법을 볼 수 있습니다.

이 문서의 전체 소스 코드는 Github에서에 메이븐 형식에서 찾을 수 있습니다 :

https://github.com/nfrankel/jvm-controller

희망이 당신에게 유용 기사, 우리는 논의 할 수있는 코멘트 섹션을 환영합니다.

원본 : HTTPS : //blog.frankel.ch/your-own-kubernetes-controller/2/

【종료】

추천 도서 

지원 천만 규모의 분류 기술은 바이두는 패들 산업 깊은 학습 프레임 워크를 정의 비행

AIoT는 금융 수천만를 다시 작성 공업 기업의 칭화 과학 아빠 그룹 : 플레이어는 가장자리 AI 칩 알고리즘을 실행하기 위해 추진한다

기계 학습의 생물학 : PCA는 K-수단 후 게놈 서열 분석 COVID-19 방법 돌연변이를 사용하고 계십니까?

바이트 박동 무한 모집 2,000명, 제조업체가 짧은이 자바 건조, 당신을 제공에서! | 포스 프로그램

자신의는 Kubernetes 컨트롤러를 개발하기 위해 자바를 사용하여, 당신은 시도하려는?

모두가 "이더넷 광장 2.0 조각 디자인"을 읽을 수 있습니다

당신은 내가 즐겨 찾기로 심각하게, 모든 점에서 보면

참여 신속하게 원래의 텍스트를 읽기를 클릭!

출시 1887 원저 · 원 찬양 40000 + · 조회수 17,180,000을 +

추천

출처blog.csdn.net/csdnnews/article/details/105154339