こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。
今回は、kubernetes場でnginxをWebサーバとして簡単に使ってみたメモです。
0.準備
準備としては、以下の記事で使ったdocker環境やkubectlを使えるようにセットアップしていますので、同等の環境があれば実施可能かと思います。
docker 〜Dockerfile を使用した、コンテナの作成・起動〜 - Opensourcetechブログ
kubernetes(kubectl)のインストール - Opensourcetechブログ
あとは、DockerのPreferencesから Kubernetesを見て「runnning」になっていれば大丈夫かなと思います。
1.kubernetes環境の更新
kubectlコマンドを使って、「docker-for-desktop」を使うように変更を行います。
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* docker-desktop docker-desktop docker-desktop
docker-for-desktop docker-desktop docker-desktop
bash-3.2$ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
bash-3.2$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-desktop docker-desktop docker-desktop
* docker-for-desktop docker-desktop docker-desktop
bash-3.2$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-desktop Ready master 3m17s v1.14.6
2.ダッシュボードの起動
Webブラウザからkubernetesの状況を確認できるダッシュボードを起動します。
secret/kubernetes-dashboard-certs created
serviceaccount/kubernetes-dashboard created
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
deployment.apps/kubernetes-dashboard created
service/kubernetes-dashboard created
bash-3.2$ kubectl proxy
Starting to serve on 127.0.0.1:8001
なお、使用するURLは以下となります。
アクセスすると、以下のように認証画面になります。
※kubernetesのバージョンによっては、skipで認証スキップできる模様。
3.ダッシュボードへのログイン
今回はトークンを使用しました。
使用するトークンは、以下のコマンドで内部で保持するアカウント一覧がみることが出来るので、その中から選択したアカウントの詳細をみるとトークンがわかります。
※今回は「default-token-bmv79」というアカウントで操作してます。
bash-3.2$ kubectl -n kube-system get secret
NAME TYPE DATA AGE
attachdetach-controller-token-9cxcp kubernetes.io/service-account-token 3 132m
bootstrap-signer-token-jzdnh kubernetes.io/service-account-token 3 132m
bootstrap-token-abcdef bootstrap.kubernetes.io/token 6 132m
certificate-controller-token-gjlqb kubernetes.io/service-account-token 3 132m
clusterrole-aggregation-controller-token-tjdxh kubernetes.io/service-account-token 3 132m
coredns-token-mz5p6 kubernetes.io/service-account-token 3 132m
cronjob-controller-token-mm9hd kubernetes.io/service-account-token 3 132m
daemon-set-controller-token-kn49q kubernetes.io/service-account-token 3 132m
default-token-bmv79 kubernetes.io/service-account-token 3 132m・・・これ
deployment-controller-token-65j9m kubernetes.io/service-account-token 3 132m
disruption-controller-token-c7sk5 kubernetes.io/service-account-token 3 132m
endpoint-controller-token-qf459 kubernetes.io/service-account-token 3 132m
expand-controller-token-nnds7 kubernetes.io/service-account-token 3 132m
generic-garbage-collector-token-ctw5n kubernetes.io/service-account-token 3 132m
horizontal-pod-autoscaler-token-mrvnj kubernetes.io/service-account-token 3 132m
job-controller-token-7qkmc kubernetes.io/service-account-token 3 132m
kube-proxy-token-d2hqq kubernetes.io/service-account-token 3 132m
kubernetes-dashboard-certs Opaque 0 9m47s
kubernetes-dashboard-key-holder Opaque 2 9m33s
kubernetes-dashboard-token-lgl86 kubernetes.io/service-account-token 3 9m47s
namespace-controller-token-vx597 kubernetes.io/service-account-token 3 132m
node-controller-token-rjvmm kubernetes.io/service-account-token 3 132m
persistent-volume-binder-token-8gjzh kubernetes.io/service-account-token 3 132m
pod-garbage-collector-token-phqbn kubernetes.io/service-account-token 3 132m
pv-protection-controller-token-77wlm kubernetes.io/service-account-token 3 132m
pvc-protection-controller-token-zpdk5 kubernetes.io/service-account-token 3 132m
replicaset-controller-token-jrwhd kubernetes.io/service-account-token 3 132m
replication-controller-token-x8z6g kubernetes.io/service-account-token 3 132m
resourcequota-controller-token-kfm66 kubernetes.io/service-account-token 3 132m
service-account-controller-token-vrf97 kubernetes.io/service-account-token 3 132m
service-controller-token-pv95d kubernetes.io/service-account-token 3 132m
statefulset-controller-token-nbkvl kubernetes.io/service-account-token 3 132m
token-cleaner-token-ms7b6 kubernetes.io/service-account-token 3 132m
ttl-controller-token-7pgg9 kubernetes.io/service-account-token 3 132m
bash-3.2$ kubectl -n kube-system describe secret default-token-bmv79
Name: default-token-bmv79
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: fb9295b7-d12d-11e9-bf63-025000000001
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLWJtdjc5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmYjkyOTViNy1kMTJkLTExZTktYmY2My0wMjUwMDAwMDAwMDEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.TT41cUtUFvn7hxLpTazSgS7RDn855i_v1knqqsQAHTPfuCB9lGW6fdqjOR3cFjbBM2Xb810O09qhy5OFlkPKt7_sxtrzB7s1zxOGdyKeMnU7youdMU0V0pDfQ6UGkWlGbPS0T6W3oyqSUKB42rPKTSiGSeJhB8kkoNMwQC3bjUFFp1FYO4LBYIeqNGFSISvy17Ww2KjYBhkhigr6UDTvWNFsHpJy1p1t5gFr9-jUgayfG9vSSHIGo02aQVe6omCzF6cjID1ma3_EddCxdCcXFoVZ9YjPMGgrQCHMS54CSruwn0lX1tjSfw_ogaTqJsFfuIrfQPPVXW5oEHct1z2Oxx
ca.crt: 1025 bytes
namespace: 11 bytes
コピーしたトークンを、ペーストしサインインします。
4.nginxコンテナの起動
nginx 1.17.3のdockerイメージを指定し、nginxという名のコンテナを起動します。
なお、kubernetesの内部に存在するネットワークのIPアドレスで起動しており、外部からアクセスはできません。
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx created
XYZ:~ Yoshiki$ kubectl get pods・・・起動しているpod一覧
NAME READY STATUS RESTARTS AGE
nginx-6f99b6dbc5-zxxcm 1/1 Running 0 8s
nginx-pod 1/1 Running 0 17m
XYZ:~ Yoshiki$ kubectl describe pods nginx-6f99b6dbc5-zxxcm・・・詳細
Name: nginx-6f99b6dbc5-zxxcm
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: docker-desktop/192.168.65.3
Start Time: Sat, 07 Sep 2019 21:09:22 +0900
Labels: pod-template-hash=6f99b6dbc5
run=nginx
Annotations: <none>
Status: Running
IP: 10.1.0.7
Controlled By: ReplicaSet/nginx-6f99b6dbc5
Containers:
nginx:
Container ID: docker://fd53d7c8b29a585717cc87d7cdefd6ff9d421feff068f423f01c0fae78020003
Image: nginx:1.17.3
Image ID: docker-pullable://nginx@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Sat, 07 Sep 2019 21:09:27 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sxnbq (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-sxnbq:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-sxnbq
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 Scheduled 43s default-scheduler Successfully assigned default/nginx-6f99b6dbc5-zxxcm to docker-desktop
Normal Pulling 42s kubelet, docker-desktop Pulling image "nginx:1.17.3"
Normal Pulled 38s kubelet, docker-desktop Successfully pulled image "nginx:1.17.3"
Normal Created 38s kubelet, docker-desktop Created container nginx
Normal Started 38s kubelet, docker-desktop Started container nginx
5.外部からのアクセス可能なコンテナ
外部からアクセス可能なコンテナを起動します。
具体的には、kubernetesを動かしているホストIPアドレスのTCP80ボートをアサインします。
service/nginx exposed
XYZ:~ Yoshiki$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h59m
nginx LoadBalancer 10.111.19.75 localhost 80:32076/TCP 6s
Webブラウザからアクセスすると、http://localhost:80で起動したnginxにアクセスできます。
また、ダッシュボードから見ると、起動したnginxが追加され、
localhost:80が外部向けのIPアドレス & ポート番号になっていることが確認できます。
※4.で作成したコンテナ(Pod)にkubectl port-forward で外部からアクセス可能なポートをアサインすることも可能です。
おわりに
今回はシンプルにkubernetesでnginxを起動することを目標に操作しました。
しかし、もうちょっと凝ったことやyamlから細かく制御したりなど今後色々試してみたいと思います。