저자 | 니콜라 프랭클
번역기 | 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());
注意:
새로운 포드 작품을 추가 할 때
기능 기존의 포드를 수정
때 포드의 작품을 삭제
오류가 발생하면 그것은 작동
어떤 자원을 청소합니다. 클라이언트가 제대로 닫혀있는 경우, 원인은 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 조각 디자인"을 읽을 수 있습니다
당신은 내가 즐겨 찾기로 심각하게, 모든 점에서 보면
참여 신속하게 원래의 텍스트를 읽기를 클릭!