メインコンテンツにスキップ
ブログコンテナ(Kubernetes、Docker)Kubernetesへの道は開けているか?

Kubernetesへの道は開けていますか?

Kubernetesへの道 電子書籍

Kubernetesを使うべきでしょうか?答えは、要するに、「場合による」です。しかし、私がKubernetesを理解するまでの道のりを紹介することで、あなた自身の答えを見つける助けになるかもしれません。 

私は、Kubernetesへの道を案内するための本を一冊書きました(Manningの早期リリース版MEAPはこちらから入手できます)。しかし、この本について話す前に、ソフトウェアのデプロイとそれに至るまでの私の旅について少し話しておきましょう。 

今から20年近く前、私はインターネット上にソフトウェアを展開し、初めてウェブサイトを公開することに挑戦しました。当時は、何から手をつけたらいいのか、まったくわからない状態でした。そんな私に、家族の友人たちがアドバイスをしてくれました:

と起業家は提案した: 

"DreamweaverとHTMLに関するこの本を手に取れば、最初のウェブサイト開発にお金をかける必要はない。"

システム管理者、開発者は別のアプローチをとった: 

"ここで、あなたのウェブサイトをホストするためにFTPサーバーをセットアップしましょう。"私は、サーバーを管理する方法を学ぶことをお勧めしません。

この2人のおかげで今の私があるのですが、そのうちの1人が意図せず私の学習を長い間遅らせてしまったのです。誰だかわかりますか?

初期の頃を振り返ってみると、基礎的な知識と実践的な経験を通じて学ぶことの両方が、私の歩みを形成する上でいかに重要であったかがよくわかります。起業家の助言は、ウェブ開発の現場に飛び込むことを後押しし、システム管理者の指導は、複雑な作業を簡略化するツールの価値を教えてくれました。 

しかし、時間の経過とともに明らかになった重要な教訓は、高レベルのツールを使用する場合でも、基本的な原則を理解することの重要性でした。この初期の学習体験が、私の職業上の軌跡に大きな影響を与えることになるテクノロジー、Kubernetesへの興味の発端となったのです。Kubernetesを理解するには、他のツールと同様に、基礎となる技術をしっかりと理解する必要があります。 

Kubernetesは複雑ですか?はい。完璧か?いいえ、すべての状況に適しているのでしょうか?しかし、Kubernetesを使うべきかどうかの問題は、多くの場合、Kubernetesを強力にしている基本的なテクノロジーと、それを使ってソフトウェアを管理・保護する方法を理解しているかどうかに帰結します。

Kubernetesとは何なのか」と疑問に思っている方、あるいは「Docker」という言葉(パンツの種類を超えて)やコンテナとの関連性をまだよく知らない方に、説明させてください。 

アプリケーションは常に進化しており、データベースからプログラミング言語まで、各コンポーネントは頻繁に新バージョンをリリースしています。各アプリケーションの複数のバージョンとサードパーティ製コンポーネントの多数の繰り返しを追跡管理することは、特にメインストリームでサポートされていない古いバージョンやレガシーバージョンに関しては、管理するのが面倒になることがあります。サポートされているバージョンのソフトウェアでさえ、システムレベルやサードパーティーのインストールに多くの依存関係があり、アプリケーションのコンポーネントとして使用することはおろか、ソフトウェアを実行することも複雑にしてしまいます。

どんなソフトウェアも、時間が経つにつれて古くなり、新しいバージョンに取って代わられます。課題は、必要なときに古いソフトウェアを実行することにあります。ソフトウェアの一見小さな変更でさえ、現代のアプリケーションに大きな影響を与えることがあります。例えば、Python 2.7 (最新のPython 3.11 と比較) は、Apple の Mac OS X に組み込まれていました。Python 2.7 には、コマンドラインにテキストを出力するための奇妙な構文がありました。新しいバージョンのPython にある `print("this thing") ` の代わりに `print "this thing" ` です。この構文の1つが、カッコが見つからないためレガシ アプリケーション全体Python を壊すことができます。

古いバージョンのソフトを使うのは非現実的ですが、古いソフトを動かす必要がある状況も確かに存在します。でも、どうやって? 

古いソフトウェアを走らせるために、特定の時点のハードウェアやVMイメージを探すのに時間を費やすこともできます。あるいは、Dockerによって開拓されたコンセプトであるコンテナを利用することもできます。コンテナとは、自己完結型のアプリケーションを依存関係とともにパッケージ化したもので、適当に変更することができます。コンテナの特徴は、あるシステムから別のシステムへシームレスに移行できることです。

Python 2.7をコンテナのビルディングブロックとして使用するDockerfileの例を紹介します:

```dockerfile
FROM python:2.7.7-slim

COPY ./src /app/
WORKDIR /app

RUN python -m pip install -r requirements.txt

CMD [“python”, “manage.py”, “runserver”]
```
```dockerfile
FROM python:2.7.7-slim

COPY ./src /app/
WORKDIR /app

RUN python -m pip install -r requirements.txt

CMD [“python”, “manage.py”, “runserver”]
```

このDockerfileは、ローカルマシンとローカルパスの`/src`に存在するコードを使って、新しいコンテナを構築するために必要なものをDockerに伝えます。Dockerfileはもっと複雑になりますが、この例はDockerを使うことがいかに簡単かを示しています。 

このコンテナ化されたアプリケーションをビルドランするのは、次のように簡単です:

```bash
docker build -f Dockerfile -t hello-python:v1 .
docker run hello-python -p 8000:8000
```

コンテナ化がなければ、Python 2.7を直接マシンにインストールしなければなりませんが、これはほとんど簡単なことではありません。Dockerやその他のコンテナは、アプリケーションをポータブルにすることができ、この例のPython 2.7をほとんどすべてのオープンソースの言語やツールで置き換えることができます。

しかし、コンテナ化されたアプリケーションを、特に本番環境で更新したいときに問題が発生する。ローカルでは、コンテナのアップデートは簡単です。コンテナの実行を停止し、再ビルドして、再実行するのです。しかし、本番環境では、コンテナの更新は同じ方法で行えますが、ビルドに失敗すると、大きなダウンタイムが発生するリスクがあります。

そこで登場するのがKubernetesです。Kubernetesは、特定のコンテナへのトラフィックのルーティングを管理し、任意の時間に実行されているコンテナの数を監督するのに役立ちます。コンテナに障害が発生した場合、Kubernetesを使えば、ダウンタイムを最小限に抑えながら、以前のバージョンに簡単にロールバックすることができます。

Kubernetes上でコンテナをデプロイするための設定をマニフェストと呼びます。ここでは、比較的シンプルなマニフェストの例を紹介します:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-py-deploy
spec:
    replicas: 3
    selector:
        matchLabels:
            app: hello-py-deploy
    template:
        metadata:
            labels:
                app: hello-py-deploy
        spec:
            containers:
            - name: hello-py-container
              image: jmitchel3/hello-python:v1
              ports:
                - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: hello-py-service
spec:
    type: LoadBalancer
    ports:
        - name: http
          port: 80
          targetPort: 8080
          protocol: TCP
    selector:
        app: hello-py-deploy
```

上記の例では、yaml 形式の Kubernetes マニフェストは、ロード バランサー サービスとデプロイメントという 2 つのリソースを規定しています。ロードバランサーは、デプロイメントへのトラフィックのルーティングを支援します。replicas.3`を経由して、私たちの宣言したコンテナ`hello.3`にアクセスします:3` を介して、宣言されたコンテナ `hello-python:v1` の、私たちのデプロイは3つのバージョンを実行しています。

これで、デプロイされたバージョンを更新したいときは、`hello-python:v1` を `hello-python:v2` に変更するだけで、Kubernetesがアプリケーションを優雅に更新してくれます。そして、何か問題が起きたら、`hello-py-deploy:v1`にロールバックします。Kubernetesはこのプロセスを苦痛なく、簡単に管理することができます。マニフェストはgitで簡単にバージョン管理できるので、ロールバック機能を非常に細かく設定することができます。Kubernetesは、コンテナ化されたアプリケーションを自動化、スケーリング、管理するためのフレームワークを提供し、複雑化するソフトウェア環境においてシステムの耐障害性と効率性を確保するため、デプロイに不可欠です。

今回は、Kubernetesによってアプリケーションのデプロイメントをいかに簡素化できるかを発見するに至った方法のほんの一部を紹介したいと思います。Kubernetesを最大限に活用するためには、私にとってはいくつかのステップが必要でしたが、それは価値ある旅となりました。 Kubernetesへの道」では、Kubernetesやその他の最新のデプロイ手法に飛び込む前に理解しておくべき様々なテクノロジーを使ってアプリケーションをデプロイする旅に出ます。

Road to Kubernetesでは、その方法を解説します:

  • セルフホストプラットフォームやクラウドプラットフォームでのgitリポジトリの管理
  • gitでクラウドベースのVM経由でPython 、Node.js のアプリをデプロイする。
  • でVMの設定とデプロイメントを自動化します。Ansible
  • DockerとDocker Composeによるアプリのコンテナ化とデプロイメント
  • オーケストレーションなしでVM上でコンテナを直接実行できる
  • DockerHubレジストリでコンテナをプッシュしてホストする
  • Kubernetesでコンテナ化したアプリをデプロイする
  • Kubernetes上にパブリックアプリとプライベートアプリを実装する。
  • HTTP & HTTPsトラフィックのためのロードバランサーの設定
  • Github ActionsとNectosによるオープンソースの代替actでCI/CDのテクニックを使おう
  • などがあります!

デプロイメントは、ソフトウェアの究極のテストです。 Road to Kubernetesは、15年にわたるデプロイの学びを、アクセスしやすく実用的な1冊のガイドに凝縮しています。本書では、ゼロからソフトウェアをデプロイするところから、Kubernetesのパワーを導入するところまでを紹介しています。あらゆる言語、あらゆる種類のWebアプリケーションで使用できる持続可能なデプロイの実践、デプロイメントオプションやクラウドプロバイダーを越えて移動できるポータブルアプリケーションの作成方法、あらゆる規模のプロジェクトでKubernetesを活用することがいかに可能であるかを学ぶことができます。

Kubernetesを理解するための道を歩み始めるには、マニングの早期リリース版MEAPをここから入手してください。

コメント 

コメントを残す

あなたのメールアドレスは公開されません。必須項目には*印がついています。