2020/12/08
今回できたこと
K8sクラスタ環境に例題をデプロイする。
ただし、ステータスがエラーで、正常には動いていない。
未解決
flannelで正常に/run/flannel/subnet.envを提供する方法。
K8sクラスタで、正常にダッシュボードを提供する方法。
今後の作業
K8sクラスタで、STATUSの問題を解決し、例題を実行する。
お約束
文章化作業
日本仮想化技術株式会社概要だけの公開されているスライドは?
定例作業
調査中:K8sクラスタでのpodステータスがContainerCreatingから変わらない件
そもそも、テストケースが動かないのは、podの状態がContainerCreatingから変わらないのが原因のような気がするため、これに関して調べた。
そもそも、flannelが提供している/run/flannel/subnet.envにアクセスできないのが原因である。
code:shell
pi@master-rpi4$ kubectl describe pod hello-world-6df5659cb7-bctnp
Name: hello-world-6df5659cb7-bctnp
Namespace: default
Priority: 0
Node: worker-rpi3p/192.168.3.103
Start Time: Tue, 08 Dec 2020 14:18:54 +0900
Labels: app.kubernetes.io/name=load-balancer-example
pod-template-hash=6df5659cb7
Annotations: <none>
Status: Pending
(snip)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 22m default-scheduler Successfully assigned default/hello-world-6df5659cb7-bctnp to worker-rpi3p
Warning FailedCreatePodSandBox 21m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "2d611b57cc9f37fd9da6be03fcfc4f81f6cb72f1d72ae59c358137d1167b22ae" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
(snip)
試しに、以下のような/run/flannel/subnet.envを作成して、動作を確認した。
この設定は、worker側でも行う必要がある。
code:shell
pi@master-rpi4$ sudo mkdir -p /run/flannel/
pi@master-rpi4$ sudo vi /run/flannel/subnet.env
code:/run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
一度、load-balancer-exampleを削除する。
code:shell
deployment.apps "hello-world" deleted
pi@master-rpi4$ kubectl get deployment
No resources found in default namespace.
pi@master-rpi4$ kubectl get pod
No resources found in default namespace.
再度、load-balancer-exampleをデプロイする。
code:shell
deployment.apps/hello-world created
しばらく待つと、ステータスは、ContainerCreatingからErrImagePullやImagePullBackOffの別のエラー状態に変わり、最終的にCrashLoopBackOffとなった。
code:shell
pi@master-rpi4$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-6df5659cb7-4fnln 0/1 ImagePullBackOff 0 34m
hello-world-6df5659cb7-bfxtg 0/1 ErrImagePull 0 34m
hello-world-6df5659cb7-gf699 0/1 ErrImagePull 0 34m
hello-world-6df5659cb7-nnw66 0/1 ErrImagePull 0 34m
hello-world-6df5659cb7-s94vg 0/1 ImagePullBackOff 0 34m
code:shell
pi@master-rpi4$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-6df5659cb7-4fnln 0/1 CrashLoopBackOff 3 60m
hello-world-6df5659cb7-bfxtg 0/1 CrashLoopBackOff 2 60m
hello-world-6df5659cb7-gf699 0/1 CrashLoopBackOff 3 60m
hello-world-6df5659cb7-nnw66 0/1 CrashLoopBackOff 2 60m
hello-world-6df5659cb7-s94vg 0/1 CrashLoopBackOff 3 60m
とりあえず、後日、この線で調査を続ける。
Raspberry Pi K8sクラスタのためのダッシュボード作成
ダッシュボードの開発サイトは、であり、ここでの記述に従って作業を行なった。 以下のようにダッシュボードを実行する。
code:shell
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
K8s ダッシュボード用のproxyは以下のようにデフォルトで起動する。
code:shell
pi@master-rpi4$ kubectl proxy
Starting to serve on 127.0.0.1:8001
作業用Webブラウザ用のSSHプロキシは、以下のように起動する。
code:shell
mutoubushinokonpyuta-2% ssh -L 8080:localhost:8001 pi@192.168.3.101
code:yaml
{
"paths": [
"/api",
"/api/v1",
"/apis",
(snip)
"/readyz/shutdown",
"/version"
]
}
失敗:K8sダッシュボードへのアクセス
code:yaml
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "no endpoints available for service \"kubernetes-dashboard\"",
"reason": "ServiceUnavailable",
"code": 503
}
エントリポイントをたどるためには、指定したエントリポイントのURLで返される情報の"selfLink"をたどれば良いようである。
code:yaml
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "kubernetes-dashboard",
"namespace": "kubernetes-dashboard",
"selfLink": "/api/v1/namespaces/kubernetes-dashboard/services/kubernetes-dashboard",
"uid": "c76d7b88-529a-4e02-b90f-4f1b214867b4",
"resourceVersion": "58496",
"creationTimestamp": "2020-12-07T23:53:35Z",
"labels": {
"k8s-app": "kubernetes-dashboard"
},
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"k8s-app\":\"kubernetes-dashboard\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kubernetes-dashboard\"},\"spec\":{\"ports\":{\"port\":443,\"targetPort\":8443},\"selector\":{\"k8s-app\":\"kubernetes-dashboard\"}}}\n" },
"managedFields": [
{
"manager": "kubectl-client-side-apply",
"operation": "Update",
"apiVersion": "v1",
"time": "2020-12-07T23:53:35Z",
"fieldsType": "FieldsV1",
"fieldsV1": {"f:metadata":{"f:annotations":{".":{},"f:kubectl.kubernetes.io/last-applied-configuration":{}},"f:labels":{".":{},"f:k8s-app":{}}},"f:spec":{"f:ports":{".":{},"k:{\"port\":443,\"protocol\":\"TCP\"}":{".":{},"f:port":{},"f:protocol":{},"f:targetPort":{}}},"f:selector":{".":{},"f:k8s-app":{}},"f:sessionAffinity":{},"f:type":{}}}
}
]
},
"spec": {
"ports": [
{
"protocol": "TCP",
"port": 443,
"targetPort": 8443
}
],
"selector": {
"k8s-app": "kubernetes-dashboard"
},
"clusterIP": "10.100.143.57",
"type": "ClusterIP",
"sessionAffinity": "None"
},
"status": {
"loadBalancer": {
}
}
}
同様に、masterノード上xでcurlを使ってアクセスしても、同じ状況である。
code:yaml
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "no endpoints available for service \"kubernetes-dashboard\"",
"reason": "ServiceUnavailable",
"code": 503
}
とりあえず、ダッシュボードは無くてもコマンドラインで情報が得られると考え、ダッシュボードに対する作業は後で考える。
失敗: 作業用Webブラウザから直接ダッシュボードにアクセスする設定
以下のように、proxyを起動する。
ここでは、作業用Webブラウザ(@192.168.3.3)からアクセスするため、コマンドラインオプションを調整している。
--address="192.168.3.101": LISTENするアドレスを指定。0.0.0.0の指定では、IPv6でのアクセスしかできない。
--accept-hosts="^192\.168\.3\.3$": 接続を受け付けるホストの正規表現。
code:shell
pi@master-rpi4$ sudo kubectl proxy --address="192.168.3.101" --accept-hosts="^192\.168\.3\.3$"
Starting to serve on 192.168.3.101:8001
code:shell
pi@master-rpi4$ netstat -na|grep 8001
tcp 0 0 192.168.3.101:8001 0.0.0.0:* LISTEN
コマンドラインオプションを色々試してみたが、Forbiddenとなる状況は変わらなかった。
失敗:K8sクラスタでのHello Worldの実行
参考までに、masterだけを起動し、workerを起動していない状態では、kubectl get nodesは以下のようにSTATUSにNotReadyを返す。
もちろん、起動後は時間がかかるがReadyとなる。
code:shell
pi@master-rpi4$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-rpi4 Ready master 27h v1.19.4
worker-rpi3p NotReady <none> 27h v1.19.4
pi@master-rpi4$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-rpi4 Ready master 27h v1.19.4
worker-rpi3p Ready <none> 27h v1.19.4
例に上がっているfunction.ymlは、以下の通りだが、起動時にエラーとなる。
code:function.yml
apiVersion: v1
kind: Service
metadata:
name: markdownrender
labels:
app: markdownrender
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
targetPort: 8080
nodePort: 31118
selector:
app: markdownrender
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: markdownrender
spec:
replicas: 1
template:
metadata:
labels:
app: markdownrender
spec:
containers:
- name: markdownrender
image: functions/markdownrender:latest-armhf
imagePullPolicy: Always
ports:
- containerPort: 8080
protocol: TCP
エラーは出ているが、直接的な原因がわからないため、ここでの作業は中止する。
code:shell
pi@master-rpi4$ kubectl create -f function.yml
service/markdownrender created
error: error validating "function.yml": error validating data: ValidationError(Deployment.spec): missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors, turn validation off with --validate=false
pi@master-rpi4$ kubectl delete -f function.yml
service "markdownrender" deleted
Error from server (NotFound): error when deleting "function.yml": deployments.apps "markdownrender" not found
失敗:K8sクラスタでのHello World Oneの実行
code:shell
pi@master-rpi4$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
pod/kubernetes-bootcamp created
Raspberry Pi Kubernetesでは、このコマンドラインで、deployment.apps/kubernetes-bootcamp createdのようにdeploymentが作成されているが、こちらはpod/kubernetes-bootcamp createdのようにpodしか作成されていない。 また、podもSTAUSが起動状態になっていない。
code:shell
pi@master-rpi4$ kubectl get deployment --all-namespaces
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system coredns 0/2 2 0 28h
kubernetes-dashboard dashboard-metrics-scraper 0/1 1 0 4h51m
kubernetes-dashboard kubernetes-dashboard 0/1 1 0 4h51m
pi@master-rpi4$ kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp 0/1 ContainerCreating 0 14m
一度、このpodを削除する。
code:shell
pi@master-rpi4$ kubectl delete pod kubernetes-bootcamp
pod "kubernetes-bootcamp" deleted
code:shell
pi@master-rpi4$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created
しかし、このpodはいつまでたっても、STATUSがContainerCreatingから変わらず、deploymentも利用できない状態になっている。
code:shell
pi@master-rpi4$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 0/1 0 0 73s
pi@master-rpi4$ kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-57978f5f5d-lzlqc 0/1 ContainerCreating 0 4m39s
一度、このdeploymentを削除する。
code:shell
pi@master-rpi4$ kubectl delete deployment kubernetes-bootcamp
deployment.apps "kubernetes-bootcamp" deleted
失敗:K8sクラスタでのHello World Twoの実行
以下のように、load-balancer-exampleを実行する。
code:shell
deployment.apps/hello-world created
code:load-balancer-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: load-balancer-example
name: hello-world
spec:
replicas: 5
selector:
matchLabels:
app.kubernetes.io/name: load-balancer-example
template:
metadata:
labels:
app.kubernetes.io/name: load-balancer-example
spec:
containers:
- image: gcr.io/google-samples/node-hello:1.0
name: hello-world
ports:
- containerPort: 8080
podは以下のように作成されているが、STATUSがContainerCreatingから変わらない。
code:shell
pi@master-rpi4$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-world-6df5659cb7-bctnp 0/1 ContainerCreating 0 57s
hello-world-6df5659cb7-cfxgg 0/1 ContainerCreating 0 57s
hello-world-6df5659cb7-nbn8s 0/1 ContainerCreating 0 57s
hello-world-6df5659cb7-psnzh 0/1 ContainerCreating 0 57s
hello-world-6df5659cb7-zshkn 0/1 ContainerCreating 0 57s
一つのpodの詳細情報をdescribeで出力すると、以下のようになった。
/run/flannel/subnet.envにアクセスできないことが原因だとということがわかった。
code:shell
pi@master-rpi4$ kubectl describe pod hello-world-6df5659cb7-bctnp
Name: hello-world-6df5659cb7-bctnp
Namespace: default
Priority: 0
Node: worker-rpi3p/192.168.3.103
Start Time: Tue, 08 Dec 2020 14:18:54 +0900
Labels: app.kubernetes.io/name=load-balancer-example
pod-template-hash=6df5659cb7
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Controlled By: ReplicaSet/hello-world-6df5659cb7
Containers:
hello-world:
Container ID:
Image: gcr.io/google-samples/node-hello:1.0
Image ID:
Port: 8080/TCP
Host Port: 0/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-qqknn (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-qqknn:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-qqknn
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 22m default-scheduler Successfully assigned default/hello-world-6df5659cb7-bctnp to worker-rpi3p
Warning FailedCreatePodSandBox 21m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "2d611b57cc9f37fd9da6be03fcfc4f81f6cb72f1d72ae59c358137d1167b22ae" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 20m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "ceff1c2f75ab14971b1fd03c8424a45ac86915e33c2d95a7b8f4cdcf49a9238d" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 19m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "f3bc7a03c24645a19e22f02a7127a409aa15fd07790910fa0d88ab9d32bc90f4" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 18m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "0e3804d9c0acee9bb81431bd6bf447a0b4099ebc7a1a9aacd9ea552662d6a4f9" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 17m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "4b340f3f0882f02550d438b5712d54c44455583d8c47110056daa10fc0c06d49" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 17m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "bf2beaca8261e86e39c1146bde94bd8b723f0a324700e2d520455b0cacc97e4c" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 16m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "0d8f2194ce525ba4f68939dbb8d07d13deb1043b4ed90361a4cf7fa7b4a2ba01" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 14m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "7b992042c2d6b25183a0782e946e4fd4d432bdd90098f1f9fb95caace16f87a6" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Warning FailedCreatePodSandBox 13m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "b4baf8d35cc9ba7adf4b1432d3e8a2cfa527b25b54243d65d49522f15e6b3cca" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory
Normal SandboxChanged 8m15s (x13 over 21m) kubelet Pod sandbox changed, it will be killed and re-created.
Warning FailedCreatePodSandBox 40s (x10 over 12m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "85f9e471c15a9d56a63b136d0039e36e4b28a9c599bb9ed64f094f70265dd84b" network for pod "hello-world-6df5659cb7-bctnp": networkPlugin cni failed to set up pod "hello-world-6df5659cb7-bctnp_default" network: open /run/flannel/subnet.env: no such file or directory