このサイトの記事一覧・詳細が表示されていなかった

先週の金曜日から今日にかけて記事一覧・詳細が表示されていない現象に遭遇しました.
理由は、submoduleで組み込んでいるhello-friendというテーマで記事対象となるディレクトリ名の変更が行われていたためです.

とりあえずは、以下の対応を実施した.

  • 最新のテーマで動作するようにディレクトリ構造を変更
  • 最新のテーマで動作するように設定ファイルの変更
  • hello-friendリポジトリのrelease watch
  • 定期的に自動ビルドを行っている処理でsubmoduleの更新が入らないようにする

これ今日記事を書こうとしなかったら絶対に気づかなかったので危ないですね.

秘密鍵から公開鍵を生成する

sshで利用する秘密鍵から対応する公開鍵を生成する時のメモです.

公開鍵を生成する

ssh-keygenの-yオプションを使って、秘密鍵から公開鍵を生成することができます. ※1

$ ssh-keygen -y -f id_ed25519
ssh-ed25519 XXXXXXXXXXX

秘密鍵に対してパスワードが設定されている場合は、パスワードの入力が求められます.

$ ssh-keygen -y -f id_ed25519
Enter passphrase:
ssh-ed25519 XXXXXXXXXXX

さいごに

今回は秘密鍵から公開鍵を生成しましたが、これを利用すれば秘密鍵に使えるパスワードの確認もできます. ケースとしてはssh-keygenで鍵を生成した直後に、設定したパスワードの有効性を確認することができますしね.

※1 参考: https://euske.github.io/openssh-jman/ssh-keygen.html

2019年の抱負

2019年になり既に20日以上経って今更ですが、去年の抱負の振り返りと今年の抱負を振り返ろうと思います.

昨年の抱負

khasegawa.hatenablog.com

昨年の抱負は2つありました.

  • 自己の体調管理を見直す
  • 日々の学びをアウトプットする

まず、自己の体調管理について振り返ろうと思います.
例年に比べると対策を取り安定してましたが、1度病気になると長引くというのが正直辛かったです.
感染性胃腸炎で1週間休んだら、次の週はそれが原因で急性胃腸炎になるという「もう一回遊べる○ん!」と言われているかのような辛さでした.

次は日々の学びをアウトプットするについてです.
これは誰がどうみても達成できていなかった.
というよりも、そもそも存在忘れていました.
うん、完全に.

今年の抱負

去年の抱負は、目標はあれどそれに対する具体的な計画はありませんでした. そのため、今年はTrelloで今年のパーソナルゴールとして管理するようにしています.

f:id:corrupt952:20210131103308j:plain

具体的にどういった目標を経てているのかは見せられない項目もあるため伏せますが、ボードで俯瞰して管理できるととても良いです.
全てのゴールを達成するのは私のスキルと仕事との兼ね合いで難しいと思いますが、1つでも多く達成できるようにしてみます.

直近達成できそうなゴールは開発合宿です. 2月中旬なのでその時を今か今かと楽しみにしています.

Envoy vs Nginx: HTTP/1.1 Reverse Proxy Performance

HTTP/1.1のリバースプロキシとして、EnvoyとNginxとの軽めのベンチマークを取りました.
しっかりとしたベンチマークとはいえませんが、少しは参考になる結果かもしれません.

TL; DR

  • リバースプロキシコンテナは、CPU・Memoryともにリソースの制限をする
  • リバースプロキシとサービスはHTTP/1.1でTCPソケットで通信する
  • wrk -t 10 -c 10 http://hostで出力結果を取る
  • Nginxの方が約1msほど早かったが、はっきりいって誤差
  • corrupt952/surveyに今回の記事の元となるコードを置いている

実行環境

  • docker ... 18.09.0
  • docker-compose ... 1.23.2
  • wrk ... 4.1.0

準備

今回もdocker-composeを利用して環境を作ります.
コードは、corrupt952/surveyにあります.

docker-compose.yml

Envoy・Nginx・サービス代わりのNginxの3つを定義します

version: '3'
services:
  envoy:
    build:
      context: .
      dockerfile: dockerfiles/envoy/Dockerfile
    expose:
      - "80"
    ports:
      - "8000:80"

  nginx:
    build:
      context: .
      dockerfile: dockerfiles/nginx/Dockerfile
    expose:
      - "80"
    ports:
      - "8001:80"

  service:
    image: nginx:stable-alpine
    expose:
      - "80"

dockerfiles/envoy/Dockerfile

Envoyのサンプルコードを参考にしていますが、不要なコードは削除しました.

FROM envoyproxy/envoy-alpine:01d726a41bdd790c16765e1d321cb50590574eb0

COPY dockerfiles/envoy/front-envoy.yaml /etc/front-envoy.yaml
CMD ["/usr/local/bin/envoy", "-c", "/etc/front-envoy.yaml", "--service-cluster", "front-proxy"]

dockerfiles/envoy/front-envoy.yaml

Envoyのサンプルコードを参考にしてサービスへリダイレクトするようにしています.

admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

static_resources:
  listeners:
    - address:
        socket_address:
          address: 0.0.0.0
          port_value: 80
      filter_chains:
        - filters:
          - name: envoy.http_connection_manager
            config:
              codec_type: HTTP1
              stat_prefix: ingress_http
              route_config:
                name: local_route
                virtual_hosts:
                  - name: backend
                    domains:
                      - "*"
                    routes:
                      - match:
                          prefix: "/"
                        route:
                          cluster: service
              http_filters:
                - name: envoy.router
                  config: {}
  clusters:
    - name: service
      connect_timeout: 0.25s
      type: strict_dns
      lb_policy: round_robin
      hosts:
        - socket_address:
            address: service
            port_value: 80

dockerfiles/nginx/Dockerfile

次に紹介するdefault.confをNginxが読み込める位置に定義しておきます.

FROM nginx:stable-alpine
COPY dockerfiles/nginx/default.conf /etc/nginx/default.conf

dockerfiles/nginx/default.conf

サービスへプロキシするように定義するだけなので特筆することはありません.

server {
    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://service/;
    }
}

これで準備は終わりです.

ベンチマークしてみる

wrkというツールを使い、簡易的にベンチマークを実行してみます.
コネクション数10,スレッド数10に設定にします.(これといって根拠はないです)

Envoy

$ wrk -t 10 -c 10 http://localhost:8000
Running 10s test @ http://localhost:8000
  10 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.45ms    2.02ms  46.58ms   96.63%
    Req/Sec   433.29    121.99     1.17k    82.34%
  43501 requests in 10.10s, 35.39MB read
Requests/sec:   4305.17
Transfer/sec:      3.50MB

Nginx

$ wrk -t 10 -c 10 http://localhost:8001
Running 10s test @ http://localhost:8001
  10 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.65ms    0.96ms  13.85ms   88.35%
    Req/Sec   631.85    129.09     1.20k    66.53%
  63373 requests in 10.10s, 51.37MB read
Requests/sec:   6271.63
Transfer/sec:      5.08MB

Nginxの方が約1ms早いという結果になりました.
ですが、実際この差は膨大なリクエストを捌く必要がある大規模なサービスでなければ誤差といえる範疇かと思います.

最後に

今回は、HTTP/1.1のFront Proxyという役割でやってみましたが、Nginx・Envoyともにサポートしている領域が他にもあります.
そういった点を踏まえながら最適なモノを選んでいくのが良いでしょう.

EnvoyでHTTP/1.1の通信をプロキシする

EnvoyはHTTP/1.1とHTTP/2ともにサポートしているということで、HTTP/1.1のFront Proxyができるのか試してみました.

TL; DR

  • front-envoy.ymlcodec_typeHTTP1に変更すれば、HTTP/1.1で通信するようになる
  • corrupt952/surveyに今回の記事の元となるコードを置いている

Envoyとは

Cloud Nativeアプリケーションのために設計されたOSSなプロキシソフトウェアのことです.
KubernetesやMicroservicesの話が出てくると、必ずと言っていいほどに出てくるソフトウェアですね.

  • Circuit Breaker
  • Distributed Tracing
  • リクエストのリトライ
  • Service Discovery

などといったマイクロサービスが抱える諸問題を扱えるため、アプリケーション側で扱わなくてよくなり実装がシンプルになります.
また、マイクロサービスでなくても導入するメリットが存在するため、どのような機能があるのかを調べてみるのも良いでしょう.

Envoyが外部からのインバウンドな通信を受け取り、適切なアプリケーションへリバースプロキシすることもできます.
公式ドキュメントでは、Front Proxyというページに書かれています. ※
また、同一ページ内にサンプルコードへのリンクもあるので、簡単に試すことができます.

※ 記事作成時点で証明書が失効しているためブラウザによっては接続できません

環境

  • docker ... 18.09.0
  • docker-compose ... 1.23.2

HTTP/1.1で通信させる

公式が用意しているサンプルコードでは、Envoyからサービス用のコンテナのEnvoyへHTTP/2で通信しています.
その通信をHTTP/1.1にしてみます.
また今回作成したコードは、corrupt952/surveyにおいてあります.

概要

まずは大体の概要について書きます.
Client - HTTP1.1 -> Envoy - HTTP1.1 -> NGINX(HTTP1.1サーバ) といった構成で通信します.

docker-compose.yml

次にdocker-compose.ymlについてです.
サンプルコードをベースに作っていますが、異なるのはバックエンドに置いてあるのはごく普通のNginxコンテナです.
Nginxを使っている理由は特にありません.

version: '3'
services:
  envoy:
    build:
      context: .
      dockerfile: dockerfiles/envoy/Dockerfile
    expose:
      - "80"
      - "8001"
    ports:
      - "8000:80"
      - "8001:8001"

  nginx:
    image: nginx:stable-alpine
    expose:
      - "80"

dockerfiles/envoy/Dockerfile

EnvoyのDockerfileもサンプルコードを参考にしていますが、不要そうな行は削除しました

FROM envoyproxy/envoy-alpine:01d726a41bdd790c16765e1d321cb50590574eb0

COPY dockerfiles/envoy/front-envoy.yaml /etc/front-envoy.yaml
CMD ["/usr/local/bin/envoy", "-c", "/etc/front-envoy.yaml", "--service-cluster", "front-proxy"]

dockerfiles/envoy/front-envoy.yaml

今回のキモとなるEnvoyの設定ファイルです.
こちらも他と同様にサンプルコードを参考にしています.

admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

static_resources:
  listeners:
    - address:
        socket_address:
          address: 0.0.0.0
          port_value: 80
      filter_chains:
        - filters:
          - name: envoy.http_connection_manager
            config:
              codec_type: HTTP1
              stat_prefix: ingress_http
              route_config:
                name: local_route
                virtual_hosts:
                  - name: backend
                    domains:
                      - "*"
                    routes:
                      - match:
                          prefix: "/"
                        route:
                          cluster: nginx
              http_filters:
                - name: envoy.router
                  config: {}
  clusters:
    - name: nginx
      connect_timeout: 0.25s
      type: strict_dns
      lb_policy: round_robin
      hosts:
        - socket_address:
            address: nginx
            port_value: 80

細々と変更している箇所はありますが、重要なのはcodec_typeです.
公式ドキュメントのcodec_typeを見ると、指定可能な値は

  • AUTO
  • HTTP1
  • HTTP2

の3つです.
今回は、HTTP/1.1を強制させたいため、HTTP1を指定します.
たったこれだけでHTTP/1.1で通信させることが可能になりました.

最後に

今回は、EnvoyでHTTP/1.1のFront Proxyをやってみました.
これといって難しいことはありませんでしたが、ドキュメントを読みながらEnvoyを少し知るよいきっかけになりました.

転職しました

転職してから少し経ったので、今更ですが転職エントリを書いていこうと思います.

前職について

前職は新宿にあるSIerでした.
そこの会社は学生時だからアルバイトでお世話になっていたところで、約5年も働いていました.
前職では業務としてのプログラミングやインフラの基礎知識を学ぶきっかけや、師匠となる方々がいて楽しかった覚えがありました.
アルバイト時代のプルリクエストでは、 100件以上コメントがつくようなレベルでお互いの考えをぶつけ合っていたことが懐かしい思い出です.

転職のきっかけ

転職しようと思ったきっかけは、いくつかの要因が重なって発生しました.

  • 師匠と言える方々の転職
  • 自己評価と組織評価のミスマッチ
  • 希望するキャリアパスと組織でのキャリアパスのずれ
  • 技術的な刺激が多く得られる職場への欲求

これらの要因が重なった結果、転職しようと決断しました. それぞれについて書いていきます.

師匠と言える方々の転職

師匠と呼べるような方々は、アルバイト時代から複数人居たのですが、私が転職する頃には2人しか残っていませんでした.
またその2人も同じ職場に居るわけではなかったため、話す機会も少なくなり、技術的な話を気軽に出来るような相手が余り居なかくなってしまったのがそれなりに堪えていたことを覚えてます.
そういう時は、自分がそういう立場になってそういう環境を作る努力すべきだったのかもしれませんね.

自己評価と組織評価の乖離

自己評価と組織からの評価は、大なり小なり乖離するものです.
この乖離が大きい場合、当人は不満を抱えることになります.
私も例に漏れず、乖離が大きかったため、徐々に不満を抱えていってしまいました.
組織の全員に対して不満を持たせないというのは、難しいことではあるのである程度納得しているつもりなんですけどね.
評価のミスマッチが起きる場合は、別の組織でどのように評価されるのかを確かめる手段の1つとして転職もありだと思います.

希望するキャリアパスと組織でのキャリアパスのずれ

キャリアパスというほど明確なものが決まっているわけではありませんが、自分のやりたいことは少なからずありました.
自分に足りない知識を身につけ、自分の知識を元に挑戦したいという思いがありました.
前職のキャリアパスでは、自分のやりたいことを実現するのには難しいと判断しました.

技術的な刺激が多く得られる職場への欲求

思想、戦略、知識といった人それぞれ固有のものを話し合ったりすることで、刺激を得る場が欲しかったというのが正確かもしれません.
前職でそういった機会がなかったわけではないですが、物足りなかったのは事実です.
職場で求めるのではなく、勉強会で求めたらいいのではないのか?と思うかもしれませんが、そういう機会が得られる職場であればそちらの方がいいですよね.

転職活動について

これといって転職活動らしい活動は、今流行りのTwitter転職のみです.
声をかけていただき、そこからカジュアル面談をして、良さそうであれば面接をしてみるという形で進めました.
それ以外は特筆して書くことはありません.

最後に

前職ではエンジニアが働きやすい環境作りに取り組んでおり、悪い環境というわけではありません.
私が求める環境とはミスマッチしていたというだけの話です.
数年後にはまたマッチする環境であるかもしれません.

今の職場では自分のやりたいことが出来そうで楽しみです.

Japan Container Daysに参加してきた

参加してきた時のメモを残しておきます.
※ 写真を撮りたかったのですが準備ができてなかったのでテキストデータのみです.

まず最初にJapan Container Daysを開催・運営してくださった方々、登壇してくださった方々に感謝を.
とても刺激的な2日間でよい時間を過ごせました.
ありがとうございました.

Microservices Platform on Kubernetes at Mercari

メルカリ内部のマイクロサービスプラットフォームがどうなっているのかがまとまっていた.
メルカリはCloud Nativeを利用するだけではなく、Cloud Native関連のOSSを公開していくことで貢献していっているというスタンスはとても良い.(前から知ってるけど)

Kubernetesによる機械学習基盤への挑戦

PFNの機械学習基盤でどうKubernetesが使われているのかがまとまっていた.
こちらでもOSSで貢献していくというスタンスはとても良いと思う.

LINE Engineerを支える CaaS基盤の今とこれから

LINEのプライベートクラウドの開発基盤の変遷についてまとまっていた.
まず一言言えば、規模が違う.
とはいえ、開発者のために使いやすい環境を提供するというスタンスは良いと思った.
ここまでの規模は難しくても、それを意識していきたい.

Cloud Native の未来とIBMの取り組み

IBMがどうCloud Nativeに関わっているのか、どういうサービスを展開しているのかが分かるセッションだった.
Kubernetesを使うことで、どこでもWatsonを動かすことが可能になったという話は興味深かった.

ZOZOTOWNリプレイスにおけるKubernetes活用

ZOZOがどうKubernetesを活用しているのか、活用した上でどう運用しているのかが分かるセッションだった.
k8sを導入することで、運用コストが下がって、信頼性が向上したというのは興味深いですね.

IBM Cloud Kubernetesの全貌と始め方

IBM Cloudのサービスの1つであるIBM Cloud Kubernetesについての説明.
当初思っていたよりも、思っていたよりも使いやすそうだった.
IKSの具体的な使い方はスライドを見てもらった方が良さそう.
年齢的に知らないはずだけど何故か知ってるOS/2 WarpIBMの歴史で出てきたのが嬉しかった.

  • Redhat買収するぐらいCloudNativeに力を入れてる
    • まだまだこれから
  • ICP(IBM Cloud Private)とIKS(IBM Cloud Kubernetes Service)の2つのサービスがある
    • どちらもKubernetes
    • ICPは、オンプレでも動くソフトウェアパッケージ
  • IKSとは
    • コンテナ層、オーケストレータ層、インフラ層の3層を定義する
    • k8sを使っているので、ベンダーロックな技術がなくても良いというメリットがある
      • ほぼ設定を変えなくても、他のクラウドサービスのk8sで動かせる
    • k8sの1.11の完全保証
    • インフラ層を気にしなくて良いサービスである
    • 諸々抽象化されてて、いちいち自分で構築する必要がない
      • Grafana、Kibana,k8sクラスタのノード
      • バージョンアップもグレイスフルでいけそう
  • IBMのグローバルネットワークはすごい
    • 地球一周するデータセンター間ネットワークを持っている
    • 全てをパブリックなDCではなく、政府などに貸し出しているDCもある
    • 42DC中、31DCでIKSが使える

Kubernetes がもたらす 分散システムの脅威との戦い

Kubernetesを導入した時から、組織や仕組みについての説明.
システムを導入するために組織を変革するのはとても勇気がいる判断だと思うし、それで導入しているのは正直凄い.

  • 全てのシステムをk8sに移行した
    • これで分散システムの恩恵を受けたが、問題も発生した
  • 新しい部分からマイクロサービス化していった
  • 組織全体で利用
    • 全員で1つのマシンを使うようにしている
    • k8s管理専属のチームがいる
  • devが触れる領域が狭く、インフラとの技術的断絶が発生していた
    • k8sを導入することで、devが触れる領域を増やしていった
  • マイクロサービスを導入した理由
    • 最初は単純な技術的な興味
    • コアバリューを守るためにマイクロサービス化していった
    • コンウェイを起こして、スケールする組織を作るため
  • 学習コストが膨大になりがちなので、シンプルに保つ
    • 良いエコシステムはあるが、学習コストがかかるので、場合によっては必要最小限なツールを作る
    • kubectlは機能が多いので、軽くwrapしてる
  • 増え続けるマイクロサービスの脅威
    • k8sのアップグレードなどがあると、一貫性のある基盤を維持するのが難しい
    • 毎回別のサービスの同じリクエストするのは無駄なのでキャッシュを導入したが、開発者がキャッシュ設計が難しい場合があるので、k8s管理チームが仕組みを作っておこうね
  • k8s自体も分散システムなので、動作が不安定なときはそれなりにある
    • k8s自体のバグとか
    • 専任のチームがいないと何かあったときに対応できない
  • ネットワークを信頼しない
    • 分散トレーシング、ネットワークを可視化するのが大事
      • Twitterが約5年前に取り組んでいた問題だった
  • 早すぎる最適化をしない

40 topics of Kubernetes

KubernetesだけでなくDockerを使う上での心構え的な話しもあった.
改めて振り返ることができたので面白いトピックだった.
てらだよしおがんばった. (参考)

Ansible,Terraform,Packerで作るSelf-Hosted Kubernetes

KubernetesKubernetesクラスタを管理することで、Kubernetesが持つ機能の恩恵を受けようという話.
実際にどうSelf-Hostingしていくかの話が盛り込んであって学びのある良いセッションだった.

  • OpenStackを用いたPrivateCloudを使っているが、PublicCloudも一部使っている
  • (C,P,F)aaSを提供することで生産性を向上させたい
    • まずはk8sでCaaS
      • Swarmではだめなの? ... k8sが持つ機能が強力かつ利用したいため、k8sがいい
  • どうやって構築する?
    • k8sの構築・運用はシンプルにしておきたい
  • それならどうする?
    • マネージドサービスと思いきや、Self-Hosted Kubernetes
    • k8sが自分自身を管理する
      • Auto-headlingなどどいった機能をk8sの管理で使うことができる
  • Self-Hosted Kubernetesとは?
    • kubeletで各コンポーネントで管理することで、ホスト自体で管理するコンポーネントを減らせる
    • ファイルやSSHの設定管理をしなくてもよい
    • Self-Hostedだと、デバッグや調査ができる
    • 冗長構成を組むのもk8sで管理できるo
    • レイヤーを定義して、どのレイヤーをSelf-Hostedするかというので全く違ったSelf-Hostedになる(難易度が変わる)
  • 自作してみた
    • 構成
      • kubelet ... Systemd管理下
      • etcd ... StaticPodを用いてk8s管理下
      • apiserver,scheduler,etc ... k8s APIを用いてk8s管理下
  • Packerは何に使ってるの?
    • ベースイメージにDockerやkubelet、その他の全ノードで使うソフトウェアのインストールができる
    • ここでもAnsibleも使っている
  • Terraformは何に使ってるの?
    • Self-Hosted Clusterのホストマシンリソースを管理している
  • 得られたもの
    • 実際に手を動かすことによって、Self-Hostedをより詳細に理解することができた
    • 実装難度もわかった
    • k8sの各コンポートがどんな役割があったのかをしれた
  • 今後の課題
    • Self-HostedされていないDocker,kubeletをどう更新するか
      • 今は、1ノードずつサービスアウト、更新、サービスインをやっている
      • Immutable Infrastructureの考え方を適用できないかを考えた
        • 思っていたよりも
    • ノードの増減をどうするか
      • Terraformのcountを使えば増減は可能
        • 減らすときはdrainしておく
      • k8s管理下におけるとよりよくできそう

Knativeのすべて

記事作成時点でスライド未発見.(見つけ次第アップデートするかもしれない)
眠かったので正直あんまり覚えてない...
Knativeは、こんなに簡単に扱えるよ!っていうセッションだったはず.
まともに覚えてるのAge of EmpiresとCiv6の話が出てたということ.
いや、ほんとすんません... まじで...

Civ6知らない人向けの話

Civ6のテクノロジツリーでは、以下のように8時代あります.
スライドで出ていたのは、この時代の中の最初と最後です.

太古は灌漑や畜産、青銅器などが始まる時代で、情報時代はステルス技術やロボット工学が始まる時代です.
Age of Empiresの例では、石器時代から鉄器時代への進化という例を出していて、この程度の進化じゃなくて、Civ6の太古時代から情報時代ぐらいへの進化が求めているものですよねっていう話だったと思います.

Cloud Native プロダクト 1000本ノック

記事作成時点でスライド未発見.(見つけ次第アップデートするかもしれない)
Cloud Nativeプロジェクトについてざっと話していた.
最後はCNCF LandscapeのTrail mapの画像を出して、これぐらいあるんですよで終了.
結構知らない技術も多かったので知る機会が得られて良かった.

  • What is Cloud Native
  • 疎結合なシステム
  • 復元力
  • 管理しやすい
  • 可観測
  • 堅牢な自動化最小限な労力で堅牢な自動化
  • X as a Service
    • k8s上で展開するソフトウェアが多い
  • Vitess
    • シャーディングすることでMySQLをスケーラブルに扱うMySQL as a Service
  • NATS
    • Go言語製のメッセージングソフトウェア
    • データストリーミングや様々なメッセージングを扱う
  • Rook
    • Storage as a Service
    • Ceph Operatorを使うことで、ほぼ全ての種類のストレージサービスをk8s上に展開できる
  • TiKV
    • KVS as a Service
    • CNCFのSandboxプロジェクト
  • ServiceMesh
    • 多くのマイクロサービスがあると、可観測できることが重要
    • そういう時に使うのが大事
  • Istio
    • CNCFがホストするEnvoyプロ棋士を使用
    • 複数のk8sクラスタをサービスメッシュでつなぐことも可能
  • Linkerd & Conduit
    • Conduitはモニタリングツールとしてはよい
  • Spinnaker
    • 継続的デリバリーツール
  • Weave Flux
    • GitOpsを実現するソフトウェア
  • Argo
    • CRDをリヨ空いてワークフローを設定を記述
    • kubflow内部で利用されている
  • kubeflow
    • ML基盤を展開するサービス
  • Telepresence
  • Skaffold
    • イメージのビルド・プッシュ・デプロイを自動化できる
  • Helm
    • k8sのパッケージマネージャ
  • ksonnet
    • jsonnet:jsonを拡張したデータテンプレート言語
  • Cortex
    • Prometheus as a Service ... マルチテナント環境でPrometheus
  • Thanos
    • 古いデータを消すのではなく、S3 BucketやGCS Bucketに転送する
  • CNCF Trail Map

LINE 機械学習

  • 機械学習プラットフォームを誰がどう管理するのか
    • スーパー機会学習エンジニアならできるけど、一般的なエンジニアには無理
    • 実装後に、いきなりインフラエンジニア渡されても使い方悪いし、運用するにはリソース管理がざらな時もある
  • こういった課題を解決するためにRekcurd
    • 機会学習モジュールの配信を簡単に
    • 機会学習モデルの管理と運用を簡単に
  • Rekcurdのコンセプト
    • 機会学習モジュールの配信を簡単に
    • 機械学習モデルの管理と運用を簡単に
    • 既存のシステムへの統合を簡単に
  • Rekcurdとは
  • Rekcurd Dashboardとは
    • 全てのRekcurdを管理できる
    • モデルのアップロード・バージョニング可能
    • WebUIで誰も簡単に操作可能
  • Rekcurd Clientとは
    • SDKとして使える
    • Netflix Feignのように使える

runcだけじゃないlow level runtime徹底比較

結構しっかり書いていて、面白い内容だったと思う.
ここに載ってないランタイムもあるそうなので、誰かやってくれるのか期待.

  • 色々なlow level runtime
    • runc,runv,cc-runtime,kata-runtime,runq,runnc,runsc,railcar
  • gVisor
    • アプリケーションが発行するsystem callをフックして盛業する
    • AppEngineで使われている
    • dmesgがランダムなメッセージが出るw(事前に配列で定義されている中から10行が出る)
  • ベンチマークツール
    • bucketbench ... runcしか対応してない
    • cri-tools ... 使い勝手が悪い(大体固定)
    • 今回試したい用途にはどちらも合わないので自作した
  • 結果
    • 大体runncが早い
    • deleteはどれも横ばいなので、クライアントが非同期で消してると思われる
  • その他

Kubernetesと暮らすRancherな生活

Rancherとその周辺ツールについて簡単にまとまっていた.
初めて触ったのが1系だったので、今は結構変わってるんだなと実感.

  • What's Rancher?
  • OSSなコンテナ管理ツール
  • クラスタの構築・管理
  • Rancher and Orchestrator
  • v1.x
    • 実装 ... Java + Go with mysql
    • v1 ... swarm,mesos,k8s,etc...
    • アプリケーションワークロード管理 ... docker-compose
  • v2.x
    • 実装 ... Go with etcd
    • 管理対象 ... k8sにフォーカス
    • アプリケーションワークロード管理 ... helm
  • Rachner関連ツール
    • 似たような名前のツールもあるから混同しないでね
    • Rancher ... 今回の話し
    • Rancher OS ... コンテナ向けの軽量OS
    • Project Longhorn ... iSCIをベースとした分散ストレージ
    • RKE ... Rancher k8s Engine. k8sインストーラ
  • Rancher 2.0
    • Multi Cluster Support ... Managed k8s service support, on/off prem IaaS support
    • Import Cluster
    • Workloads Management
    • Pipeline(他のCI/CDと被りそうだが使い方次第)
  • ユースケース
    • Application配信基盤 ... CaaSのような使い方ができる
    • 開発基盤 ... 既存のパイプラインで一部組み込んだり
  • RIO
  • 最後に
    • KnativeもRIOもそうだけど、今後はインフラを意識にせずにアプリケーションを運用する時代がきてるな
  • その他

showKs

記事作成時点でスライド未発見.(見つけ次第アップデートするかもしれない)
showKsの開発裏側を説明していた.
結構楽しそうに話していたので、学生時代の夜更かしして何かやっていた時を思い出した.

Apache Mesos

Apache Mesos

Apache Mesosについて分かりやすいセッションであった.

  • Apache Mesos
    • 従来のシステム管理だと、マシンリソース管理や、冗長性を管理するのがつらい
    • Mesosは、カーネルのタスクスケジューリングをシステムレベルで行う
    • 物理・仮想マシンリソースが何台あろうと、1つのマシンリソースとして扱える
    • データセンターカーネルと呼べるもの
  • Apache Mesos Architecture Overview
    • Mesosは、Mesos Master・Mesos Agent・Frameworkからなる
    • Mesos Masterの役割
      • Mesos AgentとFrameworkを管理する
      • リソース割り当て・最適配置を行う
      • Framework(Scheduler)からの要求受付と結果通知
      • ZooKeeperによって冗長化されている
    • Mesos Agentの役割
      • リソース情報をMasterに通知
      • Framework(Executor)によるタスクの実行と結果通知
    • Frameworkの役割
      • SchedulerとExecutorで構成される
      • SchedulerはMasterへタスク実行を要求する
      • ExecutorはAgent上でタスクを実行する
      • Executorは、Containerによる実行も対応している
    • Matathonという長期実行アプリケーション向けに設計されたFrameworkの1つ
    • 他にもFrameworkはあるよ
  • Mesosphere DC/OS
    • Mesosphere DC/OSは、分散クラウドオペレーティング・システムという立ち位置
    • 商用版もあるよ
    • 分散システム自体の管理が得意
    • Mesosphere Kubernetes Engineというものもあるので、k8s as a Serviceといった利用方法も可能

IQONクローラー基盤【Mesosユーザ事例】

2016年当時のクローラー基盤が抱えていた課題の話から、その課題にマッチしたのがMesosであったということが分かりやすくまとまっていた.
最後のスライドに詳しく知りたい人向けのリンクが載っている.

  • IQONでは、クローラー基盤としてMesosを利用している.
  • 2016年当時、300 EC Sites, 1,000,000 fashion itemsほどのデータをクロールしていた
  • クローラー基盤で動く処理をワーカーと呼び、役割ごとに多段化していった(ダウンロードするだけ役割をもつワーカーなど)
  • 2016年当時のクローラー基盤の課題
    • ワーカー毎にCPU,メモリといった必要なリソースを異なり管理する必要がある
    • 実行される日次によっては、個々のインスタンスリソースを考慮する必要がある
    • ワーカーのプロセスをコントロールプレーンから操作可能にする必要がある
  • そこで出会ったのがMesos(課題を解決できそうだったのが)
    • Mesosの思想 ... 分散環境を巨大な計算資源をしてみなす
      • この思想のシンプルさがベストマッチ
    • シンプルなクラスタ管理が可能
      • Linuxディストリによっては、apt/yumでインストールでき、比較的容易に構築可能
    • ドキュメントが豊富
      • 詳細な公式ドキュメントがあり、公式を探せば良いという安心感があった
  • シンプルに使うためにあえてDC/OSはあえて使っていない
  • その他

Kubernetes Meetup Tokyo 2年間の振り返りと未来

Kubernetesと簡単な歴史とKubernetes Meetup Tokyoの歴史を時系列で遡っていったセッションだった.
最後にスピーカー達が気になる話をしていて、個人的にはvirtual-kubeletが面白そうだなといった印象を受けた.

最後に

とても参加する意義のある日々だったと思う.
結構Kubernetesの話が多かったので、他のCloud Native話を聞けると個人的にはもっと嬉しかった.
とはいえ、俺が期待している細かい中の話は勉強会やもっと小規模なイベントでする話なのかもしれないなと思う.
イベントの中で一番心に残ったのは、Dockerを知っていても、使い方を知っている人はそこまで居ないです.
言われみれば「確かに確かに」と納得するのですが、結構忘れがちかなと思いました.

次回からは、Cloud Native Daysに名称変更されるので、次回も参加できるようであれば参加していきたい.

その他