Windows10 でDocker環境のお勉強メモ | Docker / Kubernetes 実践コンテナ開発入門(5.Kubernetes入門)
Docker / Kubernetes 実践コンテナ開発入門(5.Kubernetes入門)
この記事は、「Docker/Kubernetes 実践コンテナ開発入門」の書籍を見ながら実践しています。実際の開発に即した内容となっており良書でした。
5.Kubernetes入門
コンテナオーケストレーションシステムのデファクトスタンダード
5.1 Kubernetesとは
- コンテナオーケストレーション:複数のコンテナを束ねて1つのシステムとして運用するためのツール
- Google社が自社のDocker運用で培ったノウハウをOSSとして提供
- 2017年10月にDockerが正式採用
- コンテナ運用の自動化
- アプリケーションのデプロイ
- 運用管理の自動化
- Dockerホストの管理
- サーバリソースの空き具合考慮
- 色々なコンテナオーケストレーションたち
- Dockerの「Swarm/Compose」
- Googleの「Kubernetes」
- CoreOSの「fleet」
- Rancher Labsの「Rancher」
- Mesosの「Marathon」
5.2 ローカル環境でKubernetesを実行する
kubectlのインストール
kubectlはKubernetesを操作するためのコマンドラインツール
Windows10 WSL(Ubuntu16.0.4)でインストールを実行
ch05_06_1$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 37.4M 100 37.4M 0 0 3344k 0 0:00:11 0:00:11 --:--:-- 3910k
ch05_06_1$ ls
kubectl simple-pod.yaml
ch05_06_1$ chmod +x kubectl
ch05_06_1$ sudo mv kubectl /usr/bin/
[sudo]
password for: ch05_06_1$ kubectl version Client Version: version.Info{Major:”1″, Minor:”13″, GitVersion:”v1.13.1″, GitCommit:”eec55b9ba98609a46fee712359c7b5b365bdd920″, GitTreeState:”clean”, BuildDate:”2018-12-13T10:39:04Z”, GoVersion:”go1.11.2″, Compiler:”gc”, Platform:”linux/amd64″} The connection to the server localhost:8080 was refused – did you specify the right host or port?
ダッシュボードのインストール(Windows10 Home + WSL)
本家サイトの手順通り、https://github.com/kubernetes/dashboard
エラーが発生。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
8080ポートが使用中のため?かと考え、実行中のコンテナを停止して再実行
しかし、同じエラーが発生
ch05_06_1$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71a6ab8bf9a7 example/echo:latest "go run /echo/main.go" 5 days ago Up 5 days 0.0.0.0:9000->8080/tcp xenodochial_booth
ch05_06_1$ docker container stop 71a6ab8bf9a7
71a6ab8bf9a7
ch05_06_1$ sudo kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
TODO:上記対策検討中
→ Windows10 Home + WSLはいったん断念し、Windows1o Pro + Docker for Windowsに変更する。
ダッシュボードのインストール(Windows1o Pro + Docker for Windows)
Docker for WindowsでKubernetesを有効に
Docker for WindowsでKubernetesを有効にする。
「Apply」を押すと、インストールするか聞かれるので「install」を押します。
「アクセス許可」するとインストールが開始します。
インストールが完了すると左下に「Kubernetes is running」が表示されます。
kubernetesのダッシュボードのインストール
kubectlが使用可能かPowerShellから実行して確認します。
PS C:\Users\kenta> kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:05:37Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
kubernetesダッシュボードを作成します。
PS C:\Users\kenta> kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommende
d/kubernetes-dashboard.yaml
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
PS C:\Users\kenta> kubectl proxy
Starting to serve on 127.0.0.1:8001
ダッシュボードの表示
以下のURLからダッシュボード画面を表示します。
ログインするためのトークンを作成します。ログインする権限をきめるために権限の一覧を表示します。
PS C:\Users\kenta> kubectl -n kube-system get secret
NAME TYPE DATA AGE
attachdetach-controller-token-wsp4p kubernetes.io/service-account-token 3 39m
bootstrap-signer-token-d9vjc kubernetes.io/service-account-token 3 39m
bootstrap-token-r3d037 bootstrap.kubernetes.io/token 7 39m
certificate-controller-token-pff4z kubernetes.io/service-account-token 3 39m
clusterrole-aggregation-controller-token-nkx7d kubernetes.io/service-account-token 3 39m
cronjob-controller-token-sgk9k kubernetes.io/service-account-token 3 39m
…
statefulset-controller-token-c5kfq kubernetes.io/service-account-token 3 39m
token-cleaner-token-6cvnk kubernetes.io/service-account-token 3 39m
ttl-controller-token-7qldh kubernetes.io/service-account-token 3 39m
今回は、「 deployment-controller-token-XXXXX」の権限で入ります。以下のコマンドでトークンを作成します。
PS C:\Users\kenta> kubectl -n kube-system describe secret deployment-controller-token-8cp98
Name: deployment-controller-token-8cp98
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=deployment-controller
kubernetes.io/service-account.uid=c4069429-0b7c-11e9-be59-00155d0a6d01
Type: kubernetes.io/service-account-token
Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia…
ca.crt: 1025 bytes
namespace: 11 bytes
5.3 Kubernetesの概念
- Kubernetes上のアプリケーションは様々な「リソース」と協調して動作することで成立する
- Kubernetesの「リソース」とは、アプリケーションのデプロイ構成のための部品のようなもの
- Dockerの「コンテナ」とKubernetesの「リソース」は別物
Kubernetesのリソース一覧
Docker / Kubernetes 実践コンテナ開発入門(5.Kubernetes入門)の5.4~5.10を読んで、
イメージを図にしてみました。
間違ってそうだけど、自分で絵を描くのは理解を促すと信じて書いたので、載せておきます。
リソース名 | 用途 |
クラスタ | 様々なリソースを管理するための概念 |
Namespace | 仮想的なクラスタ(名前で切り替え可) |
Node | クラスタの中で一番大きな概念 |
Pod | Dockerコンテナを格納する箱 |
ReplicaSet | Podをレプリカ(複製) |
Deployment | ReplicaSetの履歴 |
Service | クラスタ内からのPodへのアクセス |
Ingress | クラスタ外からのPodへのアクセス |
ConfigMap | Podの設定情報 |
PersistentVolume | Podが利用するストレージ |
PersistentVolumeClaim | PersistentVolumeを動的に確保 |
StorageClass | ストレージの種類を定義 |
StatefulSet | 同じ仕様で一意性のあるPodを管理 |
Job | バッチ処理 |
CronJob | 時間起動のバッチ処理 |
Secret | 認証情報などの機密データ |
Role | Namespace内のリソースのルール |
RoleBinding | Roleとリソースのひもづけ |
ClusterRole | クラスタ全体のリソースのルール |
ClusterRoleBinding | ClusterRoleとリソースのひもづけ |
ServiceAccount | Podの実行ユーザ |
所感
まだまだ全体像が見えてこない