Docker で PHPRedis を使う

PHP でセッションを管理する Web アプリを制作しているが、セッション情報はサーバーの再起動などで揮発してしまう。そこで、セッション情報を DB で管理する方法として PHPRedis を試してみる。

Read More

【Kubectl】Podのコンテナ内でコマンドを実行する

コンテナ内でコマンドを実行する

1
2
>kubectl exec -it sample-pod pwd
/

コンテナ内で引数があるコマンドを実行する

コマンドの前に “–” を付与する。

1
2
>kubectl exec -it sample-pod -- uname -a
Linux sample-pod 4.19.81 #1 SMP Tue Dec 10 16:09:50 PST 2019 x86_64 GNU/Linux

コンテナ内で対話的にコマンドを実行する

コンテナの外に出るには exit コマンドを使用する。

1
2
3
4
>kubectl exec -it sample-pod /bin/sh
# pwd
/
# exit

【kebectl]】Pod を作成する

Pod の設定ファイルを記述する

Nginx のコンテナを含む Pod を設定する。

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
spec:
containers:
- name: nginx-container
image: nginx:1.12
ports:
- containerPort: 80

Pod を起動する

1
2
>kubectl create -f sample-pod.yml
pod/sample-pod created

起動状態を確認する

起動直後はコンテナを生成する。このとき、POD の状態はコンテナの作成中を意味する ContainerCreating になる。

1
2
3
>kubectl get pod
NAME READY STATUS RESTARTS AGE
sample-pod 0/1 ContainerCreating 0 8s

作成を開始してからしばらく経つと、コンテナが起動する。

1
2
3
>kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-pod 1/1 Running 0 4m11s

Pod の状態を出力するときに、-o wide オプションを付与すると、表示内容を増やすことができる。

1
2
3
D:\working\temp\kubernetes\pod>kubectl get pods sample-pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sample-pod 1/1 Running 0 68m 172.17.0.6 minikube <none> <none>

-o オプションは表示内容のフォーマットを変更するオプションで以下のフォーマットに対応している。

1
2
3
4
5
6
7
8
9
>kubectl get pods sample-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].
--output-watch-events=false: Output watch event objects when --watch or --watch-only is used. Existing objects are
...

詳細情報を出力するには、kubectl discribe コマンドを実行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
>kubectl describe pods sample-pod
Name: sample-pod
Namespace: default
Priority: 0
Node: minikube/192.168.99.101
Start Time: Wed, 05 Feb 2020 16:14:23 +0900
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"sample-pod","namespace":"default"},"spec":{"containers":[{"image":"ng...
Status: Running
IP: 172.17.0.6
IPs:
IP: 172.17.0.6
Containers:
nginx-container:
Container ID: docker://3bb3512d4603eb773223b30dbc184df153e8846d6fd7b6990de42bdc9cfe1949
Image: nginx:1.17
Image ID: docker-pullable://nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 05 Feb 2020 18:24:15 +0900
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Wed, 05 Feb 2020 16:14:38 +0900
Finished: Wed, 05 Feb 2020 18:24:02 +0900
Ready: True
Restart Count: 1
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-7sf75 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-7sf75:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-7sf75
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Killing 75s kubelet, minikube Container nginx-container definition changed, will be restarted
Normal Pulling 75s kubelet, minikube Pulling image "nginx:1.17"
Normal Created 62s (x2 over 130m) kubelet, minikube Created container nginx-container
Normal Started 62s (x2 over 130m) kubelet, minikube Started container nginx-container
Normal Pulled 62s kubelet, minikube Successfully pulled image "nginx:1.17"

リソースファイルを編集して Pod を再起動する

リソースファイルを変更した場合は、kubectl apply コマンドで変更を伝える。

1
2
>kubectl apply -f sample-pod.yml
pod/sample-pod configured

起動に失敗する例

-すでに起動済みの場合

1
2
>kubectl create -f sample-pod.yml
Error from server (AlreadyExists): error when creating "sample-pod.yml": pods "sample-pod" already exists

リソースファイルに変更がなかったり、リーソースファイルが存在しない場合は Pod は起動しない。

-リソースファイルに変更がない場合

1
2
>kubectl apply -f sample-pod.yml
pod/sample-pod unchanged

-リソースファイルが見つからない場合

1
2
>kubectl apply -f sample-pod-dummy.yml
error: the path "sample-pod-dummy.yml" does not exist