외부에서 Kubernetes API(apiserver) 접근

앞선 글(Vagrant에 Kubernetes 클러스터 구성하기)에서는 Vagrant 환경에 k8s 클러스터를 구성해 봤는데, 이 클러스터를 사용해서 뭔가(?) 하려고 하니 한 가지 문제가 생겼다.
Minikube 처럼 kubectl을 다운로드 받기만 해서는 API를 사용할 수 없다는 것이다. 즉 호스트인 내 랩탑에서 kubectl을 통해서 명령을 내릴 수가 없다.

물론 master에는 친절하게 kubectl 이 이미 설치되어 있기 때문에 ssh로 master에 접속하여 명령을 내리면 되긴한다.
하지만 내가 하려는 것은 자바로 짠, 랩탑에서 동작하는 프로그램을 통해서 k8s API를 사용하려는 것이다. 따라서 외부에서 k8s 클러스트에 접속하는 방법을 알아내야 했다.

본인이 무엇을 필요로 하는지 아는 성격 급한 분은 첨부 파일을 받아 보거나 글 말미를 보시길.

웹 애플리케이션을 만들고 있기 때문에 먼저 OAuth 토큰을 이용하는 방식을 시도해 봤는데, 자바 키스토어(java keystore)에 인증 정보를 심어줘야 하는 귀찮은 문제가 있었다. 너무 샛길로 빠지는 내용이고, 내 수준으로는 보안에 대해서 자세히 설명하기도 힘들어서 일단 OAuth는 생략한다.

다음으로 시도한 방법은 k8s에서 사용하는 인증서를 랩탑으로 가져와서 사용하는 것이다.
사실 앞서 vagrant 기반으로 클러스터를 구축했다면 이미 클론한 kubernetes-vagrant-coreos-cluster 프로젝트 디렉토리 하위의 artifacts/tls 디렉토리에 필요한 파일이 이미 있기 때문에 이를 사용하면 된다.
다른 클러스터에 접근하려는 것이라면 해당 클러스터의 master에서 certificate-authorityclient-certificateclient-key 에 해당하는 파일을 다운로드 받으면 된다.

아래 명령을 실행하면 위에 언급한 것들이 무엇인지 자세한 설명이 나온다.

    $ kubectl options --help
    The following options can be passed to any command:

          --certificate-authority='': Path to a cert file for the certificate authority
          --client-certificate='': Path to a client certificate file for TLS
          --client-key='': Path to a client key file for TLS

즉 인증기관에서 발급한 인증서와 TLS의 클라이언트 인증서, TLS의 클라이언트 키가 필요한 것이다. 파일명은 환경에 따라 다를 수 있는데 앞서 구축한 vagrant 클러스터에서는 순서대로 ca.pem, admin.pem, admin-key.pem 파일을 사용하면 된다.

설명은 길었지만 답은 간단하다. 아래의 내용을 복사한 후, %USERPROFILE%\.kube 디렉토리에 config 라는 이름의 파일을 만들고 그 내용으로 넣으면 된다.
주의할 점은 각 파일(파일 3개)의 경로와 server 항목의 IP 주소는 본인의 환경에 맞게 수정해야 한다.
좀 더 부연하자면 윈도(windows) 사용자 계정이 kim 이라면 C:\Users\kim\.kube\config 파일에 아래 내용을 넣는 것이다.

    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\ca.pem
        server: https://172.17.8.101:443
      name: default
    contexts:
    - context:
        cluster: default
        user: default
      name: default
    current-context: default
    kind: Config
    preferences: {}
    users:
    - name: default
      user:
        client-certificate: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin.pem
        client-key: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin-key.pem

혹 필요할지도 몰라서 config 파일은 따로 첨부한다.

config



EOF



삼성 MP3 플레이어 YEPP YP-T8 케이블 수리(pinout, 핀 배치)

MP3 플레이어 YEPP YP-T8 의 데이터 전송 케이블이 없어져서 온라인 쇼핑몰에서 하나 구매를 했는데, 아예 인식조차 안 된다.
상담 전화를 했더니 마지막 하나라서 교환이 불가하니 그냥 버리라고 한다.

핀 배열만 알면 약간의 납땜만 하면 고칠 수 있을 것 같아서 열심히 찾아본다.
2005년에 생산된 제품이니 상당히 불안했는데, 다행히 해외 사이트에서 Service Manual을 찾을 수 있었다.

Samsung YP-T8 Service Manual

이 메뉴얼 43페이지의 Schematic Diagram에 핀 배열이 나와 있다!
배열은 아래와 같은데, 내 기억이 맞는다면 USB Micro-B와 배열 순서가 같다. 아마도 1, 2, 3, 5번 핀을 잘 맞춰서 땜질해 주면 될 것 같다.
참고로 6번은 어댑터로 충전할 때만 사용하는 + 핀이다. 아마도 어댑터는 5, 6번 핀만 사용하는 듯.

  1. VBUS
  2. D-
  3. D+
  4. ID
  5. GND
  6. ADT
  7. DM_H
  8. DP_H


우선 구매한 케이블의 8핀 커넥터 외피를 칼로 가른다.


테스터로 각 핀을 일일이 찍어서 접점을 찾아보니 아래 그림과 같았다. 잘 그린 그림은 아니지만 이해하는 데 문제는 없지 않을까 싶다.

참고만 하시길. 모든 8핀 커넥터가 같은 구조는 아닐 것이니 찍어보는 수고는 필수일 것 같다.

힘들게 납땜을 했는데,

컴퓨터와 MP3를 연결해 보니. 제대로 인식이 안 된다.

원인이 무엇일까 생각해 보니 OTG 케이블처럼 ID 핀을 GND 와 합선해 줘야 하는 게 아니냐는 추측을 하게 됐다.
추측이 맞았다. 합선해 주니 이동식 디스크로 인식이 잘된다.

글루건으로 모양을 만들고 수축 튜브로 지저분한 외양을 가려주고 마무리한다.


EOF

Vagrant에 Kubernetes 클러스터(cluster) 구성하기

Minikube로도 랩탑에서 많은 작업을 할 수 있지만 아무래도 멀티 노드로 구성해서 직접 검증을 해야 할 일이 생긴다.

Vagrant에 직접 CentOS나 Ubuntu 박스를 이용해서 구성을 시도했지만 시간만 낭비했고, 구글링 끝에 kubernetes-vagrant-coreos-cluster 프로젝트를 찾았다.

https://github.com/pires/kubernetes-vagrant-coreos-cluster/

프로젝트 메인의 README 를 보면서 설치를 진행해 봤는데, 아래는 윈도(windows)에서 설치한 경험을 정리한 것이다. 몇 가지 시행착오가 있었기 때문에 도움이 될 것이다.

그리고 시간이 없더라도 README 는 꼭 읽을 것을 권장한다.

Installation

NFS 공유 기능을 활성화 하기 위해서 Vagrant 플러그인 설치

    $ vagrant plugin install vagrant-winnfsd

Vagrant WinNFSd 플러그인의 깃 저장소
https://github.com/winnfsd/vagrant-winnfsd

저장소를 clone 하기 전에 Git 옵션을 변경

    $ git config --global core.autocrlf false
    $ git config --global core.eol lf

Deploy Kubernetes

vagrant를 시작하고 프로비저닝을 실행한다.

    $ vagrant up

kubernetes-vagrant-coreos-cluster 프로젝트는 CoreOS의 alpha 버전을 사용하도록 기본 구성되어 있는데, 만약 현재 버전이 1492.3.0이라면 아래와 같이 403에러가 발생할 수도 있다.

    ==> master: Box 'coreos-alpha' could not be found. Attempting to find and install...
        master: Box Provider: virtualbox
        master: Box Version: = 1492.3.0
    ==> master: Loading metadata for box 'http://alpha.release.core-os.net/amd64-usr/current/core
    os_production_vagrant.json'
        master: URL: http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant
    .json
    ==> master: Adding box 'coreos-alpha' (v1492.3.0) for provider: virtualbox
        master: Downloading: http://builds.release.core-os.net/alpha/amd64-usr/1492.3.0/coreos_pr
    oduction_vagrant.box
        master: Progress: 0% (Rate: 0/s, Estimated time remaining: --:--:--)
    An error occurred while downloading the remote file. The error
    message, if any, is reproduced below. Please fix this error and try
    again.
    
    The requested URL returned error: 403 Forbidden

아마도 박스 다운로드 주소를 잘못 설정한 것이 아닐까 의심된다.

어쨌든 다음과 같이 바로 전 버전인 1492.1.0 을 사용하도록 설정하고 실행하면 해결된다.

    $ COREOS_VERSION=1492.1.0 vagrant up

이제 master 노드에 ssh로 접속하여 kubectl 을 사용해서 이런저런 작업을 해 볼 수가 있게 됐다.

    $ vagrant ssh master
    $ kubectl cluster-info

만약 vagrant ssh master 명령으로 접속했을 때 인증이 안되면, 아래 링크를 참고한다.

Vagrant - CoreOS에 vagrant ssh 접속 시 인증 실패

Environment variables

  • CHANNEL: CoreOS의 채널을 지정한다. alpha, beta, stable을 중 하나를 넣는다.

    기본 값(default)은 alpha.

  • COREOS_VERSION: CoreOS의 버전을 지정한다. 위에서 언급했다.

  • USE_KUBE_UI: Kubernetes UI 를 deploy 할 것인지의 여부를 지정.

    기본 값은 false http://#{MASTER_IP}:8080/ui 에 접속하면 화면을 볼 수 있다.

이외에도 변수가 많은데 굳이 여기에 옮길 필요는 없을 것 같다. 앞으로 필요한 부분이 있으면 다른 글에서 덧붙이기로 하자.



EOF

Vagrant - CoreOS에 vagrant ssh 접속 시 인증 실패

Vagrant에 CoreOS를 설치하고 ssh 접속을 시도 했을 때 인증이 안되는 경우가 있습니다.

    $ vagrant ssh
    Password:
    Password:
    Password:
    vagrant@127.0.0.1's password:
    vagrant@127.0.0.1's password:
    Authentication failed.

저의 경우는 alpha 채널에서 1492.1.0 버전을 받아서 설치했었습니다.

CoreOS는 기본 계정이 vagrant가 아니라 core 더군요. 그리고 key 방식 인증만 지원하고 passowrd 방식은 지원 안합니다. 이런 경우 Vagrant의 insecure key를 이용하면 됩니다.

    $ ssh core@localhost -p 2222 -i $VAGRANT_HOME/insecure_private_key

$VAGRANT_HOME 은 윈도(windows)의 경우 C:\Users\[사용자ID]\.vagrant.d 폴더입니다. 명령 프롬프트에서 cd %USERPROFILE%\.vagrant.d 명령으로 이동할 수 있습니다.

혹은 Vagrantfile에서 아래와 같이 ssh username을 core로 변경한 후 VM을 reload 하면 vagrant ssh 명령으로 접속이 가능합니다.

    config.ssh.username = "core"



EOF

WildFly (JBoss)가 자동 적용하는 라이브러리 배제 방법

톰캣에서는 잘 돌아가던 애플리케이션이, WildFly에 배포해서 사용하려고 하면 로깅 부터 시작해서 여러가지 문제가 발생하는 경우가 있다. WildFly의 버전을 올리면 해결되는 경우도 있지만, 버전을 올릴 수 없는 경우에는 WildFly가 제공하는 디펜던시(dependencies)를 배제하여 애플리케이션의 자체 디펜던시를 사용하도록 조정해야 한다.

이를 위해서는 WEB-INF/jboss-deployment-structure.xml 파일을 만들고 아래와 같이 배제할 모듈을 명시하면 된다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
        <deployment>
            <exclude-subsystems>
                <subsystem name="logging" />
                <subsystem name="jaxrs" />
                <subsystem name="resteasy" />
            </exclude-subsystems>
            <!-- exclusions allow you to prevent the server from automatically adding some dependencies -->
            <exclusions>
                <module name="org.slf4j" />
                <module name="org.slf4j.impl" />
                <module name="org.slf4j.jcl-over-slf4j"/>
                <module name="org.apache.commons.logging"/>
                <module name="org.apache.log4j"/>
                <module name="javaee.api" />
                <module name="javax.xml.bind.api" />
                <module name="com.fasterxml.jackson.core.jackson-core" />
                <module name="com.fasterxml.jackson.core.jackson-databind" />
                <module name="com.fasterxml.jackson.core.jackson-annotations" />
                <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
                <module name="org.jboss.resteasy.resteasy-jaxb-provider" />
                <module name="org.jboss.resteasy.resteasy-jettison-provider"/>
                <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
                <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>

배제할 모듈의 이름을 알아 내기 위해서는, $WILDFLY_HOME/modules/system/layers/base 디렉토리 하위의 각 디렉토리에서 module.xml 파일 내용을 확인하면 된다.


추가: 참고로 위의 설정 파일을 사용해서, WildFly( 9.0.2.Final 버전)에서 CONSOLE 로거로 Logback 로그를 출력하는 데에는 실패했습니다. 다만 FILE 로거로는 출력이 잘 됩니다.


EOF