ためすう
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.cnf
が app
ユーザーになっていることが分かります。
おまけ
確認したコンテナ環境
$ 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 で使用した値が参照できないことが確認できました。