前回の夏の陣に引き続き、「トラコン」ことICTトラブルシューティングコンテスト(ICTSC)2021 冬の陣に「mis1yakudo」として参加してきました。
学生生活最後のトラコンで、現メンバーでのトラコン出場はこれで最後となります。4月からは本番のトラブルシューティングが始まると考えたら震えが止まりません。困った。
ちなみに前回(夏の陣)の記事はこちらから↓
結果は、全問正答で優勝でした。
チームでの最終獲得点数は、2300ptでした。
以下は解いた問題のメモ。
writeup
04 cilium-bgp
200点じゃないだろこれ明らかに点数から推測されないように高得点が設定されている問題な気がしている
ciliumを入れたけどcilium関連のpodが上がらないという。
kubectl get pods -n kube-system
とするとcilium関連のpodがCrashLoopBackOffになってたりしている。
こういうときはログを見るのが定石ってことで徐にログを見る。
user@k8s:~$ kubectl -n kube-system logs -l k8s-app=cilium level=info msg=" - !:annotation.*" subsys=labels-filter level=info msg=" - !:etcd_node" subsys=labels-filter level=info msg="Using autogenerated IPv4 allocation range" subsys=node v4Prefix=10.1.0.0/16 level=info msg="Initializing daemon" subsys=daemon level=info msg="Establishing connection to apiserver" host="https://10.96.0.1:443" subsys=k8s level=info msg="Connected to apiserver" subsys=k8s level=info msg="Auto-disabling \"enable-node-port\", \"enable-external-ips\", \"enable-host-reachable-services\", \"enable-host-port\", \"enable-session-affinity\" features and falling back to \"enable-host-legacy-routing\"" subsys=daemon level=info msg="Inheriting MTU from external network interface" device=eth0 ipAddr=192.168.26.1 mtu=1500 subsys=mtu level=error msg="Error creating new BGP speaker" error="open /var/lib/cilium/bgp/config.yaml: no such file or directory" subsys=daemon level=fatal msg="Error while creating daemon" error="open /var/lib/cilium/bgp/config.yaml: no such file or directory" subsys=daemon
なんかBGP関連のconfigが読めていないらしい。
BGP関連のconfigはConfigMap経由でPodにマウントしてるのでこいつが原因っぽい。まあ見てみる。
user@k8s:~$ cat bgp-config.yaml apiVersion: v1 kind: ConfigMap metadata: namespace: kube-system name: bgp-config data: config: | peers: - peer-address: 192.168.26.254 peer-asn: 65020 my-asn: 65021 address-pools: - name: default protocol: bgp addresses: - 192.168.26.10/31
チュートリアルのサンプルと見比べるとtypoがあることを発見。この手のやつ普通に身に覚えがあるので解きながら悲しい気持ちになりました。
user@k8s:~$ diff -u bgp-config.yaml.orig bgp-config.yaml --- bgp-config.yaml.orig 2022-02-26 12:54:49.437335760 +0900 +++ bgp-config.yaml 2022-02-26 12:54:56.757363032 +0900 @@ -4,7 +4,7 @@ namespace: kube-system name: bgp-config data: - config: | + config.yaml: | peers: - peer-address: 192.168.26.254 peer-asn: 65020
これでCIliumは起動したので、ingress-nginxをhelmで入れてGG。
05 アンインストールされたがらない呪い
着手後すぐにお昼食べに行っちゃたので時間かかってしまった…
apt remove
しようとするとdpkg関連のファイルをlockできんよと怒られる。親の顔より見たCould not get lock /var/lib/dpkg/lock
。
shikugawaが最初に手をつけていたが、とっかかりがつかなかったらしくヘルプに入る。
エラーメッセージが「11 Resource temporarily unavailable」や「13 Permission denied」ではなく「1: Operation not permitted」なことに注目。何かしらLinuxのACLじゃない部分で操作を禁止されていそう。
考えうるものとしてはSE LInuxやApp Armorが思い浮かんだがチームメイトが事前調査した限りは違いそう。
雑にGoogleで「linux file operation restriction security howto」みたいな感じで調べたらlsattr
というコマンドがヒット。
これはext2/ext3/ext4で利用可能なファイル属性を確認するコマンドらしい。これでファイルの変更を禁止することとかもでるらしく、どうみてもこれと断定。知らんかった…
というわけでsudo chattr -i /var/lib/dpkg/lock
をしてGG。
06 5lowquery
I S U C O N
countクエリが遅い、ってことで雑にwhereしてるカラムにindexをはる。
11 明日の通勤は
SoftEther問題。最初は19が手をつけてたがSoftEtherであることを突き止めてもらった後にバトンタッチ。
VPNが繋がらないらしいとのことなので一旦ClientからVPNを繋ぎに行ってみる。Clientの設定に問題はなさそうでServerにも問題なく繋がる。が、dhclientでtun/tapにIPアドレスを割り当てるとpingが通らなくなりVPNも切れる。
Tsuzuくんと相談した結果、VPNのIPアドレスと接続先のNICに割り当てられてるIPアドレスのサブネットが衝突してることが判明。あとはTsuzuくんに丸投げして解いてもらいました。感謝。
14 無限
キャッシュサーバにhttpsでcurlをしてもページが正常に表示されないというやつ。
curlしてみると301 moved permanentlyが出るのでリダイレクトオプションをつけて再度試してみる。すると無限リダイレクトが発生する。
この時点でnginxの設定を疑う。cacheサーバー側の/etc/nginx/sites-enabled/default
を見るとproxy_passにhttpのアドレスを指定していることが判明。これだとhttpsへリダイレクトした時に飛ばされる先が正しくないので無限にリダイレクトしてしまう。
そこで以下のように書き換えるといい感じになる。
user@cache-server:/etc/nginx/sites-enabled$ diff -u /tmp/default ./default --- /tmp/default 2022-02-26 11:11:06.180189991 +0900 +++ ./default 2022-02-26 11:18:59.481442268 +0900 @@ -81,7 +81,7 @@ server_name mydomain.test; location / { - proxy_pass http://wictsc.test; + proxy_pass https://wictsc.test; } }
15 ansible
問題名をよく覚えてないけどansible問題。
見るとsetup.yamlがガバなので直す。
- apt関連のコマンド実行、configファイルの転送、serviceの再起動には権限昇格が必要なので
become: yes
をよしなに追加 - templateに変数を埋め込むためには
copy
モジュールではなくtemplate
モジュールを使用する必要があるのでそのように変更
あとはやるだけ
16 無限クリック
VNCで繋いで、指定されたファイルをファイルマネージャから開くとうまくFireFoxが開かないという。対象のファイルはprob16.html
みたいな名前のHTMLファイルだった気がする。
一瞬見えるウインドウにPython3.8のSyntaxErrorが見えたのでおそらくデフォルトのアプリが間違って設定されているとかだろうなと推測。
実際以下のように推測通りの状態になっている。
$ xdg-mime query default text/html python3.8.desktop
xdg-mimeってコマンドはもちろん知らなかったので、ググって突き止めました。
ファイルのMIMEタイプごとにデフォルトアプリを設定するのはどうするのかと調べたら、どうやらだいたいのファイルマネージャは裏側でxdg-openを叩いてるらしい。なのでxdg-openが参照する設定ファイルをどうにかすればいい。
具体的には以下のようにすれば直る。
$ xdg-mime default firefox.desktop text/html
余談と写真たち
- 僕ができそうな問題は初日に全部解き終わってしまったので、2日目は応援係をしていました。
- 採点結果待ちの時間はアニソンイントロクイズをしてました。脳への負荷が異常。
- airbnbしたおうちがスカイツリーにめちゃくちゃ近かったのでソラマチに大変お世話になった。やっぱり泊まり込みでやると合宿感があってよい、おすすめです。
— むさしん (@musaprg) 2022年2月25日
トラブルシューティング1日目 pic.twitter.com/kUMaOxcxFG
— むさしん (@musaprg) 2022年2月25日
#mis1yakudo pic.twitter.com/A7Ndg7qRaC
— むさしん (@musaprg) 2022年2月27日
トラコンお疲れ様でした #mis1yakudo pic.twitter.com/97YAOYBNoL
— むさしん (@musaprg) 2022年2月28日
(こいつどんだけすき家いってんだ?)
というわけで、mis1yakudoチーム発足からICTSCに合計4回(ICTSC2019〜2020、2021夏、2021冬)参加したことになります。初回は圧倒的力不足を感じて非常に悔しい思いをしたことを今でも覚えています。あの時から思えば、今のmis1yakudoのメンバーは全員が圧倒的に成長しているなというのを強く感じます。
一つ心残りがあるとすれば時期が悪くて一回もオンサイト参加できなかったことですかね。実機がさわれないのはネットワーク勢も嘆いていて非常に残念です。
ただ学生のうちからこういったトラブルシューティングの経験を積むのは非常に良いと思います。ぜひみなさんも来年(もしあれば)ICTSCに参加してみてはいかがでしょうか。
有志の運営のみなさん、大会運営お疲れ様でした&ありがとうございました!
就職しても何かしらの形でICTSCに関われたらいいなあとぼんやり思う今日この頃なのでした(˘ω˘)