fbpx

Best of 2019 Blogs, Part 2:初めてのKubernetesクラスタをオンプレミスで構築する #mirantis #kubernetes #k8s #docker

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本ブログは Mirantis社のblog記事「Best of 2019 Blogs, Part 2: Building Your First Certified Kubernetes Cluster On-Premises」の翻訳記事です。

※ 掲載にあたり、最新の Docker Enterprise3.1 リリースについて追記しております。また、一部記述を最新の情報に変更しております。

今週と来週は、2019年のDocker Enterpriseに関するブログ記事の中で、最も人気のあるトップ5をお届けします。圧倒的に人気が高かったのは、Ajeet Raina 氏が Docker Enterprise 上で Kubernetes を実行する方法を記したゲスト投稿でした。 Ajeet は Docker Captain です。Ajeet を Twitter @ajeetsraina でフォローし、http://www.collabnix.com で彼のブログを読むことができます。

現在、認定されている Kubernetes をクラウドで運用する選択肢は数多くあります。しかし、オンプレミスの本番ワークロードでKubernetesを運用する場合はどうでしょうか?

オンプレミスでKubernetesを配布するには、既存のチームやプロセスを活用できるエンタープライズコンテナプラットフォームが必要になります。

Docker Kubernetes Service の導入

DockerCon 2019 で Docker は Docker Kubernetes Service(DKS)を発表しました。Docker Enterprise 3.0に同梱されている認定 Kubernetes ディストリビューションで、この根本的な課題を解決するために設計されています。

今回、次のトピックを取り上げながら、Docker Enterprise 3.0 での Kubernetes のサポートと機能について解説していきます。

1.ベアメタルシステム上で動作する Docker Enterprise 3.0 を使用して、認定された Kubernetes Cluster をデプロイする

2.iSCSI を使用した Kubernetes ワークロードのための永続ストレージの実装

3.Kubernetes 用の Cluster Ingress の実装

4.Docker Enterprise 3.0 での Istio Service Mesh のデプロイ

5.Docker Enterprise 3.0 で Windows Server 2019 上の Kubernetes をサポートする

DKSとは…

DKS は、開発者のデスクトップから本番サーバーまで Kubernetes を統合し、「デフォルトで安全」な環境をすぐに利用できる唯一の製品です。簡単に言えば、DKS は Kubernetes を使いやすくし、組織全体の安全性を高めます。ここでは、DKS が企業の Kubernetes 導入を簡素化し、加速させるために行っている3つのことを紹介します。

開発者と運用者に一貫したシームレスな Kubernetes の体験を提供します

Version Packs を使用することで、Docker Desktop Enterprise で動作する開発者の Kubernetes 環境を本番環境と同期させ、完全でシームレスな Kubernetes 体験を実現します。

Kubernetes のライフサイクル管理( Day1 / Day2 の運用 )を効率化します

新しい Cluster Management CLI プラグインにより、運用チームはシンプルな CLI コマンドのセットを使用して、認定された Kubernetes 環境を簡単にデプロイ、スケール、バックアップ、リストア、アップグレードできます。

「デフォルトで安全」を更に強化

Kubernetes の専門家でなくても、セキュリティ、暗号化、アクセス制御、ライフサイクル管理を備えた構成を、容易に手に入れることができます。

DKS は、マルチコンテナアプリケーションを作成するための Kubernetes YAML、Helm チャート、Docker Compose と互換性があります。また、ハイブリッドおよびマルチクラウドデプロイメント全体で Kubernetes アプリケーションをインストールして設定するための自動化された方法を提供します。これには、セキュリティ、アクセス制御、ライフサイクル管理が含まれています。さらに、Docker Swarm Mode も使用できます。

Kubernetes 1.14+ in Docker Enterprise

Docker Enterprise 3.0 には以下のコンポーネントが付属しています。

  • Containerd 1.2.6
  • Docker Engine 19.03.1
  • Runc 1.0.0-rc8
  • docker-init 0.18.0
  • Universal Control Plane 3.2.0
  • Docker Trusted Registry 2.7
  • Kubernetes 1.14+
  • Calico v3.5.7

このシリーズの最初の投稿では、Docker Enterprise 3.0 を使って認定 Kubernetes クラスタをベアメタル上にデプロイする方法を紹介します(オンプレミスでデプロイできるという意味です)。

前提条件

  • Ubuntu 18.04 (最低2ノードでマルチノードクラスターを設定)
  • 最低 4GB RAM が UCP 3.2.0 の動作に必要です。
  • 有効なライセンス
  • 有効なダウンロードURL

(※ Trialライセンスのご利用につきましてはお問合わせください。また、現在は、Mirantis Launchpadにてインストールすることも可能です。)

これで、Docker Enterprise と Kubernetes のインストールを始める準備ができました。さっそく始めてみましょう。

ステップ1: apt が HTTPS でリポジトリを使用できるようにするためのパッケージをインストールします。

$sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

ステップ2: 環境に $DOCKER_EE_URL 変数を追加する

前提条件でメモした URL に置き換えてください。

$curl -fsSL https://storebits.docker.com/ee/m/sub-XXX-44fb-XXX-b6bf-XXXXXX/ubuntu/gpg | 
sudo apt-key add -

ステップ3:stable リポジトリの追加

$sudo add-apt-repository \
   "deb [arch=amd64] https://storebits.docker.com/ee/m/sub-XXX-44fb-XXX-b6bf-XXXXXX/ubuntu \
   $(lsb_release -cs) \
   stable-19.03"

ステップ4: Docker Enterprise のインストール

$sudo apt-get install docker-ee docker-ee-cli containerd.io

ステップ5:Docker Enterprise バージョンの確認

$ sudo docker version
Client: Docker Engine - Enterprise
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        f660560
 Built:             Thu Jul 25 20:59:23 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Enterprise
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       f660560
  Built:            Thu Jul 25 20:57:45 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
cse@ubuntu1804-1:~$

ステップ6: Hello World のテスト

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!

This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the executable
    that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it to your
    terminal.

更に確認したい場合には、Ubuntu のコンテナを実行してみても良いでしょう。

 $ docker run -it ubuntu bash

Docker Hub にサインアップまたはログインすることで、Docker ID を使ってイメージの共有、ワークフローの自動化などを行うことができます。

より多くの例やアイデアについては、Docker Docs getting started のページをご覧ください。

ステップ7: Universal Control Plane v3.2.0 のインストール

$ sudo docker container run --rm -it --name ucp \
>   -v /var/run/docker.sock:/var/run/docker.sock \
>   docker/ucp:3.2.0 install \
>   --host-address 10.94.214.115 \
>   --interactive

ステップ8: UCP へのアクセス

Docker Universal Control Plane にアクセスするためにはノードのIPで接続してください。

https://<node-ip>

Sign In をクリックしてライセンスファイルをアップロードすると、以下のように Docker Enterprise UCP 3.2.0 WebUI にアクセスできます。

ステップ9: クラスタへのワーカーノードの追加

クラスタにワーカーノードを追加してみましょう。左ペインの Shared Resources をクリックし、 Nodes をクリックします。Add Nodes を選択し、オーケストレータを選択します。下図のように、ここでは Linux ノードか Windows ノードのどちらかをクラスタに追加できます。

Ubuntu 18.04 と最新の Docker バイナリ(無料版の Docker Engine でも Docker Enterprise でも構いません)がインストールされているワーカーノードを想定しています。

@ubuntu1804-1:~$ sudo curl -sSL https://get.docker.com/ | sh

$ sudo usermod -aG docker cs
$ sudo docker swarm join --token SWMTKN-1-3n4mwkzhXXXXXXt2hip0wonqagmjtos-bch9ezkt5kiroz6jncid
rz13x <managernodeip>:2377
This node joined a swarm as a worker.

これで、UCP の下に追加されたマネージャノードとワーカーノードの両方が確認できるようになったはずです。

マネージャノードとワーカーノードの両方で同様のホスト名を使用しているという警告が UCP ダッシュボードに表示された場合は、ワーカーノードのホスト名を変更すると、UCP ダッシュボードで自動的に更新されます。

ステップ10. Docker Client Bundle をインストールする

ダッシュボードをクリックして下にスクロールすると、Docker CLI オプションが表示されます。このオプションでは、Docker CLI クライアントを使用してサービスを作成・管理するためのクライアントバンドルをダウンロードできます。クリックすると、以下のような新しいウィンドウが表示されます。

user profile page をクリックすると、以下のスクリーンショットにあるように、https://<マネージャノードのIP>/manage/profile/clientbundle ページにリダイレクトされるはずです。

Generate Client Bundleをクリックすると、ucp-bundle-<ユーザ名>.zip がダウンロードされます。

$ unzip ucp-bundle-ajeetraina.zip
Archive:  ucp-bundle-ajeetraina.zip
 extracting: ca.pem
 extracting: cert.pem
 extracting: key.pem
 extracting: cert.pub
 extracting: kube.yml
 extracting: env.sh
 extracting: env.ps1
 extracting: env.cmd
 extracting: meta.json
 extracting: tls/docker/key.pem
 extracting: tls/kubernetes/ca.pem
 extracting: tls/kubernetes/cert.pem
 extracting: tls/kubernetes/key.pem
 extracting: tls/docker/ca.pem
 extracting: tls/docker/cert.pem
@ubuntu1804-1:~$ eval "$(<env.sh)"

env スクリプトは Docker CLI クライアントが UCP と相互作用し、ダウンロードしたクライアント証明書を使用するように DOCKER_HOSTDOCKER_CERT_PATH の環境変数を更新します。今後、Docker CLI クライアントを使用する際には、UCP へのリクエストの一部としてユーザー固有のクライアント証明書が含まれるようになります。

ステップ12: Kubectl のバージョンを設定する

@ubuntu1804-1:~$ k8sversion=v1.14.3
@ubuntu1804-1:~$ curl -LO https://storage.googleapis.com/kubernetes-release/release/
$k8sversion/bin/linux/amd64/kubectl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41.1M  100 41.1M    0     0  7494k      0  0:00:05  0:00:05 --:--:-- 9070k
@ubuntu1804-1:~$ chmod +x ./kubectl
@ubuntu1804-1:~$ sudo mv ./kubectl /usr/local/bin/kubectl
@ubuntu1804-1:~$

ステップ13: Kubectl のインストールを確認する

~$ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.3", GitCommit:
"5e53fd6bc17c0dec8434817e69b04a25d8ae0ff0", GitTreeState:"clean", BuildDate:
"2019-06-06T01:44:30Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.3-docker-2", 
GitCommit:"7cfcb52617bf94c36953159ee9a2bf14c7fcc7ba", GitTreeState:"clean",
BuildDate:"2019-06-06T16:18:13Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"

ステップ14:Kubernetes ノードを確認する

cse@ubuntu1804-1:~$ kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
node2          Ready    <none>   23h   v1.14.3-docker-2
ubuntu1804-1   Ready    master   23h   v1.14.3-docker-2

ステップ15: UCP で Helm と Tiller を有効にする

$ kubectl create rolebinding default-view --clusterrole=view --serviceaccount=kube-system
:default --namespace=kube-system
rolebinding.rbac.authorization.k8s.io/default-view created
 
$ kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin 
--serviceaccount=kube-system:default
clusterrolebinding.rbac.authorization.k8s.io/add-on-cluster-admin created
cse@ubuntu1804-1:~$

ステップ16: Helm のインストール

$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > install-helm.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7001  100  7001    0     0   6341      0  0:00:01  0:00:01 --:--:--  6347
$ chmod u+x install-helm.sh
 
$ ./install-helm.sh
Downloading https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
Preparing to install helm and tiller into /usr/local/bin
helm installed into /usr/local/bin/helm
tiller installed into /usr/local/bin/tiller
Run 'helm init' to configure helm.
  
cse@ubuntu1804-1:~$ helm init
Creating /home/cse/.helm
Creating /home/cse/.helm/repository
Creating /home/cse/.helm/repository/cache
Creating /home/cse/.helm/repository/local
Creating /home/cse/.helm/plugins
Creating /home/cse/.helm/starters
Creating /home/cse/.helm/cache/archive
Creating /home/cse/.helm/repository/repositories.yaml
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http://127.0.0.1:8879/charts
$HELM_HOME has been configured at /home/cse/.helm.
 
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
 
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users'
policy.
To prevent this, run <code>helm init</code> with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/
 
#securing-your-helm-installation
 
cse@ubuntu1804-1:~$

ステップ 17: Helm インストールの確認

$ helm version
Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085"
, GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085"
, GitTreeState:"clean"}

ステップ18. Helm を使って MySQL を Docker Enterprise 3.0 にデプロイする

HelmPack を使って MySQL をデプロイしてみましょう。

$ helm install --name mysql stable/mysql
NAME:   mysql
LAST DEPLOYED: Wed Aug  7 11:43:01 2019
NAMESPACE: default
STATUS: DEPLOYED
 
RESOURCES:
==> v1/ConfigMap
NAME        DATA  AGE
mysql-test  1     0s
 
==> v1/PersistentVolumeClaim
NAME   STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
mysql  Pending  0s
  
==> v1/Secret
NAME   TYPE    DATA  AGE
mysql  Opaque  2     0s
 
==> v1/Service
NAME   TYPE       CLUSTER-IP   EXTERNAL-IP  PORT(S)   AGE
mysql  ClusterIP  10.96.77.83  <none>       3306/TCP  0s
 
==> v1beta1/Deployment
NAME   READY  UP-TO-DATE  AVAILABLE  AGE
mysql  0/1    0           0          0s
 
 
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
mysql.default.svc.cluster.local
 
To get your root password run:
 
    MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql -o jsonpath=
"{.data.mysql-root-password}" | base64 --decode; echo)
 
To connect to your database:
 
1. Run an Ubuntu pod that you can use as a client:
 
    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
 
2. Install the mysql client:
 
    $ apt-get update && apt-get install mysql-client -y
 
3. Connect using the mysql cli, then provide your password:
    $ mysql -h mysql -p
 
To connect to your database directly from outside the K8s cluster:
    MYSQL_HOST=127.0.0.1
    MYSQL_PORT=3306
 
    # Execute the following command to route the connection:
    kubectl port-forward svc/mysql 3306
 
    mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
 
cse@ubuntu1804-1:~$

ステップ19:リリースを確認する

$ helm list
NAME    REVISION      UPDATED                      STATUS         CHART          APP VERSION     NAMESPACE
mysql   1             Wed Aug  7 11:43:01 2019     DEPLOYED       mysql-1.3.0    5.7.14          default
 
$ kubectl get po,deploy,svc
NAME                         READY   STATUS    RESTARTS   AGE
pod/mysql-6f6bff58d8-t2kwm   1/1     Running   0          5m35s
 
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/mysql   1/1     1            0           5m35s
 
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP    28h
service/mysql        ClusterIP   10.96.77.83   <none>        3306/TCP   5m35s
cse@ubuntu1804-1:~$

DKSを使えば、Docker Enterprise 3.0でUCPを使ってHelmを完璧に使うことができます。

オンプレミスで Kubernetes

これで、Kubernetes をオンプレミスで稼働させることができました。ここからはいろいろなことができます。今後、このシリーズでいくつかの可能性を取り上げていきます。

学習のために、シンプルなアプリケーションを Kubernetes で設計して実験してみるのもいいでしょう。Dockerトレーニングチームの Bill Mills 氏が最近、それらをカバーする素晴らしいブログシリーズを書いてくれました。パート1からチェックしてみることを強くお勧めします。

この投稿は、2019年9月30日にDockerブログに掲載されました。

最新の Docker Enterprise 3.1 の新機能やインストールについてはこちらのブログも併せてご確認ください。

Docker Enterprise3.1 のウェビナー動画も公開しております。

新規CTA