분류 전체보기 67

Strimzi Kafka Operator의 kafka connect로 Mysql to Postgres migration

kafka connect란 일종의 api 서버로서, 카프카의 클라이언트를 대신하여 데이터를 브로커에게 pub/sub 한다. connect와 connector, schema registry에 관한 것은 스킵하겠다. 모르겠으면 구글링! 아니면 조만간 내가 글을 쓰고 여기에 링크를 걸든가.. 쉽게 생각하면 여러 개의 클라이언트가 난잡하게 카프카 브로커에 접근하는 것을 카프카 커넥트라는 api 서버가 통합 관리하는 것이라 생각하면 된다. 그리고 그 api 서버에 뚫려있는 api가 connector이다! ======= 이 글의 목적은 k8s 환경에서 strimzi kafka operator를 이용하여 kafka 및 kafka connect를 프로비저닝 한 뒤, 같은 k8s 환경에 존재하는 mysql로부터 post..

공부/Kafka 2022.03.18

Kubernetes Local PV

개념 rook-ceph 같은 모듈을 사용하지 않고, k8s 클러스터를 구성하는 노드들의 로컬 스토리지를 볼륨으로서 이용하는 방법이 있다. 바로 LocalPV이다. HostPath와 LocalPV를 헷갈릴 수 있는데, 둘의 가장 큰 차이점은 쿠버네티스 스케줄러가 PV가 어느 노드에 속한지를 알고있다는 것이다. HostPath의 경우에는 pod가 재기동 될 때, 다른 노드에 스케줄링이 될수 있기 때문에 정상 동작을 보장할 수 없다. 하지만 LocalPV는 쿠버네티스 스케줄러가 PV의 위치를 고려해서 pod의 스케줄링을 해준다. 역으로 생각하면 pod가 특정 노드에 뜨도록 강제할 수도 있다는 것이다. 물론 NodeSelector를 사용하는 방법도 있지만, statefulset 같이 pod를 개별적으로 설정하기..

공부/Kubernetes 2022.03.07

ingress nginx controller port(tcp) based routing

Ingress는 기본적으로 L7 레이어 즉, http기반의 라우팅을 해준다. 아래 yaml 예시 처럼 path 하나가 이미 특정 서비스의 "포트"까지 바인딩 되어있다. ... spec: rules: - http: paths: - path: /togomi/ backend: serviceName: my-service servicePort: 11037 ... 하지만 port를 직접 명시하길 원하는 경우가 있을 수도 있다. 나의 경우에는 redis-cli를 이용해 클러스터링을 하는데에 필요했다. 깊게 따져보면 redis-cli의 잘못이긴 하지만, 옵션으로 넘겨주는 호스트 형식이 반드시 {IP}:{PORT}여서 L7 라우팅으로는 할 수 없었다. 아무튼 port based routing을 해보자. TCP routi..

공부/Kubernetes 2022.02.24

k8s dockerhub imagePullSecrets 만들기 및 적용

아래와 같은 에러로 dockerhub에서 이미지를 받아오는데 실패하는 때가 있다. toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit dockerhub는 IP기반으로(정확하진 않음) pull limit을 제한 한다. 정책은 아래와 같다. 로그인하지 않거나 따로 결제를 하지 않은 계정은 6시간에 200회 제한이 있다. 어쨌든 지불한 계정이 있다고 가정하고, 로그인을 해보자. 단순하게 docker 자체만 이용하는거면 docker login 명령어를 통해서 하면 되지만, k8s의 ..

공부/Kubernetes 2022.02.08

ubuntu에 특정 k8s, crio 버전 설치하기

회사에서는 centOS를 사용하는데, 개인 서버에서는 우분투를 깔아놔서 설치법이 조금 달라서 애먹었다. 게다가 docker가 아닌 crio라서 조금 더 힘들었음 설치 버전 ubuntu 18.04 kubernetes 1.19.4 crio 1.19.2 아래 명령어를 통해 자신의 OS 버전 확인 가능 cat /etc/os-release 설치 순서(공통) swap 파티션 비활성화 sudo swapoff -a vi /etc/fstab /etc/fstab 파일의 swap 관련 부분을 주석처리 한다. /swapfile ~ 부분 # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier fo..

공부/Kubernetes 2022.01.03

k8s QoS Class

개념 k8s에서 pod에는 QoS Class라는 것이 있다. Qos는 Quality of Service의 약자로서 서비스 품질이라는 뜻이며, k8s에서 pod의 스케줄링과 제거 우선순위를 판단하는데 사용되는 값이다. 종류는 세 가지뿐이다. - Guaranteed - Burstable - Best-Effort 동작 방식 노드에 가용 리소스가 부족해지면 누군가는 희생되어야 한다. 이 때, k8s 스케줄러는 QoS Class를 보고 어떤 pod를 희생시킬지 판단한다. kubelet은 Best-Effort를 가장 먼저 종료 시키고, Best-Effort가 없다면 Burstable을 강제 종료 시킨다. 간단히 설명하면 위와 같지만 정확히 설명하자면, QoS Class를 보고 판단하다기 보다는 QoS Class에 ..

공부/Kubernetes 2022.01.03

secret 생성 시 주의사항

redis 관련 업무를 하다가 환경변수를 secretKeyRef을 이용할 상황이 생겼다. env: - name: REDIS_PASSWORD valueFrom: secretKeyRef: name: redis-secret key: redis-password 그런데 아무리 제대로 해봐도 에러가 나는 것이다. 열심히 구글링 한 결과, 원인은 개행문자였다. 아래 두 시크릿을 만들어보자. apiVersion: v1 kind: Secret metadata: name: sample-secret type: Opaque stringData: sample-key: | sample-value --- apiVersion: v1 kind: Secret metadata: name: sample-secret2 type: Opaque..

공부/Kubernetes 2021.11.17

k8s 공식문서 contribution 메인 브랜치에 merge!!

사실 main 브랜치에는 진작에 병합 됐었다. 그런데 github contributor에서 내 이름을 찾을 수 없었다ㅠㅠ 찾아보니 상위 100명의 기여자만 보여준다고 한다. 심지어는 날짜를 내가 commit한 날짜로 좁혀도 안나오는데, 전체 상위 100명 기준으로 그 기간사이에 다시 재정렬 하는 것이기 때문에 난 나오지가 않는다고 한다.. 즉, 그 기간내의 상위 100명이 아니라 전체 상위 100명의 그 기간 내의 순위다... 그래서 시무룩했는데 공식문서 맨 아래에 해당 페이지의 최신 업데이트 내역이 남아있었다. 그리고 떡하니 내 커밋 로그가 링크로 연결되어있다!! https://github.com/kubernetes/website/commit/4a275f1426edcc1a6041484a611457e8c..

공부/Kubernetes 2021.10.22

golang convert json to interface

go에서 json을 파싱할때 struct 구조를 모르거나, 키값 하나만 필요한데 struct는 너무 커서 곤란할 때가 있다. 그럴 땐 interface를 통해 파싱하면 간편하다. exampleJson이라는 변수에 json string이 담겨있다고 가정했을 때, 아래 코드로 파싱 가능하다. const exampleJson = `{"kind":"Event","apiVersion":"events.k8s.io/v1"}` var result map[string]interface{} if err := json.Unmarshal([]byte(exampleJson), &result); err != nil { panic(err) } fmt.Println(result["kind"]) // Event 출력 fmt.Print..

공부/Go 2021.10.20