kubebuilderでcrdを作ってみた
経緯
digdagのworkerをkubernetes上で動かしていたが、普通のhpaではタスク実行中のworker podが殺されてスケールインしてしまうことがあったため. タスクを完了せずにスケールインしてしまうと他のworkerでタスクを再実行する挙動になるので時間を浪費してしまう.
つくりかた
digdagのタスク実行に関するところは、postgresqlにクエリ叩いて確認したり、以下の記事を読み込んでみたりした。
digdagのUTからtaskが実際に実行されるまでの流れ · GitHub
digdagのポスグレのstate_flagsって何
— Trs (@TrsNium) February 15, 2020
kubebuilder周りは、とりあえずこの辺りのコードを読んで雰囲気を感じ取った
controller-runtimeのAPIを叩けばいい感じにリソースが取れるってことが分かった。 取れるのは分かったけど実装方がわからないときは, kubernetes slackのkubebuilder channelの過去のログを検索して、それっぽいgolangコードを参考にした。
できたやつ
実質3日くらいで作った。割と簡単だった。
次やりたいこと
最良のチャーハンを作るための中華鍋の振り方研究https://t.co/T73Je972XD
— ゆきまさかずよし (@Kyukimasa) February 13, 2020
ジョージア工科大学、素人とプロの料理人の中華鍋の振り方から米の挙動解析して熱がどのように伝わるのかを分析 pic.twitter.com/WzYM5yNhjJ
この論文を読んで、チャーハンのプロを作りたい 多本腕バンディットチャーハン
Haskellをやりたい
明けましておめでとうございます。
突然ですが僕はHaskerllをやりたい。理由は下記の動画やTAPLを読み始めたから。
Language Server導入
僕は形から入るタイプなので、vimで.hsを弄れるようにする。
vimでの補完は全てLanguage serverを使っているようにしているので、haskellのlsを調べたところ以下のようなリポジトリが見つかった。
何もhaskell分からないが stackでコンパイラやpackageの管理をすれば良いというのだけ確認し、stackを導入した。
$ brew install stack
次にhaskell-ide-engineを導入するために、ビルドする。
$ stack ./install.hs stack-install-cabal $ stack ./install.hs hie-8.6.5 $ stack ./install.hs build-data
ビルドするときに私の場合下記のようなエラーが発生した。
$ stack ./install.hs stack-install-cabal Linking /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 ... ld64.lld: warning: ignoring unknown argument: --gc-sections ld64.lld: warning: ignoring unknown argument: -u ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ld64.lld: warning: ignoring unknown argument: -u ld64.lld: warning: ignoring unknown argument: -u ld64.lld: warning: ignoring unknown argument: -u ld64.lld: warning: ignoring unknown argument: -search_paths_first ld64.lld: warning: ignoring unknown argument: -dead_strip_dylibs ld64.lld: warning: -sdk_version is required when emitting min version load command. Setting sdk version to match provided min version Cannot open /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.o: bad relocation (Invalid pointer diff) in section __TEXT/__text (r1_address=21c, r1_type=5, r1_extern=1, r1_length=2, r1_pcrel=0, r1_symbolnum=37), (r2_address=21c, r2_type=0, r2_extern=1, r2_length=2, r2_pcrel=0, r2_symbolnum=30) clang: error: linker command failed with exit code 1 (use -v to see invocation) `clang' failed in phase `Linker'. (Exit code: 1) -- While building simple Setup.hs using: /Users/TrsNium/.stack/programs/x86_64-osx/ghc-8.6.5/bin/ghc-8.6.5 -rtsopts -threaded -clear-package-db -global-package-db -hide-all-packages -package base -main-is StackSetupShim.mainOverride -package Cabal-2.4.0.1 /Users/TrsNium/.stack/setup-exe-src/setup-mPHDZzAJ.hs /Users/TrsNium/.stack/setup-exe-src/setup-shim-mPHDZzAJ.hs -o /Users/TrsNium/.stack/setup-exe-cache/x86_64-osx/tmp-Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.5 Process exited with code: ExitFailure 1
これはghcのコンパイラのオプションがgcc向けの設定になっているようだった。
以下を参考にし ~/.stack/programs/x86_64-osx/ghc-8.6.5/lib/ghc-8.6.5/settings
辺りの設定を良しなに変えた。
ビルドされたパッケージーは $HOME/.local/bin
に生成されるらしいので、pathを通しておく。
試しにビルドされたhaskell-ide-engineを実行してみる。
$ hie-wrapper 2020-01-05 01:44:54.574095 [ThreadId 4] - run entered for hie-wrapper(hie-wrapper) Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5 2020-01-05 01:44:54.57757 [ThreadId 4] - Current directory:/Users/TrsNium/Documents/TrsNium/kell 2020-01-05 01:44:54.577999 [ThreadId 4] - Operating system:darwin 2020-01-05 01:44:54.57827 [ThreadId 4] - args:[] 2020-01-05 01:44:54.583853 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"] 2020-01-05 01:44:56.725063 [ThreadId 4] - Cradle directory:/Users/TrsNium/Documents/TrsNium/kell 2020-01-05 01:44:56.725759 [ThreadId 4] - Use Stack GHC 2020-01-05 01:44:57.066709 [ThreadId 4] - Project GHC version:8.6.5 2020-01-05 01:44:57.067207 [ThreadId 4] - hie exe candidates :["hie-8.6.5","hie-8.6","hie"] 2020-01-05 01:44:57.067991 [ThreadId 4] - found hie exe at:/Users/TrsNium/.local/bin/hie-8.6.5 2020-01-05 01:44:57.068399 [ThreadId 4] - args:[] 2020-01-05 01:44:57.068593 [ThreadId 4] - launching .... Running HIE(hie-8.6.5) Version 1.0.0.0, Git revision b7ce8b8f2fc4a071db2119516aa1dcffc577dca0 (3541 commits) x86_64 ghc-8.6.5 To run as a LSP server on stdio, provide the '--lsp' argument Current directory:/Users/TrsNium/Documents/TrsNium/kell args:[] Looking for project config cradle... 2020-01-05 01:44:57.159521 [ThreadId 4] - Cabal-Helper dirs: ["/Users/TrsNium/Documents/TrsNium/kell","/Users/TrsNium/Documents/TrsNium/kell/File.hs"] Cradle:Stack project 2020-01-05 01:44:58.83182 [ThreadId 4] - done
良さそう。この辺りを LanguageClient-neovim
に設定していく。
[[plugins]] repo = 'autozimu/LanguageClient-neovim' on_ft = ['elixir', 'python', 'ruby', 'rust', 'cpp', 'go', 'erlang', 'haskell'] rev = 'next' build = 'source install.sh' hook_add = ''' set hidden set signcolumn=yes let g:LanguageClient_serverCommands = { \ 'python': ['pyls'], \ 'ruby': ['solargraph', 'stdio'], \ 'cpp': ['clangd'], \ 'go': ['bingo', '-mode', 'stdio'], \ 'rust': ['rustup', 'run', 'nightly', 'rls'], \ 'erlang': ['$HOME/erlang_ls/_build/prod/rel/erlang_ls/erlang_ls-0.0.1/bin/erlang_ls foreground'], \ 'elixir': ['$HOME/.config/elixir-ls/language_server.sh'], \ 'haskell': ['hie-wrapper', '--lsp'] \} let g:LanguageClient_hasSnippetSupport = 0 let g:neosnippet#enable_complete_done = 0 let g:LanguageClient_rootMarkers = ['*.cabal', 'stack.yaml'] nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR> nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR> nnoremap <silent> <F2> :call LanguageClient#textDocument_rename()<CR> nnoremap <leader>lm :call LanguageClient_contextMenu()<CR> let g:LanguageClient_loggingLevel = 'DEBUG' let g:LanguageClient_loggingFile = expand('~/.local/share/nvim/LanguageClient.log') let g:LanguageClient_serverStderr = expand('~/.local/share/nvim/LanguageServer.log') let g:LanguageClient_settingsPath = expand('$XDG_CONFIG_HOME/lsp/settings.json') let g:LanguageClient_loadSettings = 1 '''
だいたいこんな感じ。 何も分からんが補完は効いてそう。
終わりに
去年の夏に負荷試験ツールを作っていたのですが、中途半端になってたので完成させたいなぁって思ったり。