kubernetes api 서버에 요청하는 예시이다. 

 

 

 

$ APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
$ TOKEN=$(kubectl get secret $(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.194.26.99:6443"
    }
  ]
}

 

 

 

 

$ curl $APISERVER/version --header "Authorization: Bearer $TOKEN" --insecure
{
  "major": "1",
  "minor": "11",
  "gitVersion": "v1.11.5",
  "gitCommit": "753b2dbc622f5cc417845f0ff8a77f539a4213ea",
  "gitTreeState": "xx",
  "buildDate": "xxxx",
  "goVersion": "go1xxxx",
  "compiler": "gc",
  "platform": "linux/amd64"
}

 

 

 

이제 swaggerapi를 호출한다. 어떤 api가 나오는지 보여준다. 다양한 api를 호출할 수 있다. 

 

 

$ curl $APISERVER/swaggerapi --header "Authorization: Bearer $TOKEN" --insecure
{
  "swaggerVersion": "1.2",
  "apis": [
   {
    "path": "/version",
    "description": "git code version from which this is built"
   },
   {
    "path": "/apis",
    "description": "get available API versions"
   },
   {
    "path": "/logs",
    "description": "get log files"
   },
   {
    "path": "/api/v1",
    "description": "API at /api/v1"
   },
   {
    "path": "/api",
    "description": "get available API versions"
   },
   {
    "path": "/apis/authentication.k8s.io/v1",
    "description": "API at /apis/authentication.k8s.io/v1"
   },
   {
    "path": "/apis/authentication.k8s.io/v1beta1",
    "description": "API at /apis/authentication.k8s.io/v1beta1"
   },
   {
    "path": "/apis/authentication.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/authorization.k8s.io/v1",
    "description": "API at /apis/authorization.k8s.io/v1"
   },
   {
    "path": "/apis/authorization.k8s.io/v1beta1",
    "description": "API at /apis/authorization.k8s.io/v1beta1"
   },
   {
    "path": "/apis/authorization.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/autoscaling/v1",
    "description": "API at /apis/autoscaling/v1"
   },
   {
    "path": "/apis/autoscaling/v2beta1",
    "description": "API at /apis/autoscaling/v2beta1"
   },
   {
    "path": "/apis/autoscaling",
    "description": "get information of a group"
   },
   {
    "path": "/apis/batch/v1",
    "description": "API at /apis/batch/v1"
   },
   {
    "path": "/apis/batch/v1beta1",
    "description": "API at /apis/batch/v1beta1"
   },
   {
    "path": "/apis/batch",
    "description": "get information of a group"
   },
   {
    "path": "/apis/certificates.k8s.io/v1beta1",
    "description": "API at /apis/certificates.k8s.io/v1beta1"
   },
   {
    "path": "/apis/certificates.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/extensions/v1beta1",
    "description": "API at /apis/extensions/v1beta1"
   },
   {
    "path": "/apis/extensions",
    "description": "get information of a group"
   },
   {
    "path": "/apis/networking.k8s.io/v1",
    "description": "API at /apis/networking.k8s.io/v1"
   },
   {
    "path": "/apis/networking.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/policy/v1beta1",
    "description": "API at /apis/policy/v1beta1"
   },
   {
    "path": "/apis/policy",
    "description": "get information of a group"
   },
   {
    "path": "/apis/rbac.authorization.k8s.io/v1",
    "description": "API at /apis/rbac.authorization.k8s.io/v1"
   },
   {
    "path": "/apis/rbac.authorization.k8s.io/v1beta1",
    "description": "API at /apis/rbac.authorization.k8s.io/v1beta1"
   },
   {
    "path": "/apis/rbac.authorization.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/scheduling.k8s.io/v1beta1",
    "description": "API at /apis/scheduling.k8s.io/v1beta1"
   },
   {
    "path": "/apis/scheduling.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/storage.k8s.io/v1",
    "description": "API at /apis/storage.k8s.io/v1"
   },
   {
    "path": "/apis/storage.k8s.io/v1beta1",
    "description": "API at /apis/storage.k8s.io/v1beta1"
   },
   {
    "path": "/apis/storage.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/apps/v1",
    "description": "API at /apis/apps/v1"
   },
   {
    "path": "/apis/apps/v1beta2",
    "description": "API at /apis/apps/v1beta2"
   },
   {
    "path": "/apis/apps/v1beta1",
    "description": "API at /apis/apps/v1beta1"
   },
   {
    "path": "/apis/apps",
    "description": "get information of a group"
   },
   {
    "path": "/apis/admissionregistration.k8s.io/v1beta1",
    "description": "API at /apis/admissionregistration.k8s.io/v1beta1"
   },
   {
    "path": "/apis/admissionregistration.k8s.io/v1alpha1",
    "description": "API at /apis/admissionregistration.k8s.io/v1alpha1"
   },
   {
    "path": "/apis/admissionregistration.k8s.io",
    "description": "get information of a group"
   },
   {
    "path": "/apis/events.k8s.io/v1beta1",
    "description": "API at /apis/events.k8s.io/v1beta1"
   },
   {
    "path": "/apis/events.k8s.io",
    "description": "get information of a group"
   }
  ],
  "apiVersion": "",
  "info": {
   "title": "",
   "description": ""
  }
 }

Posted by 김용환 '김용환'

kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}'

Posted by 김용환 '김용환'

 

구글이 대단한 회사이지만 어쩌면 이런 부분은 우리 나라와 비슷한 건 아닐까 생각이 들었다. 

 

원격 협업이라는게 원래 어렵다는 점이다. 그냥 참고 하는 것 같다는 생각도 든다.

 

특이한 점은 플레이북(playbook)으로 가이드한다는 점이 눈에 띈다.

 

 

https://www.blog.google/inside-google/working-google/working-together-when-were-not-together/

 

원격 협업은 어렵고, 로컬 협업은 좋다. 그래서 멀리 떨어진 사무실 간의 협업을 위해 개인사 질문(주말에 머했는지) 등을 물어보라고 가이드를 한다. 업무 시간을 가정하는 대신 동료와 상담할 때 시간을 내어 동료에게 물어보라고 가이드한다. 

대면하는것이 더 좋을 수 있으니 직접 회의를 위해 여행하는 것도 추천한다.

 

 

Posted by 김용환 '김용환'

(kafka connect)debezium에서 DB를 읽을 때 해당 데이터에 대한 토픽이름이 조금 길다.

 

"서버이름.로지컬DB이름.테이블이름" 인데.

 

이를 다음과 같은 설정을 사용해 '테이블 이름'만 토픽 이름으로 지정할 수 있다.

 

실제로 이렇게 써야 괜찮다.

        "transforms": "route",
    "transforms.route.type": "org.apache.kafka.connect.transforms.RegexRouter",
    "transforms.route.regex": "([^.]+)\\.([^.]+)\\.([^.]+)",
    "transforms.route.replacement": "$3"

 

 

참고

https://debezium.io/docs/connectors/mysql/

https://debezium.io/docs/configuration/topic-routing/

 

 

 

Posted by 김용환 '김용환'

schema-registry HA 이슈

kafka 2019.04.05 15:50

 

 

schema-registry는 distributed mode(clustering mode)로 실행 중인데.. 1대가 이유가 죽고 있다.


[2019-04-05 15:06:07,189] WARN [Consumer clientId=consumer-1, groupId=connect-cluster] 9 partitions have leader brokers without a matching listener, including [connect-offsets-0, connect-offsets-15, connect-offsets-9, connect-offsets-3, connect-offsets-24, connect-offsets-18, connect-offsets-12, connect-offsets-6, connect-offsets-21] (org.apache.kafka.clients.NetworkClient:1012)
[2019-04-05 15:06:07,279] ERROR Uncaught exception in herder work thread, exiting:  (org.apache.kafka.connect.runtime.distributed.DistributedHerder:227)
org.apache.kafka.common.errors.TimeoutException: Failed to get offsets by times in 30001ms
[2019-04-05 15:06:07,281] INFO Kafka Connect stopping (org.apache.kafka.connect.runtime.Connect:65)
[2019-04-05 15:06:07,286] INFO Stopping REST server (org.apache.kafka.connect.runtime.rest.RestServer:226)
[2019-04-05 15:06:07,292] INFO Stopped http_8083@724c5cbe{HTTP/1.1,[http/1.1]}{0.0.0.0:8083} (org.eclipse.jetty.server.AbstractConnector:341)
[2019-04-05 15:06:07,293] INFO node0 Stopped scavenging (org.eclipse.jetty.server.session:167)
[2019-04-05 15:06:07,310] INFO Stopped o.e.j.s.ServletContextHandler@3fd2322d{/,null,UNAVAILABLE} (org.eclipse.jetty.server.handler.ContextHandler:1040)
[2019-04-05 15:06:07,312] INFO REST server stopped (org.apache.kafka.connect.runtime.rest.RestServer:244)
[2019-04-05 15:06:07,312] INFO Herder stopping (org.apache.kafka.connect.runtime.distributed.DistributedHerder:398)
[2019-04-05 15:06:12,313] INFO Herder stopped (org.apache.kafka.connect.runtime.distributed.DistributedHerder:418)
[2019-04-05 15:06:12,313] INFO Kafka Connect stopped (org.apache.kafka.connect.runtime.Connect:70)

키프카 커넥트에서 사용하는 카프카  관리 topic에 이슈가 있어서 발생한 것이다.  topic 이름을 지우거나 새로 생성하거나 변경하니 문제가 발생하지 않는다.

config.storage.topic=connect-configs
offset.storage.topic=connect-offsets
status.storage.topic=connect-statuses

3가지 토픽은 카프카 커넥트에서 관리하는 토픽이다.
카프카 커넥트를 distributed 모드로 실행하면 분산 태스크는 카프카 토픽 정보에 커넥터와 태스크 설정, 커넥터 오프셋, 커넥터 상태 정보를 저장한다.

카프카 커넥트(distributed 모드)를 실행하려 할때, 세 개의 내부 토픽을 확인한다. 만약 토픽이 없으면 주어진 설정을 기반으로 생성한다. 토픽에 주어진 replication, partition 등이 설정으로 있으면 설정한다. 만약 아래 설정이 주어지지 않으면 카프카의 auto 생성 설정 규칙에 따라 생성된다.

config.storage.replication.factor=1
offset.storage.replication.factor=1
status.storage.replication.factor=1

offset.storage.partitions=25
status.storage.partitions=5

 

 

 

Posted by 김용환 '김용환'

java.lang.RuntimeException: Missing scala-library.jar    

불러오는 중입니다...

 

build.sbt 파일의 스칼라 버전이 실제로 로컬에 저장되어 있지 않으면. 에러가 난다.

 

즉 build.sbt 파일에는 2.11.11을 적어두고 로컬 머신에 2.11.8이 설치되어 있을 때 .sbt 에러가 발생할 수 있다.

scalaVersion := "2.11.11"

 

 

scalaVersion := "2.11.11"을 scalaVersion := "2.11.8"로 변경하든지 scala 2.11.11로 설치하면 된다.

Posted by 김용환 '김용환'