Just Do It ! 행동하지 않으면 성공도 실패도 없다

Kafka Quotas, Latency

kafka client - quotas, latency https://aivarsk.com/2021/11/01/low-latency-kafka-producers/ What still makes me wonder is why librdkafka does not set TCP_NODELAY by default. Because they are doing something similar to Nagle’s algorithm in the library code by using linger.ms/ queue.buffering.max.ms settings and buffering messages. Long story short, to optimize producers for latency, you should set both: socket.nagle.disable = True queue.buffering.max.ms = 0 I think you should also set socket.nagle.disable for low latency consumers to deliver acknowledgments as soon as possible.

Kafka Encryption with SSL/TLS

Encryption with SSL/TLS mTLS kafka #!/usr/bin/env bash ############### Parameters ############### PASSWORD='password' VALIDITY=730 KAFKA_BROKER_COUNT=3 ############### Existing certs Cleanup ############### rm -rf ./certs && mkdir certs cd certs ############### Creating sslconfig file for CA ############### cat > "openssl.cnf" << EOF [req] default_bits = 4096 encrypt_key = no # Change to encrypt the private key using des3 or similar default_md = sha256 prompt = no utf8 = yes # Specify the DN here so we aren't prompted (along with prompt = no above).

Spring Kafka의 다양한 Listeners


Concourse 를 통한 CI/CD 파이프라인

Concourse 설치 Concourse 설치하는 방법은 여러가지가 있는데, 대표적으로 아래 두가지 방법이 있다. 테스트, 데모, PoC 용도로는 docker-compose를 사용할 수 있으며, 운영 서버로 구성하는 경우 서버에 설치하거나 Kubernetes 에 설치할 것을 권고한다. https://concourse-ci.org/docs.html Docker-compose docker-compose 를 사용해서 8080 포트로 concurse 를 실행할 수 있으며, docker-compose.yml 파일을 수정하여 포트나 인스턴스 수를 조정할 수 있다. wget https://concourse-ci.org/docker-compose.yml docker-compose up -d Kubernetes / Helm 쿠버네티스에 Helm 으로 설치할 경우, https://github.com/concourse helm repo add concourse https://concourse-charts.

NSX-T Advanced Load Balancer 를 사용한 쿠버네티스 워크로드 LB

Avi Networks Architecture https://avinetworks.com/docs/ako/0.8/ako-installation Avi Controller 전체 네트워크의 로드 발랜서, WAF, 방화벽, 인증서, 로깅/모니터링 등을 담당하는 컨트럴 플레인이다. Avi SE (Service Engine) 실제 트래픽이 전달되는 Virtual Server가 동작하는 엔진으로 데이터 플레인 역할을 한다. Avi Kubernetes Operator (AKO) Ingress controller : 쿠버네티스 인그레스와 avi lb 의 Pool과 Virtual Server 와 동기화를 통해서 인그레스에 외부 접속 점을 만들어준다 LB Network Policy

openssl로 TLS용 사설인증서 만들기

Https 서비스를 위한 TLS 인증서 만들기 https://github.com/jupilhwang/mk-ssl-cert-key $DOMAIN 값을 원하는 도메인(FQDN)으로 지정한다. export DOMAIN=example.com curl https://raw.githubusercontent.com/jupilhwang/mk-ssl-cert-key/master/mk-ssl-cert-key.sh | bash - #!/bin/bash set -e SCRIPTDIR=$(cd $(dirname "$0") && pwd -P) : ${DOMAIN:?must be set the DNS domain root (ex: example.com)} : ${KEY_BITS:=4096} : ${DAYS:=1825} # Generate CA Certificate openssl req -new -x509 -nodes -sha256 -newkey rsa:${KEY_BITS} -days ${DAYS} -keyout ${DOMAIN}.ca.key.pkcs8 -out ${DOMAIN}.ca.crt -config <( cat << EOF [ req ] prompt = no distinguished_name = dn [ dn ] C = KR O = Private CN = Autogenerated CA EOF ) # Generate Private key with CA Certificate key openssl rsa -in ${DOMAIN}.

Jenkins 파이프라인 to Build Image / Push Image on Kubernetes

Jenkins 설치 On K8s Prerequisites Docker pipeline plugin Google container registry for authenticate Kubernetes config Remote Docker Server docker daemon 에서 0.0.0.0:4243 을 추가해서 원격에서 tcp 로 접속할 수 있도록 한다. # File : /etc/default/docker DOCKER_OPTS="--dns 8.8.8.8 -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock" # File : /lib/systemd/system/docker.service EnvironmentFile=/etc/default/docker ExecStart=/usr/bin/docker -H fd:// $DOCKER_OPTS --containerd=/run/containerd/containerd.sock 또는 # File : /etc/docker/deamon.json .. "hosts": ["tcp://0.0.0.0:4243", "unix:///var/lib/docker.sock", "fd://"], .. # File : /lib/systemd/system/docker.service ExecStart=/usr/bin/docker --containerd=/run/containerd/containerd.sock 또는 ssh 로 접속하도록 할 수 있는데, 이 경우 ssh-copyid 로 미리 authorizedeky 로 등록 해 줘야한다.

jumpbox on vSphere for Tanzu

이 문서는 vsphere 환경에서 tanzu를 설치/설정하기 위해 사용하는 jumpbox 를 손쉽게 사용하기 위한 문서이다. deploy OVA 대체로 Private Cloud이든 Public Cloud이든 동일한 작업환경을 위해서 Jumpbox를 설치해서작업을 하며 Jumpbox로는 ubuntu server 를 많이 사용한다. 여기서도 ubuntu-server-20.04.1 (LTS) 을 기준으로 설명한다. https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.ova iso로 실제 ubuntu-server를 설치해도 되고, 이미 export 해놓은 ova를 업로드하여 사용할 수 있지만, Public internet이 되는 환경이라면 이미 만들어진 ubuntu-cloudimage 를 사용하는 것도 좋다. ubuntu cloud image는 https://cloud-images.ubuntu.com 에서 받을 수 있다.

TKG 1.2 설치/설정 : quick start

TKG Components Storage Class vSphere 에서 Storage를 사용하기 위해 Tag 기반의 policy 를 적용한 Datastore 를 사용한다. govc tags.category.create tkg-storage-category govc tags.create -c tkg-storage-category tkg-storage govc tags.attach tkg-storage /Datacenter/datastore/LUN01 tkg cluster 생성 시 자동으로 만들어 진 default sc 를 삭제하고 새로 생성한다. k delete sc default k apply -f -<<-EOF kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: default annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: csi.vsphere.vmware.com parameters: storagepolicyname: "TKG Storage Policy" # optional fstype: ext4 EOF MetalLB k apply -f https://raw.

HAProxy - dataplaneapi / Kubernetes - service-api

HA-Proxy SW loadbalancer로 제일 많이 사용하는 것 중에 한가지가 nginx나 haproxy 일것이다. http/s 위주의 서비스라면 nginx로 충분하겠지만, 범용으로 tcp/udp 서비스를 위한 Load Balancer 로 사용할려면 ha-proxy 를 사용하는 것이 좋다. 또는 envoy나 traefik 등을 사용할 수 있다. subject http https Latency (HTTP) Requests/Second 출처 : https://www.loggly.com/blog/benchmarking-5-popular-load-balancers-nginx-haproxy-envoy-traefik-and-alb/ 위의 Benchmark 자료를 보면 알 수 있듯이, envoy나 traefik이 요즘 유행하고 있지만, 역시 구관이 명관이다. 설정 reload haproxy.cfg /etc/haproxy/haproxy.cfg 에 haproxy 설정을 추가하고 변경된 설정을 적용하기 위해서 haproxy reload 를 해줘야 하는데, 설정이 자주 변경될 때 매번 haproxy 서버에 접속해서 haproxy.

LoadBalancer API for k8s

Service API https://github.com/kubernetes-sigs/service-api Network Operator LoadBalancer API

TLS with certbot

TLS Let’s Encrypted certbot certbot 설치 PIP로 설치 Package Management로 설치 Enable the universe repository sudo apt-get install software-properties-common sudo add-apt-repository universe sudo apt-get update Install certbot sudo apt install certbot certbot certonly --manual \ --preferred-challengers=dns \ --email jupil.hwang@gmail.com \ --server https://acme-v02.api.letsencrypt.org/directory \ --agress-tos \ -d *.harbor.lgvmw01.local

govc

govc OVA_Names=("photon-3-kube-v1.18.3-vmware.1" "photon-3-haproxy-v1.2.4-vmware.1") TKG_VM_FOLDER="tkg" govc folder.create "/${GOVC_DATACENTER}/vm/${TKG_VM_FOLDER}" for OVA_NAME in ${OVA_Names[@]}; do govc import.spec ${OVA_NAME}.ova | jq '.Name="OVA_NAME"' | jq '.NetworkMapping[0].Network="VM Network"' > ${OVA_NAME}.json sed -i 's|OVA_NAME|'${OVA_NAME}'|g' ${OVA_NAME}.json govc import.ova -options=${OVA_NAME}.json -folder="/${GOVC_DATACENTER}/vm/${TKG_VM_FOLDER}" ${OVA_NAME}.ova govc snapshot.create -vm ${OVA_NAME} initial govc vm.markastemplate ${OVA_NAME} done

TKG에 Antrea CNI 사용하기

Antrea Antrea 는 OVS(Open vSwitch)를 기본으로 하는 Kubernetes용 네트워킹 솔루션 이다. Layer3/4 역할을 담당하며, 보안과 운영상의 도움을 주도록 설계되었다. https://github.com/vmware-tanzu/antrea/ Prerequisites NodeIPAMController : K8s에서 enabled 되어 있어야 한다. kubeadm 으로 클러스터를 만들 떄 –pod-network-cidr 옵션이 있어야 한다 Open vSwitch kernel module 이 노드에 있어야 한다 Willam Lam 의 Antrea 설치 문서와 내부 자료를 참고했다. 설치 tkg의 새로운 Plan을 만든다. tkg는 ~/.tkg/providers/infrastructure-vsphere/v0.6.4/cluster-template-*.yaml 을 plan으로 사용하기 때문에 새로운 yaml을 만든다. 아래에서는 dev 파일을 기본으로 작업하는데, dev와 prod를 동시에 작업해 주는게 좋다.

TKG에 MetalLB

MetalLB # context kubectl config use-context my-cluster-admin@my-cluster ## MetalLB는 kube-proxy의 IPVS를 사용할 때 Strict ARP가 필요하다 kubectl get configmap kbue-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" | kubectl apply -f - -n kube-system kubectl create ns metallb-system # Deploy MetalLB kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.9.3/manifests/metallb.yaml -n metallb-system podsecuritypolicy.policy/controller created podsecuritypolicy.policy/speaker created serviceaccount/controller created serviceaccount/speaker created clusterrole.rbac.authorization.k8s.io/metallb-system:controller created clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created role.rbac.authorization.k8s.io/config-watcher created role.rbac.authorization.k8s.io/pod-lister created clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created rolebinding.

CF for K8s

Cloudfoundry 는 컨테이너 기반의 애플리케이션을 위한 플랫폼으로 PaaS 시장을 선도하고 있다. Heroku와 더불어 PaaS의 양대 산맥이라 할 수 있을 것이다. Cloudfoundry 는 자체 개발한 Garden이라고 하는 컨테이너 오케스트레이션 툴을 사용하였다. Kubernetes 가 등장하고 나서, 이 컨테이너 오케스트레이션 툴을 Kuberentes 으로 대체하는 프로젝트가 등장하였고, 마침내 cf-for-k8s 가 나왔다. 기존에 애플리케이션을 개발하여 손쉽게 배포하여 테스트하고 운영 하던 경험을 그대로 쿠버네티스에서도 경험할 수 있다. CloudFoundry for Kubernetes https://tanzu.vmware.com/developer/guides/kubernetes/cf4k8s-gs/ 그 동안 BOSH / Deigo 기반의 Cloudfoundry (이하 CF) 를 Kubernetes 기반으로 사용할 수 있다.

PowerCLI CORE for VMware

PowerShell Windows에서 만든 Shell로 OSS로 모든 OS에서 사용가능한 Shell이다. bash 나 다른 shell 에 비해서 많이 사용하지 않지만, 모든 OS에서 동작하는 스크립트를 만든다고 하면 좋은 대안이다. vSphere의 Automation 을 모듈인 PowerCLI는 PowerShell 기반으로 만들어져 있다. PowerShell 설치 Linux MacOS PowerCLI CORE 제공하는 Modules VMware.VimAutomation.Cis.Core VMware.VimAutomation.Common VMware.VimAutomation.Core VMware.VimAutomation.Nsxt VMware.VimAutomation.Vds VMware.VimAutomation.Vmc VMware.VimAutomation.Sdk VMware.VimAutomation.Storage VMware.VimAutomation.StorageUtility

vSphere with Kubernetes - Tanzu Kubernetes Cluster : 선언적(Declarative) GitOPS CD

GitOps ArgoCD Installation kubectl create ns argocd kubectl -n argocd apply -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml Disable auth flag kubectl patch deploy argocd-server -n argocd -p '[{"op": "add", "path": "/spec/template/spec/containers/0/command/-", "value": "--disable-auth"}]' --type json CD for Tanzu Kubernetes Cluster

vSphere with Kubernetes의 Master/Worker Node SSH 접속하기

vSphere with Kubernetes vSphere 7.0 vSphere 7.0의 가장 큰 차이라고 한다면 당연하게 Kubernetes의 지원이다. 기존에 가상 머신, 스토리지, 네트워크의 SDDC부분에 중점을 두었다면, 쿠버네티스를 사용한 메니지먼트로 다양한 환경에서 동일한 메니페스트를 통해 관리를 할 수 있도록 한 것이다. Supervisor Cluster vSphere 7.0 의 Supervisor 클러스터를 통해서 vSphere 전반적인 가상머신, vSphere Pod, Tanzu Kubernetes Cluster를 생성/삭제 등의 라이프사이클을 관리한다. 사용자/그룹 관리, SSO연계, 퍼미션 설정, 네임스페이스 관리 등을 한다. Supervisor 노드 접속 Supervisor노드에 접속하기 위해서

Kind를 이용한 쿠버네티스 클러스터 만들기

Kubernetes 개발환경 Vagrant vs Minikube vs Kind Local 환경에서 K8s를 사용하기 위해서 다양한 방법을 사용 할 수 있다. Vagrant Vagrant는 HashCorp에서 만든 프로비저닝 툴로, VagrantFile에 기본 이미지와 생성된 VM에 필요한 설정을 미리 Code화 해서 제공하는 툴이다. # vagrant cli 가 설치 되어야 한다. vagrant version # git cli 가 설치 되면 좋다. git version # 기본 가상화 솔루션으로 VirtualBox를 사용하기 때문에, VirtualBox가 미리 설치가 되어 있어야 한다. Hyper-V나 다른 가상화 툴을 사용할 수 있다.

Ventoy: Multiple Boot USB 디스크 생성툴

Multiple Boot USB 다른 툴들 OS 설치를 위해서 USB Disk가 필요한 경우가 가끔씩 있는데, 이런 때 마다 Windows, Linux (Archlinux, Ubuntu, CentOS etc..), MacOS (Hackintosh) 등을 위해서 USB Disk 를 만든다. 이러면 여러개의 USB를 가지고 있어야 하고, 불편하기도 하다. 이럴 때, 하나의 USB Disk 에 여러개의 OS 설치 디스크를 넣고 다니면 편하기도 하다. 대표적인 것들이 아래와 같은 툴들이 있다. Yumi : yumi MultibootUSB : multibootusb.org Ventoy 기존 툴과의 가장 큰 차이점은 기존 툴들이 ISO 압축을 해제하고, 압축 해제된 파일을 USB로 복사하는 방식이다.

PKS의 NSX에서 LB와 Ingress 사용

PKS와 네트워크 - PKS의 NSX에서 LB와 Ingress 사용 Network Profile 쿠버네티스 클러스터에서 사용할 네트워크를 위해 미리 프로파일을 생성해 놓고 PKS에서 클러스터를 만들 때 이 네트워크 프로파일을 지정할 수 있다. 기본 쿠버네티스 클러스터 속성 ubuntu@ubuntu-205:~/works/pks-network-profile$ pks cluster k8s --details PKS Version: 1.7.0-build.26 Name: k8s K8s Version: 1.16.7 Plan Name: Small UUID: a09dc43b-c1dc-42db-9fad-c00c2d3594f0 Last Action: CREATE Last Action State: succeeded Last Action Description: Instance provisioning completed Kubernetes Master Host: 10.195.70.136 Kubernetes Master Port: 8443 Worker Nodes: 2 Kubernetes Master IP(s): 10.

SpringBoot 2.3 과 R2DBC를 이용한 어플리케이션

SpringBoot 2.3 [참고 URL] https://docs.microsoft.com/en-us/azure/java/spring-framework/configure-spring-data-r2dbc-with-azure-mysql∏

Istio 1.5로 구성하는 서비스메시

Istio로 구성하는 서비스 메시 이전 Architecture 일반적으로 Istio의 구성요소라고 하면, 아래와 같이 이야기한다. Envoy Proxy Mixer Pilot Galley Citadel 하지만, Mixer로 인한 네트워크 레이턴시 성능 이슈가 있어서, 아키텍처가 변경이 되었는데 Mixer가 없어지고 Telemetry로 변경이 되고, Envoy Proxy 에서 바로 모니터링 솔루션우로 메트릭을 전송하는 형태로 변경이 되었다. 달라진 Architecture