ためすう

Deployment を使ってみる (kubernetes)

2020-12-29

やったこと

Deployment を使ってみます。

確認環境

$ k version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:41:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}

調査

sample3.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment-first
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sample3
  template:
    metadata:
      labels:
        app: sample3
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16

マニフェストの適用

$ k apply -f sample3.yaml
deployment.apps/my-deployment-first created
$ k get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment-first   2/2     2            2           78s
$ k get rs
NAME                             DESIRED   CURRENT   READY   AGE
my-deployment-first-55df95dccf   2         2         2       3m37s
$ k get pods
NAME                                   READY   STATUS    RESTARTS   AGE
my-deployment-first-55df95dccf-8d9ld   1/1     Running   0          92s
my-deployment-first-55df95dccf-pcmr8   1/1     Running   0          90s

sample3.yaml を編集します。

          image: nginx:1.17
$ k apply -f sample3.yaml
deployment.apps/my-deployment-first configured
$ k get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment-first   2/2     0            2           20m
$ k get rs
NAME                             DESIRED   CURRENT   READY   AGE
my-deployment-first-55df95dccf   2         2         2       5m19s
my-deployment-first-5b8875c9cb   1         1         0       20m
$ k get pods
NAME                                   READY   STATUS              RESTARTS   AGE
my-deployment-first-55df95dccf-8d9ld   1/1     Running             0          2m48s
my-deployment-first-55df95dccf-pcmr8   1/1     Running             0          2m46s
my-deployment-first-5b8875c9cb-qp66z   0/1     ContainerCreating   0          0s

更新戦略の確認 ( .spec.strategy )

  • Recreate
  • RollingUpdate (デフォルト)
$ k get deployment -o jsonpath="{.items[*].spec.strategy}"
map[rollingUpdate:map[maxSurge:25% maxUnavailable:25%] type:RollingUpdate]

参考

ReplicaSet を使ってみる (kubernetes)

2020-12-28

やったこと

ReplicaSet を使ってみます。

確認環境

$ k version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:41:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}

調査

sample2.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-replica-first
spec:
  replicas: 2
  selector:
    matchLabels:
      app: sample-pod2
  template:
    metadata:
      labels:
        app: sample-pod2
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.17

マニフェストの適用

$ k apply -f sample2.yaml
replicaset.apps/my-replica-first created
$ k get replicasets -o wide
NAME               DESIRED   CURRENT   READY   AGE     CONTAINERS        IMAGES       SELECTOR
my-replica-first   2         2         2       4m50s   nginx-container   nginx:1.17   app=sample-pod2
$ k get pods
NAME                     READY   STATUS    RESTARTS   AGE
my-replica-first-9tmnq   1/1     Running   0          8m13s
my-replica-first-cqmff   1/1     Running   0          8m13s

Pod を1つ落として、セルフヒーリング機能を確かめる

$ k delete pod my-replica-first-9tmnq
pod "my-replica-first-9tmnq" deleted
$ k get pods
NAME                     READY   STATUS    RESTARTS   AGE
my-replica-first-86tk2   1/1     Running   0          10s
my-replica-first-cqmff   1/1     Running   0          8m36s
$ k describe rs my-replica-first
(省略)
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  10m   replicaset-controller  Created pod: my-replica-first-cqmff
  Normal  SuccessfulCreate  10m   replicaset-controller  Created pod: my-replica-first-9tmnq
  Normal  SuccessfulCreate  101s  replicaset-controller  Created pod: my-replica-first-86tk2

scale コマンドを使ってみる

$ k scale rs my-replica-first --replicas=3
replicaset.apps/my-replica-first scaled
$ k get pods
NAME                     READY   STATUS    RESTARTS   AGE
my-replica-first-7flv6   1/1     Running   0          8s
my-replica-first-86tk2   1/1     Running   0          5m29s
my-replica-first-cqmff   1/1     Running   0          13m

削除

$ k delete rs my-replica-first
replicaset.apps "my-replica-first" deleted

mapを使う (Go)

2020-12-28

やったこと

Goでmapを使ってみます。

調査

package main

import (
	"fmt"
	"runtime"
)


func main() {
        fmt.Println("確認環境: ", runtime.Version())

	m := make(map[string]int)
	fmt.Println(m["A"])
	value, ok := m["A"]
	if ok {
	  fmt.Println("A: ", value)
	} else {
	  fmt.Println("A: 存在しない")
	}

	m["A"] = 123
	value, ok = m["A"]
	if ok {
	  fmt.Println("A: ", value)
	} else {
	  fmt.Println("A: 存在しない")
	}
}

出力結果

確認環境:  go1.15.6
0
A: 存在しない
A:  123

Pod を使ってみる (kubernetes)

2020-12-27

やったこと

Pod を立ち上げてみます。

確認環境

$ k version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:41:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}

調査

sample.yaml

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: nginx-container
      image: nginx:1.17

マニフェストの適用

$ k apply -f sample.yaml
pod/sample-pod created

Pod取得

$ k get pod sample-pod -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP           NODE             NOMINATED NODE   READINESS GATES
sample-pod   1/1     Running   0          7m22s   10.1.0.132   docker-desktop   <none>           <none>

$ k get pod --help より

-o, –output=”: Output format. One of: json|yaml|wide|name|custom-columns=…|custom-columns-file=…|go-template=…|go-template-file=…|jsonpath=…|jsonpath-file=… See custom columns [http://kubernetes.io/docs/user-guide/kubectl-overview/#custom-columns], golang template [http://golang.org/pkg/text/template/#pkg-overview] and jsonpath template [http://kubernetes.io/docs/user-guide/jsonpath].

コンテナにログイン

$ k exec -it sample-pod bash
root@sample-pod:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var

ホストOSからコマンド実行

$ k exec -it sample-pod -- ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr

Ceil、Floorを使ってみる (Go)

2020-12-27

やったこと

Goで切り上げ、切り捨てをするため、Ceil、Floorを使ってみます。

調査

package main

import (
	"fmt"
	"runtime"
	"math"
)

func main() {
	fmt.Println("確認環境: ", runtime.Version())
	a := [...] float64{1.49, 1.50, 1.51}
	for i := 0; i < 3; i++ {
		c := math.Ceil(a[i])
		fmt.Println("対象数値: ", a[i])
		fmt.Println("切り捨て後: ", c)

		d := math.Floor(a[i])
		fmt.Println("切り上げ後: ", d)
	}

}

出力結果

確認環境:  go1.15.6
対象数値:  1.49
切り捨て後:  2
切り上げ後:  1
対象数値:  1.5
切り捨て後:  2
切り上げ後:  1
対象数値:  1.51
切り捨て後:  2
切り上げ後:  1

参考

Powを使ってみる (Go)

2020-12-26

やったこと

GoでPowを使ってみます。

調査

package main

import (
	"fmt"
	"runtime"
	"math"
)

func main() {
	fmt.Println("確認環境: ", runtime.Version())
	c := math.Pow(2, 3)
	fmt.Println(c)

	c2 := math.Pow(2, 0)
	fmt.Println(c2)

	c3 := math.Pow(2, 0.5)
	fmt.Println(c3)
}

出力結果

確認環境:  go1.15.6
8
1
1.4142135623730951

参考

Kali Linux環境構築 (on Docker)

2020-12-26

やったこと

DockerでKali Linux環境を構築します。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d

調査

Kali Linux

DebianベースのLinuxディストリビューションである。ペネトレーションテストを主な目的としている。 - Kali Linux - Wikipedia

Dockerを使ってインストールしてみる

公式ドキュメントの通りにやっていきます。

$ docker pull kalilinux/kali-rolling
$ docker run -t -i kalilinux/kali-rolling

コンテナ
# apt-get update && apt-get install metasploit-framework

コンテナ: OSの確認

# cat /etc/os-release
PRETTY_NAME="Kali GNU/Linux Rolling"
NAME="Kali GNU/Linux"
ID=kali
VERSION="2020.4"
VERSION_ID="2020.4"
VERSION_CODENAME="kali-rolling"
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="https://www.kali.org/"
SUPPORT_URL="https://forums.kali.org/"
BUG_REPORT_URL="https://bugs.kali.org/"

最後に

CTF で使っていきたいと思います。

参考

DockerfileでUSERを利用する

2020-12-23

やったこと

DockerfileでUSERを使ってみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
      args:
        my_cnf: master.cnf
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes

Dockerfile

FROM mysql:5.6

RUN groupadd -r app && useradd -r -g app app
USER app
COPY ./master.cnf /etc/mysql/conf.d/my.cnf
COPY --chown=app:app ./master.cnf /etc/mysql/conf.d/my2.cnf

master.cnf

[mysqld]
server-id = 1
log_bin = mysql-bin

確認

$ docker-compose run db-master bash
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating mysql_db-master_run ... done
app@a636617998ba:/$ ls -lh /etc/mysql/conf.d/
total 20K
-rw-r--r-- 1 root root 43 Nov 21 01:23 docker.cnf
-rw-r--r-- 1 root root 43 Dec 20 13:47 my.cnf
-rw-r--r-- 1 app  app  43 Dec 20 13:47 my2.cnf
-rw-r--r-- 1 root root  8 Jul  9  2016 mysql.cnf
-rw-r--r-- 1 root root 55 Jul  9  2016 mysqldump.cnf

my2.cnfapp ユーザーになっていることが分かります。

おまけ

確認したコンテナ環境

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

$ groupadd --help
Usage: groupadd [options] GROUP

Options:
  -r, --system                  create a system account

$ useradd --help
Usage: useradd [options] LOGIN
       useradd -D
       useradd -D [options]

Options:
  -g, --gid GROUP               name or ID of the primary group of the new
                                account
  -r, --system                  create a system account

参考

docker-compose の環境変数を利用する

2020-12-22

やったこと

docker-composeの環境変数を利用してみます。

下記についてそれぞれやってみます。

  • env_file
  • environment
  • 実行元の環境変数

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
    env_file:
      - 'hoge.env'
    environment:
      - MY_ENV=myenvvvv
      - MY_ENV2=${HOST_100}

Dockerfile

FROM mysql:5.6

RUN echo $HOST_100
RUN echo $MY_ENV
RUN echo $AAA

hoge.env

AAA=BBB

環境変数をセットしておきます。

$ export HOST_100=999
$ echo $HOST_100
999

build してみます

$ docker-compose build --no-cache
Building db-master
Step 1/4 : FROM mysql:5.6
 ---> e1b3da40572b
Step 2/4 : RUN echo $HOST_100
 ---> Running in c7db45ca58d6

Removing intermediate container c7db45ca58d6
 ---> 74658905ed5f
Step 3/4 : RUN echo $MY_ENV
 ---> Running in a408138f343d

Removing intermediate container a408138f343d
 ---> 82e40a1c4754
Step 4/4 : RUN echo $AAA
 ---> Running in 10a445796fc5

Removing intermediate container 10a445796fc5
 ---> 88636d9beb52

Successfully built 88636d9beb52
Successfully tagged mysql_db-master:latest

build の段階では変数は読めていないことが分かりました。

それではコンテナを起動して、変数を出力してみましょう。

$ docker-compose up -d
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating mysql_db-master_1 ... done

$ docker-compose exec db-master bash
root@b01c6b0eecc9:/# echo $HOST_100

root@b01c6b0eecc9:/# echo $MY_ENV
myenvvvv
root@b01c6b0eecc9:/# echo $AAA
BBB
root@b01c6b0eecc9:/# echo $MY_ENV2
999

このことから、ホストOSの環境変数を渡すには、environment を利用する必要がありそうです。

参考

DockerfileのENVとARGを使ってみる

2020-12-21

やったこと

Dockerfile の ENV と ARG を使ってみます。

確認環境

$ docker --version
Docker version 19.03.13, build 4484c46d9d
$ docker-compose --version
docker-compose version 1.27.4, build 40524192

調査

docker-compose.yml

version: '3'
services:
  db-master:
    build:
      context: .
      args:
        hoge: 'my_arg'

Dockerfile

FROM mysql:5.6

ARG hoge
ENV MY_ENV my_envvv
RUN echo $hoge
RUN echo ${hoge}
RUN echo $MY_ENV

build します

$ docker-compose build
Building db-master
Step 1/6 : FROM mysql:5.6
 ---> e1b3da40572b
Step 2/6 : ARG hoge
 ---> Using cache
 ---> 1e88cd11277d
Step 3/6 : ENV MY_ENV my_envvv
 ---> Running in d4f0b0db64b1
Removing intermediate container d4f0b0db64b1
 ---> 2ba1cbf3fbb9
Step 4/6 : RUN echo $hoge
 ---> Running in ea3b888d7a9c
my_arg
Removing intermediate container ea3b888d7a9c
 ---> 76be4c3cb1c7
Step 5/6 : RUN echo ${hoge}
 ---> Running in 948c8bf0e3f7
my_arg
Removing intermediate container 948c8bf0e3f7
 ---> e883a7d8399a
Step 6/6 : RUN echo $MY_ENV
 ---> Running in 77f146eb50ab
my_envvv
Removing intermediate container 77f146eb50ab
 ---> bcc7d7b8df2e

Successfully built bcc7d7b8df2e
Successfully tagged mysql_db-master:latest

コンテナに入って、ARG、ENV で指定した値が読み出せるか見てみます。

$ docker-compose up -d
WARNING: Found orphan containers (mysql_db-slave_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating mysql_db-master_1 ... done

// コンテナに入ります
$ docker-compose exec db-master bash
root@e935de35c503:/#
root@e935de35c503:/#
root@e935de35c503:/# echo $MY_ENV
my_envvv
root@e935de35c503:/# echo $hoge

コンテナ起動時には、ARG で使用した値が参照できないことが確認できました。