Edited at

kubernetes(k8s)環境構築編


モチベーション

もうDockerから逃げることはできない。戦わねばならないか。

ということで、そのへんをまとめて面倒を見てくれるくーべねてぃすさんをお試ししてみます。(コンテナオーケストレーションというらしい)

何がいいって、本番でも開発でもローカルでもリモートでも同じ環境を構築できると言っていてそれがどうやら本当らしい。ってところでしょうか。

k8sはkとsの間に8文字アルファベットが入るのでk8sなんですってよ。

APサーバとアプリケーションをk8sさんで管理する感じになる。dockerコンテナの配布まで行ってくれるので楽だよと。

3分で分かった気になる、Kubernetes とは?


単語


  • マスター


    • クラスタ全体の管理をする。ノードやDNS,ルーティングなど。ここのAPIに向かってコマンドを投げる。



  • クラスタ


    • ノードの集合



  • ノード


    • Podが動作するマシン

    • 1ノード内に複数のPodが動作できる。



  • Pod


    • docker コンテナの集合. docker コンテナは Pod 単位で Node に配備される



各種コンテナを管理する。コンテナ単体はPodと呼ばれる。(例えばpodがdockerインスタンス1個1個ってことになるね!

今さら人に聞けない Kubernetes とは?

[第1回]Kubernetesの公式チュートリアルをやって基本を抑える -アプリのデプロイ-


セットアップ

開発環境ではminikubeというものを利用してVirtualBoxのインスタンスの中にminikubeをセットアップしてくれます。実際のpodsたちはDockerコンテナにより提供されますよ。


Dockerを入れる

k8sのキモとなるdockerはどの場合でもインストールしておく必要があるよ。

公式ドキュメントを参考にdocker CEをいれましょう。(CEはcommunity editionのこと)

https://docs.docker.com/

dockerさんでsudoを不要にする。Dockerコマンドをsudoなしで実行する方法


開発環境(ローカルVirtualBox)


minikube

minikubeを手順の通りインストールする。https://github.com/kubernetes/minikube


kubectl

yum.repos.dにk8sのリポジトリを追加してインストールするのが良い模様。macの場合はbrew, portsお好みで。

https://kubernetes.io/docs/tasks/tools/install-kubectl/


起動

$ minikube start --vm-driver=virtualboxをするとVirtualBox内にminikubeっていうインスタンスが出来上がります。

image.png

$ minikube config set vm-driver virtualbox としておくことでデフォルトのvmがvirtualboxになります。

いろいろDLやインストールをするみたいなので少し時間がかかる。

参考)

Minikubeを使ってローカル環境にKubernetes環境を用意する

minikube でローカルでのテスト用 Kubernetes を構築


状態を見てみる

$ eval $(minikube docker-env)でk8sのdockerに切り替えてdockerのコンテナをみてみる。

❯ eval $(minikube docker-env)

~
❯ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d769c12297f7 k8s.gcr.io/k8s-dns-sidecar-amd64 "/sidecar --v=2 --lo…" 9 minutes ago Up 9 minutes k8s_sidecar_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0
baa923e10d6e k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 "/dnsmasq-nanny -v=2…" 9 minutes ago Up 9 minutes k8s_dnsmasq_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0
65771e2d6627 k8s.gcr.io/kubernetes-dashboard-amd64 "/dashboard --insecu…" 9 minutes ago Up 9 minutes k8s_kubernetes-dashboard_kubernetes-dashboard-5498ccf677-dqsq2_kube-system_6169a034-a05d-11e8-9f57-08002710bdf8_0
5d0b249a7ff1 gcr.io/k8s-minikube/storage-provisioner "/storage-provisioner" 9 minutes ago Up 9 minutes k8s_storage-provisioner_storage-provisioner_kube-system_6176f65d-a05d-11e8-9f57-08002710bdf8_0
3f4daa2c5947 k8s.gcr.io/k8s-dns-kube-dns-amd64 "/kube-dns --domain=…" 9 minutes ago Up 9 minutes k8s_kubedns_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0
90b490fb4367 k8s.gcr.io/kube-proxy-amd64 "/usr/local/bin/kube…" 9 minutes ago Up 9 minutes k8s_kube-proxy_kube-proxy-7kmc9_kube-system_60c42408-a05d-11e8-9f57-08002710bdf8_0
0916e618dc36 k8s.gcr.io/pause-amd64:3.1 "/pause" 9 minutes ago Up 9 minutes k8s_POD_storage-provisioner_kube-system_6176f65d-a05d-11e8-9f57-08002710bdf8_0
55da6fcae752 k8s.gcr.io/pause-amd64:3.1 "/pause" 9 minutes ago Up 9 minutes k8s_POD_kubernetes-dashboard-5498ccf677-dqsq2_kube-system_6169a034-a05d-11e8-9f57-08002710bdf8_0
8ed1ebf28eca k8s.gcr.io/pause-amd64:3.1 "/pause" 9 minutes ago Up 9 minutes k8s_POD_kube-proxy-7kmc9_kube-system_60c42408-a05d-11e8-9f57-08002710bdf8_0
c09adc3a2dca k8s.gcr.io/pause-amd64:3.1 "/pause" 9 minutes ago Up 9 minutes k8s_POD_kube-dns-86f4d74b45-xnfqj_kube-system_60b5af05-a05d-11e8-9f57-08002710bdf8_0
441124e64de1 k8s.gcr.io/kube-apiserver-amd64 "kube-apiserver --ad…" 9 minutes ago Up 9 minutes k8s_kube-apiserver_kube-apiserver-minikube_kube-system_92521198f9c138763b520ca1ecb8b5a9_0
1b4191945ee1 k8s.gcr.io/kube-scheduler-amd64 "kube-scheduler --le…" 9 minutes ago Up 9 minutes k8s_kube-scheduler_kube-scheduler-minikube_kube-system_099f1c2b79126109140a1f77e211df00_0
9df8b82ea9e2 k8s.gcr.io/kube-addon-manager "/opt/kube-addons.sh" 9 minutes ago Up 9 minutes k8s_kube-addon-manager_kube-addon-manager-minikube_kube-system_3afaf06535cc3b85be93c31632b765da_0
f763df18bf81 k8s.gcr.io/etcd-amd64 "etcd --peer-trusted…" 9 minutes ago Up 9 minutes k8s_etcd_etcd-minikube_kube-system_79bd0d0dce95148e72fa3b2e8fded604_0
f1953be6f3aa k8s.gcr.io/kube-controller-manager-amd64 "kube-controller-man…" 10 minutes ago Up 10 minutes k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_6fd9ec17a3b368568d0a6a2d5d243308_0
7f7e7c941ceb k8s.gcr.io/pause-amd64:3.1 "/pause" 10 minutes ago Up 10 minutes k8s_POD_kube-apiserver-minikube_kube-system_92521198f9c138763b520ca1ecb8b5a9_0
796933ddc98e k8s.gcr.io/pause-amd64:3.1 "/pause" 10 minutes ago Up 10 minutes k8s_POD_kube-controller-manager-minikube_kube-system_6fd9ec17a3b368568d0a6a2d5d243308_0
508da264c993 k8s.gcr.io/pause-amd64:3.1 "/pause" 10 minutes ago Up 10 minutes k8s_POD_kube-addon-manager-minikube_kube-system_3afaf06535cc3b85be93c31632b765da_0
2bf305a85652 k8s.gcr.io/pause-amd64:3.1 "/pause" 10 minutes ago Up 10 minutes k8s_POD_kube-scheduler-minikube_kube-system_099f1c2b79126109140a1f77e211df00_0
39232155ebdc k8s.gcr.io/pause-amd64:3.1 "/pause" 10 minutes ago Up 10 minutes k8s_POD_etcd-minikube_kube-system_79bd0d0dce95148e72fa3b2e8fded604_0

コンテナがこんなにいっぱい!

$ minikube dashboard でブラウザでダッシュボードが見れます。

image.png

$ minikube service list で公開しているサービスの一覧が見れます。

❯ minikube service list

|-------------|----------------------|-----------------------------|
| NAMESPACE | NAME | URL |
|-------------|----------------------|-----------------------------|
| default | kubernetes | No node port |
| kube-system | kube-dns | No node port |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|

その他状態確認はこんな感じかな。

❯  kubectl get node -o wide

NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready master 15m v1.10.0 <none> Buildroot 2018.05 4.15.0 docker://17.12.1-ce

~
❯ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

~
❯ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* minikube minikube minikube


テスト

試しにhello-minikubeを動かしてみる。

$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080

deployment.apps/hello-minikube created

サービスが増える。

$ minikube service list

|-------------|----------------------|-----------------------------|
| NAMESPACE | NAME | URL |
|-------------|----------------------|-----------------------------|
| default | hello-minikube | http://192.168.99.100:30430 |
| default | kubernetes | No node port |
| kube-system | kube-dns | No node port |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|

公開する。



$ kubectl expose deployment hello-minikube --type=NodePort

service "hello-minikube" exposed



curlでアクセスしてみると。

❯ curl $(minikube service hello-minikube --url)                                                                                                                                                     

CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.99.100:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=192.168.99.100:30430
user-agent=curl/7.59.0
BODY:
-no body in request-

いるぞ!


開発環境(kvm上の場合)

kvmインスタンスの上に設定する場合。

KVMインスタンスの上にVMは普通乗らないので、minikube start時にvm-driverはnoneで同じサーバに置くことになる。

$ minikube start --vm-driver=none


本番(GCP)

GKE(Google Kubernetes Engine)を使う。きっとgcloudでGoogle認証をして、minikube部分を変更するだけだと思う。googleのチュートリアルをやってみたところ、storageにredis, フロントにphpをつかっていた。 https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git

のリポジトリを使っていた。

AWSの場合にはAmazon Elastic Container Service for Kubernetes (Amazon EKS) というものがあるぞ。

AzureはAzure Kubernetes Service (AKS)だそうです。

オンプレの場合はこのへんかな。

快適な kubernetes オンプレミス環境を構築する(1. 設計編)

CentOS7にKubernetes1.9をインストール


感想

また覚えることが増えた!基礎知識としてDockerは知っておかないとワケワカメかもしれない。次回はアプリケーションとのデプロイ方法を試してみよう。