最初の認定済み Kubernetes クラスターをオンプレミスで構築する (パート 1)

これは、Docker Captain Ajeet Raina による一連のゲスト ブログ投稿の最初の投稿で、Docker Enterprise で Kubernetes を実行する方法について説明しています。 ツイッターでアジートをフォローできます @ajeetsraina そして彼のブログを読んでください http://www.collabnix.com

Docker kubernetes

現在、認定された 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 クラスターのデプロイ
  2. iSCSI を使用した Kubernetes ワークロード用の永続ストレージの実装
  3. Kubernetes のためのクラスター イングレスの実装
  4. Docker Enterprise 3.0 での Istio Service Mesh のデプロイ
  5. Docker Enterprise 3.0 を使用した Windows Server 2019 での Kubernetes のサポート

だからDKSについて...

DKSは、開発者のデスクトップから本番サーバーまでKubernetesを統合する唯一の製品であり、「賢明で安全なデフォルト」をすぐに使用できます。 簡単に言えば、DKSはKubernetesを組織全体にとって使いやすく、より安全にします。 企業向けの Kubernetes の導入を簡素化および加速するために DKS が行う 3 つのことを次に示します。

  • 開発者とオペレーターのための一貫性のあるシームレスな Kubernetes エクスペリエンス。 バージョン パックを使用すると、Docker Desktop Enterprise で実行されている開発者の Kubernetes 環境は、完全でシームレスな Kubernetes エクスペリエンスを実現するために、本番環境と同期した状態を維持できます。 
  • 合理化された Kubernetes ライフサイクル管理 (1 日目と 2 日目の運用)。 新しいクラスター管理 CLI プラグインを使用すると、運用チームは、一連のシンプルな CLI コマンドを使用して、認定された Kubernetes 環境を簡単にデプロイ、スケーリング、バックアップ、復元、アップグレードできます。
  • 「賢明なデフォルト」によるセキュリティの強化。 チームは、セキュリティ、暗号化、アクセス制御、ライフサイクル管理のためのすぐに使用できる構成を、 Kubernetes のエキスパートになることなく利用できます。

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

Kubernetes 1.14+ in Docker Enterprise

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

  • コンテナ1.2.6
  • ドッカーエンジン19.03.1
  • ランク1.0.0-rc8
  • docker-init 0.18.0
  • ユニバーサルコントロールプレーン3.2.0
  • ドッカートラステッドレジストリ2.7
  • Kubernetes 1.14+
  • キャリコv3.5.7
Docker ucp diagram
Docker UCP マネージャーとワーカー ノード。

このシリーズの最初の投稿では、ベア メタルで Docker Enterprise 3.0 を使用して認定 Kubernetes クラスターをデプロイする方法について説明します (つまり、オンプレミスにデプロイできます)。

前提条件:

  • Ubuntu 18.04(マルチノードクラスタをセットアップするために少なくとも2ノード)
  • UCP 3.2.0 には最低 4GB の RAM が必要です。
  • https://hub.docker.com/my-content に移動します。
  • Ubuntu 用の Docker Enterprise Edition の Setup ボタンをクリックします。
  • [コピー] というラベルの付いたフィールドから URL をコピー し、この URL を貼り付けてエディションをダウンロードします

これで、Docker Enterprise と Kubernetes のインストールを開始する準備が整いました。 始めましょう。

ステップ1:aptがHTTPS経由でリポジトリを使用できるようにパッケージをインストールする

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

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

前提条件でメモした URL に置き換えます。 交換も。 sub-xxx

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

ステップ3:安定したリポジトリを追加する

$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:ドッカーエンタープライズをインストールする

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

ステップ 5: Docker エンタープライズバージョンの確認

$ 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 ID を使用して、イメージの共有、ワークフローの自動化などを行うには、 Docker Hub にサインアップまたはログインします。

その他の例とアイデアについては、 Docker ドキュメントの概要に関するページを参照してください。

ステップ7:ユニバーサルコントロールプレーン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ユニバーサルコントロールプレーンにアクセスできるはずです https://<node-ip>

Docker エンタープライズ サインイン

[サインイン] をクリックし、ライセンス ファイルをアップロードして Docker Enterprise UCP 3.2.0 にアクセスします。 以下に示すように、WebUI:

Docker ucp console

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

ワーカー ノードをクラスターに追加しましょう。 左側のペインの「共有リソース」をクリックし、「ノード」をクリックします。 [ノードの追加] を選択し、オーケストレーターを選択します。 以下に示すように、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 の下に追加されたマネージャー ノードと 1 つのワーカー ノードの両方を確認できるはずです。

Docker ucp ノード

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

ステップ 10: Docker クライアントバンドルをインストールする

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

Docker インストールクライアントバンドル

「ユーザープロファイルページ」をクリックすると、以下のスクリーンショットに示すように 、https://<マネージャー-ip-node/管理/プロファイル/クライアントバンドル ページにリダイレクトされます。

ドッカーの新しいクライアントバンドル

「クライアントバンドルの生成」をクリックすると、 ucp-bundle-<username<username> がダウンロードされます>.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_HOST 環境変数 DOCKER_CERT_PATH を更新して、Docker CLI クライアントが UCP と対話し、ダウンロードしたクライアント証明書を使用するようにします。 これ以降、Docker CLI クライアントを使用すると、UCP への要求の一部としてユーザー固有のクライアント証明書が含まれます。

ステップ11:Docker Enterprise 3.0にKubectlをインストールする

Kubernetes バージョンを入手したら、関連するオペレーティング システム用の kubectl クライアントをインストールします。 以下に示すように、Kubectlバージョン1.14.3をインストールする必要があります。

Docker ent 3 about

手順 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 `helm init` 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: Docker Enterprise 3.0 で Helm を使用して MySQL をデプロイする

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 、すべてのリリースをリストします。 既定では、デプロイされたリリースまたは失敗したリリースのみが一覧表示されます。 フラグは、この動作を好き ‘–deleted’ で変更 ‘–all’ します。 このようなフラグは、次のものを組み合わせることができます。 ‘–deleted –failed’既定では、項目はアルファベット順に並べ替えられます。 フラグを使用して、 ‘-d’ リリース日で並べ替えます。

$ 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, On-Premises

これで、オンプレミスで Kubernetes を実行できるようになりました。 ここから多くのことができますが、このシリーズの残りの部分でいくつかの可能性について説明します。

また、Kubernetes で最初のアプリケーションの設計を試すこともできます。 DockerトレーニングチームのBill Millsは、最近、まさにそれをカバーする素晴らしいブログシリーズを書きました。 ここでパート1からチェックすることを強くお勧めします。

Docker Enterprise 3.0 と Kubernetes の詳細については、次のリソースを参照してください。

フィードバック

「最初の認定Kubernetesクラスターをオンプレミスで構築する、パート0」に関する1つの考え