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_HOST と DOCKER_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 のウェビナー動画も公開しております。
- 最新のCloudNative環境「Docker Enterprise3.1」〜強化されたKubernetesと各種機能について〜
- Docker Enterprise で Kubernetes クラス構築〜Istio Ingress の設定まで〜