ksaitoの日記

日々試したことの覚え書き

kubbectl cluster-info dumpのエラー

kubectl cluster-info dumpしたらエラーになりました。

$ kubectl cluster-info dump
error: missing apiVersion or kind and cannot assign it; no kind is registered for the type core.NodeList

バージョンは以下の通り

$ kubectl version --short
Client Version: v1.11.1
Server Version: v1.11.1
$

バージョンアップしたらエラーはなくなりました。

$ kubectl version --short
Client Version: v1.11.3
Server Version: v1.11.1
$ kubectl cluster-info dump | head -3
{
    "kind": "NodeList",
    "apiVersion": "v1",
$

docker buildkit

dockerのbuildkitを使ってみました。

試した環境は、下記の環境で、手持ちのDockerfileをビルドして、時間とサイズを比較してみました。

$ docker --version
Docker version 18.06.0-ce, build 0ffa825
$ 

従来のビルド

$ time docker build -t test --no-cache .
... 中略...

real    9m52.781s
user    0m1.090s
sys     0m0.760s
$ docker images | grep test
test  latest  a5b8c348f848  About a minute ago   1.92GB
$ 

BuildKitを使ったビルド

$ export DOCKER_BUILDKIT=1
$ time docker build -t test --no-cache .
... 中略...

real    9m24.446s
user    0m2.170s
sys     0m4.190s
$ docker images | grep test
test  latest  2e612a3380d0  About a minute ago   1.92GB
$

DockerfileにADDでURLから取得する処理が多かったので若干早くなった程度でした。 ビルドの経過がステップごとに表示され、可能な部分は並列で実行していることがわかります。 ステップごとの処理時間がわかりやすく表示されるので、Dockerfileから削除しても良さそうな処理に気が付きやすいです。

デフォルトで使っていこう。

Amazon Linux 2のdocker環境をすばやく立ち上げる

EC2Launch Templatesを使ってAmazon Linux 2docker環境をすばやく立ち上げます。

設定は、次の項目です。

ユーザデータは、下記のような感じです。

$ curl http://169.254.169.254/latest/user-data/
#! /bin/bash

echo Install docker-ce
amazon-linux-extras install docker
systemctl start docker
systemctl enable docker
usermod -aG docker ec2-user

echo AWS_DEFAULT_REGION=ap-northeast-1
$

30秒で支度できます。

$ tail -1 /var/log/cloud-init-output.log 
Cloud-init v. 18.2-72.amzn2.0.6 finished at Wed, 05 Sep 2018 09:48:05 +0000. Datasource DataSourceEc2.  Up 30.52 seconds
$ 

バージョン管理もでき、地味に便利なのですが、下記は改善してほしいです。

  • 設定のエクスポートが部分的にしかできない(他のアカウントやリージョンと共有したい)
  • デフォルトバージョンを指定してもバージョンの指定が必要

以上

githubのpull requestをローカルにチェックアウトする

githubのpull requestをローカルにチェックアウトします。 オフシャルの手順は、下記のリンクです。

github.com

maven-scmの#31のpull requestをチェックアウトしました。

最初にgithubmaven-scmのリポジトリをforkします。 その後で、次のような手順で#31のpull requestがを

  • forkしたリポジトリをcloneする
  • upstreamを追加する
  • pull requestをfetchする
  • fetchしたpull requestをチェックアウトする
git clone https://github.com/githubユーザ/maven-scm.git
git remote add upstream https://github.com/apache/maven-scm.git
git fetch upstream pull/31/head:pr31-maven-scm
git checkout pr31-maven-scm

#31mavenのローカルリポジトリにインストールします。

mvn install -DskipTests=true

1.9.5-SNAPSHOTが作成されました。

$ ls -t ~/.m2/repository/org/apache/maven/plugins/maven-scm-plugin | head -1
1.9.5-SNAPSHOT
$

以上

docker for macのdocker0

docker for macのdocker0が見当たりませんでした。

$ ifconfig docker0
ifconfig: interface docker0 does not exist

docker for macのハイパーバイザは、modyで、接続するにはscreenを使います。

$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

modyに接続するとdocker0が参照できます。 なぜか、2回目以降、screenの画面表示が崩れてしまいスクリーンショットが取れません。

Jenkinsプラグインのデバッグ

Jenkinsのプラグインデバッグの手順です。

ソースコードの取得

今回は、github-branch-source-pluginでやってみました。

git clone https://github.com/jenkinsci/github-branch-source-plugin
cd github-branch-source-plugin

テスト実行

下記のコマンドでビルドしてポート8000でテスト実行できます。 初回は、とても時間がかかります。

mvn hpi:run -Djetty.port=8000

http://localhost:8000にアクセスすると下記のようなリンクが表示されるので、それを選択するとJenkinsが起動します。

f:id:ksaito11:20180723201419p:plain

以上

tomcatのオフシャルコンテナでスレッドダンプを取る

Tomcatのオフシャルコンテナのソースをcloneします。

git clone  https://github.com/docker-library/tomcat.git
cd tomcat/8.0/jre8

オフシャルコンテナのベースは、JREなのでJDKに変更します。

$ git diff
diff --git a/8.0/jre8/Dockerfile b/8.0/jre8/Dockerfile
index 973c8f3..be061ce 100644
--- a/8.0/jre8/Dockerfile
+++ b/8.0/jre8/Dockerfile
@@ -1,4 +1,4 @@
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 
 ENV CATALINA_HOME /usr/local/tomcat
 ENV PATH $CATALINA_HOME/bin:$PATH
$ docker build -t test .

起動します。

docker run --name tomcat -d test
$ docker exec -it tomcat bash
root@df763096e049:/usr/local/tomcat#

一番CPUを使っているスレッドを特定します。 今回は、特に何も使っていないのですが...

root@df763096e049:/usr/local/tomcat# top -n 1 -H -p `pgrep java` | head
top - 12:58:35 up 1 day,  7:45,  0 users,  load average: 0.06, 0.09, 0.12
Threads:  42 total,   0 running,  42 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.8 sy,  0.0 ni, 98.3 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2046940 total,   305596 free,   368720 used,  1372624 buff/cache
KiB Swap:  1048572 total,  1038284 free,    10288 used.  1481004 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                  
    1 root      20   0 3015160  97540  19840 S  0.0  4.8   0:00.03 java                                                                                                                                     
    9 root      20   0 3015160  97540  19840 S  0.0  4.8   0:00.70 java                                                                                                                                     
   10 root      20   0 3015160  97540  19840 S  0.0  4.8   0:00.01 java                                                                                                                                     
root@df763096e049:/usr/local/tomcat#

CPUを一番使っているPIDを16進数に変換します。 今回は、意味ないですが...

root@df763096e049:/usr/local/tomcat# printf %x\\n 1
1
root@df763096e049:/usr/local/tomcat#

スレッドダンプを取ります。

root@df763096e049:/usr/local/tomcat# jstack `pgrep java` > thread.txt
root@df763096e049:/usr/local/tomcat# head thread.txt 
2018-07-02 13:02:13
Full thread dump OpenJDK 64-Bit Server VM (25.171-b11 mixed mode):

"Attach Listener" #43 daemon prio=9 os_prio=0 tid=0x00007f5c40001000 nid=0x51 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"ajp-apr-8009-AsyncTimeout" #41 daemon prio=5 os_prio=0 tid=0x00007f5c6c518000 nid=0x33 waiting on condition [0x00007f5c510d7000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at org.apache.tomcat.util.net.AbstractEndpoint$AsyncTimeout.run(AbstractEndpoint.java:130)
root@df763096e049:/usr/local/tomcat#

スレッドのPIDを16進数に変換したものがスレッドダンプのnid=に対応します。 CPUを消費しているスレッドダンプが特定できるとスタックトレースからCPUを消費しているパッケージ、クラスが特定できます。

メモリ

メモリの枯渇が問題となる場合は、プロセスIDを指定してヒストグラムを取ります。

root@df763096e049:/usr/local/tomcat# jmap -histo 1 | head

 num     #instances         #bytes  class name
----------------------------------------------
   1:         34192        7276720  [C
   2:            37        1328696  [J
   3:          2801        1157408  [I
   4:         31998         767952  java.lang.String
   5:          4922         718224  [B
   6:         17622         563904  java.util.HashMap$Node
   7:          4450         391600  java.lang.reflect.Method
root@df763096e049:/usr/local/tomcat# 

ガベージは、下記のようにPID=1を1000ms毎に3回取得します。

root@df763096e049:/usr/local/tomcat# jstat -gc 1 1000 3
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
512.0  8704.0  0.0    0.0   33792.0   1730.6   30208.0    13429.3   15872.0 15252.9 1792.0 1669.2      6    0.027   2      0.068    0.095
512.0  8704.0  0.0    0.0   33792.0   1730.6   30208.0    13429.3   15872.0 15252.9 1792.0 1669.2      6    0.027   2      0.068    0.095
512.0  8704.0  0.0    0.0   33792.0   1730.6   30208.0    13429.3   15872.0 15252.9 1792.0 1669.2      6    0.027   2      0.068    0.095
root@df763096e049:/usr/local/tomcat#