지돌이의 블로그 입니다!

Kubernetes

Master Node 초기화

  1. sysctl 수정

현재 Runtime에 대한 sysctl 변경

$ sudo sysctl net.bridge.bridge-nf-call-iptables=1

vim 으로 sysctl 에 대한 영구 설정 변경

$ sudo vim /etc/sysctl.d/99-sysctl.conf

net.bridge.bridge-nf-call-iptables=1 # 추가
  1. kubeadm
$ sudo kubeadm init --pod-network-cidr=172.30.0.0/16 --service-cidr=10.244.0.0/16

마지막에 나오는 문장 기억해놓기

kubeadm join 10.0.0.2:6443 --token ssssss.asdasdasdas --discovery-token-ca-cert-hash sha256:asdasdasdasdasdasdsadsad

이런거

  1. 관리자 사용자 설정
# 관리자 사용자 계정에서
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. Network overlay 추가
# 다운로드
$ wget https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml

# 내용 수정
$ vim kube-flannel.yml
# net-conf.json 부분의 "Network": "10.244.0.0/16" => "Network": "172.30.0.0/16" 으로 변경 후 저장

# 적용
$ kubectl apply -f kube-flannel.yml
  1. Slave Node 설정
# Slave Node 에서
$ sudo kubeadm join 10.0.0.2:6443 --token ssssss.asdasdasdas --discovery-token-ca-cert-hash sha256:asdasdasdasdasdasdsadsad
  1. 1분쯤 지나도 kubectl get nodes 에서 Slave노드가 NotReady 라면
$ sudo mkdir -p /etc/cni/net.d
$ sudo vim /etc/cni/net.d/10-flannel.conflist
# 파일 만들기 (이건 모든 node에서,없는경우)

{
    "name": "cbr0",
    "plugins": [
        {
            "type": "flannel",
            "delegate": {
                "hairpinMode": true,
                "isDefaultGateway": true
            }
        },
        {
            "type": "portmap",
            "capabilities": {
                "portMappings": true
            }
        }
    ]
}

$ sudo systemctl restart kubelet

Comment +0

C++ & libuv & uvw (C++ libuv wrapper library) 으로 http server을 구현했습니다.

 

Spring-boot의 RequestMapping과 같은 기능을 구현해놓아서 URL에 대한 접근이 용이합니다.

 

#include <iostream>

#include <uvw/loop.hpp>
#include <jshttpserver/server.hpp>
#include <jshttpserver/http_request.hpp>

#pragma comment(lib, "libuv.lib")

int main() {
    auto loop = uvw::Loop::getDefault();

    std::shared_ptr<jshttpserver::Server> server(jshttpserver::Server::create(loop));

    server->requestMapping(jshttpserver::METHOD_ALL, "/api/test", [](jshttpserver::HttpRequest &req, jshttpserver::HttpResponse &res) {
      std::cout << "requestMapping FOUND :: /api/test" << std::endl;
      std::cout << "\tsearch[ " << req.url_search << " ]" << std::endl;
    });

    server->requestMapping(jshttpserver::METHOD_ALL, "/api/test2/{v1}/{v2}", [](jshttpserver::HttpRequest &req, jshttpserver::HttpResponse &res) {
      std::cout << "requestMapping FOUND :: /api/test2/{v1}/{v2}" << std::endl;
      std::cout << "\tsearch[ " << req.url_search << " ]" << std::endl;
    });

    server->requestMapping(jshttpserver::METHOD_ALL, "/api/test3/{v3:.+}", [](jshttpserver::HttpRequest &req, jshttpserver::HttpResponse &res) {
      std::cout << "requestMapping FOUND :: /api/test3/{v3:.+}" << std::endl;
      std::cout << "\tsearch[ " << req.url_search << " ]" << std::endl;
    });

    server->documentRootMapping("/docs/", [](jshttpserver::HttpRequest &req, jshttpserver::HttpResponse &res) {
      std::cout << "documentRootMapping FOUND :: /docs/ :: path = " << req.doc_path_name << std::endl;
      std::cout << "\tpath_name[ " << req.doc_path_name << " ], search[ " << req.url_search << " ]" << std::endl;
    });

    server->documentRootMapping("/doxs", [](jshttpserver::HttpRequest &req, jshttpserver::HttpResponse &res) {
      std::cout << "documentRootMapping FOUND :: /doxs :: path = " << req.doc_path_name << std::endl;
      std::cout << "\tpath_name[ " << req.doc_path_name << " ], search[ " << req.url_search << " ]" << std::endl;
    });

    server->addListen(8887);

    loop->run();
    return 0;
}

 

https://github.com/jc-lab/jshttpserver-uvw.git

 

jc-lab/jshttpserver-uvw

Contribute to jc-lab/jshttpserver-uvw development by creating an account on GitHub.

github.com

 

Comment +0

sca6000 드라이버입니다. kernel-3.10 이상에서 동작하도록 수정하였습니다.
https://github.com/jc-lab/sun-sca6000-drv/

 

기존 sca6000 패키지들은 Redhat 5 등의 오래된 OS에서 동작합니다.

centos 5.3 기반 이미지에 OpenSSL/ca-bundle/curl 등을 새로 올린 centos-new-5.3이미지에 sca6000 및 openCryptoki, opensc(pkcs11-tool) 등을 추가한 도커파일입니다.
https://github.com/jc-lab/sun-sca6000-docker/

 

여기에 https://github.com/mtrojnar/osslsigncode 이나 jar signtool 설치 후 openjdk-1.8.0 & Jenkins 를 이용해 빌드 후 자동 sign 기능을 구현하면 좋을듯 합니다.

 

보안을 위해 로그인키는 따로 저장치 않고 빌드시 사용자에게 confirm을 받도록 하면 더욱 안전하겠죠!

 

언젠가 이런거 만들어야 하는데... 언제만드냐...ㅠㅠ 피곤타..

HSM너무 비싸서.. 중고 HSM찾으니 SCA6000이 나와서 구매했는데 생각보다 정보도 없고 너무 오래된거라...ㅠㅠ 꽤나 어려웠네요..

Comment +0

sudo dd if=/boot/vmlinuz-3.10.0-957.27.2.el7.x86_64.debug skip=`grep -a -b -o -m 1 -e $'\x1f\x8b\x08\x00' /boot/vmlinuz-3.10.0-957.27.2.el7.x86_64.debug | cut -d: -f 1` bs=1 | zcat > /tmp/vmlinux

원인인 vmlinuz가 압축되어있기 때문이다. 위 명령을 통해 압축을 풀면 crash에서 읽을 수 있게 된다.

Comment +0

https://jc-lab.github.io/simple-bson-viewer/

 

Simple Online Bson Viewer

 

jc-lab.github.io

필요해서 만들어 보았습니다.

 

Base64로 인코딩된 bson을 입력하면 json으로 출력합니다.

Comment +0

될줄 알았죠?

안돼요...ㅠㅠ

이 글을 보면 해결책이 있을줄 알았죠?

없어요...^^ 최소한 C++ 자체 라이브러리 안에서는....ㅠㅠ

아래와 같이 따로 만들면은 됩니다!

#include <iostream>
#include <memory>
#include <functional>
#include <tuple>

class Caller {
public:
	virtual void run() = 0;
};

template<typename F, typename Tuple>
class Binder : public Caller
{
protected:
	F f_;
	std::size_t args_count_
		= std::tuple_size<typename std::remove_reference<Tuple>::type>::value;
	Tuple tuple_;

public:
	Binder(F f, Tuple&& tuple) : f_(f), tuple_(std::move(tuple)) {
		std::cout << "args_count_ : " << args_count_ << std::endl;
	}
	
	template<typename F, typename Tuple, size_t ...S >
	void run_impl(F&& fn, Tuple&& t, std::index_sequence<S...>)
	{
		return std::forward<F>(fn)(std::get<S>(std::forward<Tuple>(t))...);
	}

	void run() override {
		std::size_t constexpr tSize
			= std::tuple_size<typename std::remove_reference<Tuple>::type>::value;

		run_impl(std::forward<F>(f_),
			std::forward<Tuple>(tuple_),
			std::make_index_sequence<tSize>());
	}
};

template<class F, class... Args>
std::unique_ptr<Caller> mybind(F&& f, Args ... args) {
	return std::make_unique<Binder<F, std::tuple<Args...>>>(f, std::make_tuple(std::forward<Args>(args)...));
}

int main()
{
	std::unique_ptr<std::string> temp(new std::string("TEST1234"));

	std::unique_ptr<Caller> caller = mybind([](std::unique_ptr<std::string> temp, int a, int b) {
		std::cout << *temp << std::endl;
		}, std::move(temp), 10, 20);

	caller->run();

	return 0;
}

Comment +0

테스트코드

#include <iostream>
#include <memory>
#include <functional>
#include <ctime>

std::function<int(int,int)> temp_s;
std::unique_ptr<std::function<int(int,int)>> temp_u;

void test_1()
{
    for(int i=0; i<1000000; i++) {
        std::function<int(int,int)> copy = temp_s;
        copy(10, 20);
    }
}

void test_2()
{
    for(int i=0; i<1000000; i++) {
        temp_s(10, 20);
    }
}

void test_3()
{
    for(int i=0; i<1000000; i++) {
        (*temp_u)(10, 20);
    }
}

int main()
{
    temp_s = [](int a, int b) -> int { return a + b; };
    temp_u = std::make_unique<std::function<int(int,int)>>([](int a, int b) -> int { return a + b; });
    {
        const clock_t start = clock();
        test_1();
        const double secs = (clock()-start) / double(CLOCKS_PER_SEC);
        std::cout << "with copy: " << secs << " secs.\n";
    }
    {
        const clock_t start = clock();
        test_2();
        const double secs = (clock()-start) / double(CLOCKS_PER_SEC);
        std::cout << "without copy: " << secs << " secs.\n";
    }
    {
        const clock_t start = clock();
        test_3();
        const double secs = (clock()-start) / double(CLOCKS_PER_SEC);
        std::cout << "using unique_ptr: " << secs << " secs.\n";
    }
    
    return 0;
}

결과 :

with copy: 0.088981 secs.                                                                                                                      

without copy: 0.028533 secs.                                                                                                                   

using unique_ptr: 0.046483 secs. 

Comment +0