K8s-one-line-Challenge

잔잔한 호수에 돌맹이는 내가던졌다. K8s의 Service는 selector 에서 지정한 label로 pod에게 트래픽을 흘린다. 그런데 아이러니하게도 service 에서 연결된 pod를 한번에 조회할순 없다. service 에서 selector 나 endpoint를 확인해서 labels 를 보고 확인해야 한다. 그 과정을 한번 보자. my-service1 이라는 서비스에서 사용하는 pod를 조회할꺼다. k get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 198.19.128.1 <none> 443/TCP 2d13h <none> my-service1 NodePort 198.19.231.233 <none> 80:30001/TCP 2d12h app=my-nginx1 my-service2 NodePort 198.19.172.176 <none> 80:30002/TCP 2d12h app=my-nginx2 my-service3 NodePort 198.19.200.20 <none> 80:30003/TCP 2d12h app=my-nginx3 k get pods -l app=my-nginx1 --show-labels NAME READY STATUS RESTARTS AGE LABELS my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h app=my-nginx1,pod-template-hash=67f499d79c ```bash kubectl. 에서 svc 를 get하고 -o wide 명령어를 쓰면 selector 가보인다. 거기서 get pod -l app=my-nginx1 이라 일일이 지정해줘야지만 확인할수 있다. 명령어 두줄치면 되긴한데 귀찮다. 이렇게 된이상 한줄치기는 물러설수 없다. ![](/images/2021/07/image.png) 미끼를 물어주신 iamai 님께 감사를 드린다. - 재차 감사! - 예아! ```bash kubectl get endpoints |grep my-service1 |awk '{print $2}'|tr "," "\ " |awk -F":" '{print $1}' |grep -f - <(kubectl get po -o wide) my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h 198.18.0.74 nks-pool-1119-w-gzg <none> <none> my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h 198.18.2.250 nks-pool-1119-w-gzh <none> <none> my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h 198.18.1.208 nks-pool-1119-w-gzi <none> <none> ```bash endpoint 에서 조회된 IP를 awk 로 떼어서 한줄씩으로 변환후 포트를 제거한다. 그리고 pod list 에서 IP가 grep 된 줄만 출력한다. ```bash [root@linuxer-bastion ~]# kubectl get endpoints NAME ENDPOINTS AGE kubernetes 10.0.12.10:6443,10.0.12.11:6443,10.0.12.16:6443 2d13h my-service1 198.18.0.74:80,198.18.1.208:80,198.18.2.250:80 2d13h my-service2 198.18.0.173:80,198.18.1.155:80,198.18.2.120:80 2d13h my-service3 198.18.0.6:80,198.18.1.139:80,198.18.2.70:80 2d13h [root@linuxer-bastion ~]# kubectl get endpoints |grep my-service1 my-service1 198.18.0.74:80,198.18.1.208:80,198.18.2.250:80 2d13h [root@linuxer-bastion ~]# kubectl get endpoints |grep my-service1 |awk '{print $2}' 198.18.0.74:80,198.18.1.208:80,198.18.2.250:80 [root@linuxer-bastion ~]# kubectl get endpoints |grep my-service1 |awk '{print $2}'|tr "," "\ " 198.18.0.74:80 198.18.1.208:80 198.18.2.250:80 [root@linuxer-bastion ~]# kubectl get endpoints |grep my-service1 |awk '{print $2}'|tr "," "\ " |awk -F":" '{print $1}' 198.18.0.74 198.18.1.208 198.18.2.250 [root@linuxer-bastion ~]# kubectl get endpoints |grep my-service1 |awk '{print $2}'|tr "," "\ " |awk -F":" '{print $1}' |grep -f - <(kubectl get po -o wide) my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h 198.18.0.74 nks-pool-1119-w-gzg <none> <none> my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h 198.18.2.250 nks-pool-1119-w-gzh <none> <none> my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h 198.18.1.208 nks-pool-1119-w-gzi <none> <none> [root@linuxer-bastion ~]# kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES busybox 0/1 Init:0/2 0 26h 198.18.2.60 nks-pool-1119-w-gzh <none> <none> my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h 198.18.0.74 nks-pool-1119-w-gzg <none> <none> my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h 198.18.2.250 nks-pool-1119-w-gzh <none> <none> my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h 198.18.1.208 nks-pool-1119-w-gzi <none> <none> my-nginx2-659945d9d8-2sggt 1/1 Running 1 26h 198.18.1.155 nks-pool-1119-w-gzi <none> <none> my-nginx2-659945d9d8-cjkft 1/1 Running 0 26h 198.18.2.120 nks-pool-1119-w-gzh <none> <none> my-nginx2-659945d9d8-szw59 1/1 Running 0 26h 198.18.0.173 nks-pool-1119-w-gzg <none> <none> my-nginx3-694994cd8c-l4m6k 1/1 Running 1 26h 198.18.1.139 nks-pool-1119-w-gzi <none> <none> my-nginx3-694994cd8c-lbqsd 1/1 Running 0 26h 198.18.2.70 nks-pool-1119-w-gzh <none> <none> my-nginx3-694994cd8c-xjzkc 1/1 Running 0 26h 198.18.0.6 nks-pool-1119-w-gzg <none> <none> nginx 1/1 Running 0 26h 198.18.0.80 nks-pool-1119-w-gzg <none> <none> ```bash 이해를 돕기위해 결과를 한줄씩 쳐서 출력했다. iamai 님의 shell에 대한 이해도를 볼수있었다. 나는 grep를 쓰지않고 출력하고 싶었다. 여러 엔지니어들을 보면 jsonpath로 예쁘게 깍는것이 부러웠다. 방법은 다양했다 json | jq 부터 jsonpath custom-columns 까지 방법이 많은데 나도 한번 써볼까 싶었다. ```bash k get pod -l $(k get svc my-service1 -o=jsonpath='{..selector}' | sed 's/map//' | sed 's/:/=/' | tr -s '[[:space:]]' ' ') --show-labels NAME READY STATUS RESTARTS AGE LABELS my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h app=my-nginx1,pod-template-hash=67f499d79c ```bash 시작부터 iamai 님과의 다른접근을 볼수있다. 나는 label로 접근했고, iamai 님은 IP로 접근했다. selector 는 label을 기반으로 pod와 매핑되기때문에 IP가 우선이 되서는 안된다 생각했다. IP는 고정된 값이 아니므로. 그래서 label 을 사용하기로 생각했다. ```bash [root@linuxer-bastion ~]# k get svc my-service1 -o=jsonpath='{..selector}' map[app:my-nginx1] [root@linuxer-bastion ~]# k get svc my-service1 -o=jsonpath='{..selector}' | sed 's/map//' [app:my-nginx1] [root@linuxer-bastion ~]# k get svc my-service1 -o=jsonpath='{..selector}' | sed 's/map//' | sed 's/:/=/' [app=my-nginx1] [root@linuxer-bastion ~]# k get svc my-service1 -o=jsonpath='{..selector}' | sed 's/map//' | sed 's/:/=/' | tr -s '[[:space:]]' ' ' app=my-nginx1 ```bash 먼저 jsonpath를 이용하여 service의 selector를 찾는다 여기서 sed 명령어로 map[app:my-nginx1] 이라는 문자열을 두번 파이프라인하여 [app=my-nginx1]로 변환된다. json으로 출력한 문자열은 = -> : 으로 치환되어 표기된다. 그래서 변경해줘야 했다. 괄호를 벗겼다. 괄호를 벗은 값은 내가 처음부터 원했던 service - selector - label 이다. 이제 이값을 이용해서 pod 를 리스팅 하고 label를 보면 완성이다. ```bash k get pod -l $(k get svc my-service1 -o=jsonpath='{..selector}' /| sed 's/map//' | sed 's/:/=/' | tr -s '[[:space:]]' ' ') --show-labels NAME READY STATUS RESTARTS AGE LABELS my-nginx1-67f499d79c-g7vr7 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-j4f9k 1/1 Running 0 26h app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-mqxzs 1/1 Running 1 26h app=my-nginx1,pod-template-hash=67f499d79c ```bash 내가 작성한 스크립트는 폰트크기 15다 ```bash k get ep -o custom-columns=IP:.subsets[].addresses[].ip IP 10.0.12.10 198.18.0.74 198.18.0.173 198.18.0.6 ```bash 성주님께서 주신 IP 추출 팁 오랜만에 머리를 굴렸더니 재미있었다. 오늘도 같이 머리를 싸매서 고민을 해주신 봄님, iamai 님, 성주님께 감사를 드린다. 더좋은 아이디어나 생각이 있다면 얼른 결과를 공유해주시길 바란다! 즐거운 새벽되시라! 하고 누우려는데 성주님께서 주신 IP list 로 하나더 만들고 싶었다. ```bash k get ep my-service1 -o custom-columns=IP:.subsets[].addresses[*].ip | tr "," "\ " | grep -v IP | grep -f - <(kubectl get po -o wide --show-labels) my-nginx1-67f499d79c-g7vr7 1/1 Running 0 27h 198.18.0.74 nks-pool-1119-w-gzg <none> <none> app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-j4f9k 1/1 Running 0 27h 198.18.2.250 nks-pool-1119-w-gzh <none> <none> app=my-nginx1,pod-template-hash=67f499d79c my-nginx1-67f499d79c-mqxzs 1/1 Running 1 27h 198.18.1.208 nks-pool-1119-w-gzi <none> <none> app=my-nginx1,pod-template-hash=67f499d79c ```bash 성주님+iamai님의 조언을 합쳤다 중간에 grep -v IP 는 내 생각이다. 시원하게 끝내고 잔다! 정말로 좋은새벽되시라.

July 22, 2021 · 5 min · 📁 Linux, Kubernetes

Ping-MTU-test

MTU 9000 이상을 점보프레임이라 부른다. 점포프레임이 정상적으로 전송되는지 확인하는 방법이다. ping -M do -s 1472 google.com PING google.com (172.217.175.110) 1472(1500) bytes of data. 76 bytes from nrt20s21-in-f14.1e100.net (172.217.175.110): icmp_seq=1 ttl=114 (truncated) 76 bytes from nrt20s21-in-f14.1e100.net (172.217.175.110): icmp_seq=2 ttl=114 (truncated) 76 bytes from nrt20s21-in-f14.1e100.net (172.217.175.110): icmp_seq=3 ttl=114 (truncated) ```bash 1500에 맞춰서 google로 보내면 정상적으로 간다. ```bash ping -M do -s 1473 google.com PING google.com (172.217.175.110) 1473(1501) bytes of data. ^C --- google.com ping statistics --- 45 packets transmitted, 0 received, 100% packet loss, time 43999ms ```bash 1501 은 가지 않는다. 대부분의 클라우드 내부의 이더넷은 점보프레임이 설정되어 있으며 9000이상이다. ```bash ifconfig | grep -i MTU | grep eth eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 8950 ```bash 외부망으론 1500까지만 전송됨을 확인하였으니 내부망에서 MTU를 확인한다. ```bash ping -M do -s 8922 10.0.12.13 PING 10.0.12.13 (10.0.12.13) 8922(8950) bytes of data. 8930 bytes from 10.0.12.13: icmp_seq=1 ttl=64 time=0.491 ms 8930 bytes from 10.0.12.13: icmp_seq=2 ttl=64 time=0.431 ms 8930 bytes from 10.0.12.13: icmp_seq=3 ttl=64 time=0.483 ms ```bash 잘된다. 인터페이스에 지정된 MTU는 8950이다. ping에선 IP Header(20 Bytes) + ICMP Header(8 Bytes) 28 Bytes 를 뺀 숫자가 ICMP Data 크기이다. 그래서 Ping 로 MTU 테스트할땐 실제 MTU-28을 하여 테스트하면된다.

July 7, 2021 · 1 min · 📁 Linux

linux-sed

일반적으로 sed를 쓸때 나는 sed s/원문/치환/ 파일 ```bash 이런식으로 사용했다. 그런데 만약에 변경할것이 /var/log 에서 /var/log2로 변경한다면 ```bash sed s/₩/var₩/log/₩/var₩/log2/ 파일 ```bash 이런식으로 sed의 구분자를 회피하기위해 ₩/ 과같은 역슬러쉬를 사용해야 했다. 그런데 오늘 혁신을 맛봤다. ```bash sed "s|/var/log|/var/log2|" 파일 ```bash / 대신 |를쓰면 ₩/를 일일이 쓸필요가 없다.. 하..지금까지의 내 하드코딩 돌려줘ㅠㅠ 후에 게시물을 공유하고 ![](/images/2021/06/image.png) "In a context address, any character other than a backslash (``\\'') or newline character may be used to delimit the regular expression." sed man 에 백슬러쉬랑 엔터 빼고 다된다는 이야기를 들었다..ㅠㅠㅠㅠㅠㅠ 진작알았다면 좋았을껄..ㅠㅠㅠㅠㅠㅠㅠㅠ

June 28, 2021 · 1 min · 📁 Linux

kubernetes-CentOS7-install

작년 10월 작성했던 install script가 달라졌다. <#!/bin/sh setenforce 0 sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux swapoff -a modprobe br_netfilter echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF yum install -y kubelet kubeadm kubectl sed -i "s|ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock|ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd|" /usr/lib/systemd/system/docker.service echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p systemctl enable docker systemctl enable kubelet ```bash . 큰 틀의 변화라면 작년의 클러스터 설치에선 kubeadm.conf 에서 docker와 kube의 cgroup을 변경해주는 방식이 었다면 근래에는 Docker의 Cgroup를 변경해야한다. ```bash error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs" ```bash . 그렇지 않으면 위와같은 에러가 발생한다. 이에러를 피하기위해 sed 로 Docker의 systemctl service file에서 docker exec 구문에 --exec-opt native.cgroupdriver=systemd native driver의 실행을 수정해 주면된다. 변경된지 확인하는방법은 ```bash docker info | grep systemd Cgroup Driver: systemd ```bash . 명령어로 cgroup 를 확인할수 있다. 여기까지 확인되었으면, 작업한 Server의 스냅샷을 생성후, 스냅샷을 기반으로 워커노드3대를 생성한다. 위에작성한 스크립트는 init script 에서도 프로비저닝시에 사용할수있도록 만들었으니 그냥 사용해도 된다. 스냅샷이 잘 생성되면 kubectl init 를 하자. ```bash kubeadm init --pod-network-cidr=10.254.0.0/16 ```bash . init 가 끝나면 config 를 복사해준다 ```bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf ```bash . 명령어로 복사를한다. 설치과정에서 프린팅된다 admin.conf 까지 같이 export 한다. ```bash You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.10.9:6443 --token 6ghues.yxwqnp87920d4arm \\ \t--discovery-token-ca-cert-hash sha256:49c750f19ef34b5f3ab73ceb91a2ce540a65418b693c24a1ee5acaeee2e80972 ```bash . 다음과 같은 내용이 프린팅되는데 join 부분만 쓰면된다. woker node에서 join한다 ```bash [preflight] Running pre-flight checks \t[WARNING Hostname]: hostname "k8s-worker-003" could not be reached \t[WARNING Hostname]: hostname "k8s-worker-003": lookup k8s-worker-003 on 169.254.169.53:53: no such host [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster. ```bash . 다음 메시지가 나오면 정상적으로 클러스터가 셋팅된 것이다. ```bash echo 'source <(kubectl completion bash)' >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl echo 'alias k=kubectl' >>~/.bashrc echo 'complete -F __start_kubectl k' >>~/.bashrc ```bash . bash 에서 shell 자동완성 설정까지 넣어주면 완성이다. TAB을 이용한 자유를 누려보자!

June 28, 2021 · 3 min · 📁 Linux, Kubernetes

Basic-Docker

오랜만의 블로깅이다. 오랜만에 글을 쓰는것은 Docker 다. 간단히 도커 설치부터 이야기를 해보겠다. 나는 Redhat 계열의 리눅스를 좋아하므로 Centos7 로 진행하려 한다. yum 으로 도커를 설치할건데, 몇가지를 선택해야 한다. 도커를 제공하는 레포는 여러가지가 있는데, 나는 Centos 의 Extra repo를 좋아한다. 다른레포를 사용하지 않고 그냥 바로 설치 할수 있기 때문이다. https://docs.docker.com/engine/install/centos/ 다음 URL을 참고하자. 물론 최신버전과는 거리가 좀 많다. Extra repo 는 1.13버전을 제공하며, 현재 Docker-ce repo에서 제공하는 버전은 1.20다. Docker를 사용하기 위해선 6개의 패키지가 필요하다. ...

June 19, 2021 · 3 min · 📁 Linux

Linux-one-line-Challenge

리눅서들은 이상한 것에 집착하곤 한다. 한줄 명령어가 그 중 하나이다. 보통 그렇다. 이런 아무렇지 않은 질문으로 시작한다. 질문은 곧 챌린지가 되고 도전이 시작된다. 적당히 조언했던것이.. 다른 분의 참전으로 새로운 측면을 맞이한다. ls -lt 는 시간순 정렬이다. 대충이라고 하셨지만 골자는 이렇다. ls -ptl 은 파일의 최신순서대로 정렬해서 보여준다. 거기에 / 디렉토리를 빼고 토탈을 빼는 방식이다. 물론 이런것들이 한방에 되진 않는다. 여러 가지 조언을했지만 사실 말처럼 쉽게 되지 않는다. 그저 제한사항 들을 확인하는 것이다. ...

April 7, 2021 · 1 min · 📁 Linux · 🏷️ shell, linux, bash

Linux-bashtop

bashtop&bpytop 이 핫해서 centos 7 에서 설치했습니다. bashtop 은 bash 4.4 이상 bpytop는 python3이상입니다. 오늘 저는 bashtop를 사용해볼까 합니다. 먼저 bash 5.0을 설치 하려 합니다. cd /usr/local/src/ wget http://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz tar zxvf bash-5.0.tar.gz cd bash-5.0/ ./configure && make && make install mv /bin/bash /bin/bash.bak ln -s /usr/local/bin/bash /bin/bash [root@linuxer src]# bash -version GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu) ```bash 그래서 bash 를 다운받고 컴파일 해줬습니다. 기존 bash 는 4.2 버전이라 bash.bak 으로 변경해 문제가 생기면 언제든 사용할수 있도록 만들었습니다. ```bash yum install git git clone https://github.com/aristocratos/bashtop.git cd bashtop/ make install ```bash 이제 완성됬습니다. Bashtop 의 컴파일 까지 끝났으므로 실행만 하면 됩니다. ```bash ./bashtop ```bash ![](/images/2020/12/image-20.png) ![](/images/2020/12/image-21.png) 레트로 게임같은 비주얼에서 매우 만족스럽습니다. 한번써보시는걸 추천해 드립니다. 감사합니다.

December 31, 2020 · 1 min · 📁 Linux

terraform-provider-ncloud-review

오늘 하시코프x네이버클라우드 웨비나에서 terraform 과 Vault 에 대한 웨비나를 청취했습니다. https://github.com/NaverCloudPlatform/terraform-provider-ncloud 이전에 방과후(?) meetup에서 네이버클라우드가 테라폼의 프로바이더로 있다는것을 알았습니다. 그 덕분에 네이버클라우드에서 terraform은 이미 경험이 있는 상태고, Vault도 경험이 있었습니다. 오늘의 주제 중 Secrets Engines이 궁금했습니다. https://www.vaultproject.io/docs/secrets Secrets engines are components which store, generate, or encrypt data. 시크릿엔진은 데이터를 저장또는 생성하고 암호화하는 구성요소. AWS 의 Parameter Store / Secrets Manager 와 비슷한 기능을 한다고 생각이 들었습니다. 다른 벤더에서도 비슷한 서비스들이 있습니다. ...

November 20, 2020 · 1 min · 📁 Linux, 기타, NCP · 🏷️ ncp, vault, navercloud

linux-port-range-reuse

https://www.cyberciti.biz/tips/linux-increase-outgoing-network-sockets-range.html https://meetup.toast.com/posts/55 http://docs.likejazz.com/time-wait/ tcp port range는 32768에서 61000까지다 대략 28000개의 가용포트가 있다는것이다. 클라이언트로서 28000개의 가용포트를 모두사용하게되면? 더이상의 새로운 TCP 세션을 생성할수 없게된다. #tcp port range echo 10240 60999 > /proc/sys/net/ipv4/ip_local_port_range ```bash . 그래서 일단 10240 - 60999 개의 포트를 사용할수 있도록 수정해줬다. 예약포트들은 포통 10240 아래로 포진되어 있고, 61000 포트위로는 패시브 포트로 사용하는경우가 많으므로 일단 10240-61000포트를 사용할수 있도록 수정했다. 50000개 가량의 포트를 사용가능하도록 수정한거다. 그래도 해결이안되는듯 했다. ```bash [root@linuxer ~]# netstat -an | grep TIME_WAIT | wc -l 51314 ```bash . 두배 이상의 port range 에도 처리가 불가능한 수준이었던것.. ```bash #tcp_timestamps 기본으로 이미 적용되어있음 $ sysctl -w ipv4.tcp_timestamps="1" #tcp reuse $ sysctl -w net.ipv4.tcp_tw_reuse="1" ```bash . 그래서 두가지 방법중 tw_reuse / tw_recycle 둘중 하나를 사용하려했다. reuse 옵션은 소켓재활용, recycle 은 강제로 TIME_WAIT인 포트를 종료하는거다. 좀 더 시스템에 영향을 덜주는 방법인 reuse를 선택했다. -홀스님의 첨언 ![](/images/2020/11/image-33.png) . tw_recycle은 서버입장에선 문제가 생길수있으니 설정에는 반드시 주의가 필요하다. 일단은 처리를 했고, 서비스의 동작을 모니터링중이다. 모든옵션을 켜는 방법이다. 참고하길..tcp_tw_recycle옵션은 사용할때 꼭 주의 해야한다 ```bash sysctl -w ipv4.tcp_timestamps="1" sysctl -w net.ipv4.tcp_tw_reuse="1" sysctl -w net.ipv4.tcp_fin_timeout="10" ```bash . 일단 이 방법은 좀 임시방편이고, 좀 더 확장성있는 방법으로 가기위해선 scale out을 해야한다. 또 추가하자면.. FIN_WAIT2 / TIME_WAIT 두가지의 TCP 파라미터가 60초의 기본시간을 가지게 되어서 총 2분의 대기시간을 가지게 된다. 컨트롤 할수있는 파라미터는 FIN_WAIT2 상대의 파라미터를 수정 하는경우도 있다고 한다. 수정할수 있는파라미터는 대부분 /proc/sys/net/ipv4 경로에 위치하니 하나씩 확인해 보자. 글을 다쓰고 추가로 내용을 덕지덕지 붙인거라 깔끔하지 않다. 하지만 도움이 되길 바란다! 마지막으로 php-mysql은 커넥션풀이 없다고 알고있었는데 라이브러리가 있었다. <https://bkjeon1614.tistory.com/216> 아직테스트는 해보지 않은 상태고, 슬슬 해보겠다.

November 19, 2020 · 2 min · 📁 Linux

DNS-spf-google

spf 레코드는 RFC 4408 의해서 255 characters으로 제한된다. 하나의 레코드가 255 characters 라는 이야기다. 그래서 255 characters 이상을 쓰려면 어떻게 해야할까? 그것을 구글의 사용 예를 들어서 설명하고자 한다. google.com text = “v=spf1 include:_spf.google.com ~all” _spf.google.com 도메인을 include 하고 _spf.google.com 도메인을 쿼리하면 _spf.google.com text = “v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all” _netblocks.google.com _netblocks2.google.com _netblocks3.google.com 세개의 도메인을 알려준다. 세개의 도메인은 각각의 역할에 따라 ipv4나 ipv6를 응답한다. _netblocks.google.com text = “v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all” ...

October 13, 2020 · 2 min · 📁 Linux