楽しんで学習するITエンジニアの備忘録ブログ

~日常生活の中にも楽しみを見出したい~

【第5弾】Kubernetes学習【L7レイヤロードバランサーのIngressを理解せよ】

Udemy「米シリコンバレーDevOps監修!超Kubernetes完全入門(2020)」

 

の学習にようやくありつけた。

 

本日は、レイヤ7レベルでロードバランシングできる「Ingress」についての学習。

LoadBalancerタイプの場合、レイヤ4のロードバランサーであるため、

TCP/IPレベルでしか動作することができない。

レイヤ7レベルで動かしたいと思ったその時に役に立つ機能が、

Ingress」様のようです。

 

■1.Ingressの作成

Ingressをマニュフェストから作成

 kubectl apply -f ingress.yaml 

 

ingress.yamlの概要は下記のとおりです。

詳細は、Udemy「米シリコンバレーDevOps監修!超Kubernetes完全入門(2020)」

を受講すると、物凄く詳しく知ることができると思います。おすすめです。

なお、ingressを作成した後は「kubectl get ingress」で確認する。

 

metadata:
  name: <pod name> →PodAとする。
  //省略
spec:
  //省略
  - path: /book →関連付けるパス
    backend:
      serviceName: <NodePort Service> →PodA_NodePortとする。

        servicePort: <port Number of NodePort Service> →8080とする。

 

※podの作成

 kubectl run --image <image name> --port <port Number> --restart Never <name>

※podの詳細

 kubectl describe pod <pod name>

※NodePort Serviceの作成

 kubectl expose pod PodA --type NodePort --port <port Number> --name PodA_NodePort

Ingressの削除

 kubectl delete --all ingress 

 設定誤りを含んだingressを作成してしまった時に、ingressを削除できる!

 ただし、個別に削除する方法は自分は分かりません。

 

■2.Ingressを作成した後の動作確認

    Pod、NodePort Service、Ingressを作成した後の動作確認手順は下記。

 下記の(1)から(3)を実行及び成功を確認することで、

 クラスター内外からのアクセスを問題なく実現できることを意味する。

 (1) クラスター内の他のPod(PodB)から、PodAにアクセス

 (2) クラスター内の他のPod(PodB)から、PodA_NodePort(Service)にアクセス

 (3) クラスター外からingressを経由して、PodA_NodePort(Service)にアクセス

 

■次回

 

 REPLICAS(冗長化と自動修正)の概要を掴みたい。

 

以上です。

【第4弾】Kubernetes学習【KubernetesのServiceを理解せよ】

Udemy「米シリコンバレーDevOps監修!超Kubernetes完全入門(2020)」

 

の受講を続けている。

 

ただ、もうすぐ夏季休暇が終了するので、どこまで進めることができるか?

 

「セクション3: (おさらい)猿でも分かるLinuxの基本操作」は省略して、

 「セクション4: HelloWorldでK8sのPod,Service,Ingress,Deploymentを理解しよう」

に挑んだ。

 

■1.Pod(コンテナ含む)起動とその後の基本的な操作

 kubectlコマンドとdockerコマンドが似ているが、似せることでどんな

 メリットがあるか?Kubernetesを習得しやすくさせ、デファクトスタンダード

 的な立ち位置を獲得することを狙ったのではないかと感じた。

 そこで、Kubernetesの成り立ちなどについて深掘りしてみた。

 元々Googleが設計し、現在はCloud Native Computing Foundation(CNCF)が

 運用管理を行っている。

 CNCFは、Kubernetesを推進する組織という役割は持つが、

 それは組織の断片的な活動に過ぎない。

 あくまでも、CNCFの目的は、「クラウドネイティブの普及に貢献すること」。

 CNCF(Cloud Native Computing Foundation)とは?活動内容を徹底解説 (cloud-for-all.com)

 

 これらより、Kubernetesをさまざまなビジネスシーンで活用して欲しいと

 願っているのではないか?!

 と勝手に解釈しました。

 

 少し脱線しましたが、

 ・Pod(コンテナ含む)を起動
  kubectl run --image <containerimage> --restart Never <podname>
 ・Podの一覧表示
  kubectl get pods,service(docker ps)
 ・Pod内のコンテナのログを表示
  kubectl logs <podname>(docker logs <containername>)
 ・Podのメタデータを表示
  kubectl describe pod <podname>(docker inspect <containername>)
 ・Pod内のコンテナにシェルを用いて接続
  kubectl exec -it <podname> bash(docker exec -it <containername> sh)

 

■2.3種類のService

 Pod自身はいつ消滅するかが分からないオブジェクトである。

 

 安定的なアクセスを実現させるためには、

 静的IPアドレスを利用できる「Service」を利用する必要がある。

 Serviceの主な役割は、Pod(コンテナ含む)やNodeの存在を抽象化し、

 Podとの通信に単一のエンドポイントを提供することとされている。

 ※Kubernetesの Service についてまとめてみた - Qiita

 

 Serviceのタイプには、ClusterIP、NodePort、LoadBalancerの3種類がある。

 (1) ClusterIPタイプ

  静的IPアドレスを持ったプロキシサーバのような存在。

  ただし、クラスターの外にPodを公開することはできない。

 (2) NodePortタイプ

  NodePortを利用することでクラスターの外(例:ホスト)にPodを公開できる。
  ただし、NodeのIPアドレスは可変のため、突然Podと通信不可になる恐れがある。

 (3) LoadBalancerタイプ

  ロードバランサーをNode前に配置し、静的IPアドレスドメインネームを設定。

  Layer4のLBであるため、TCP/IPレベルでしか振舞えない。

  Layer7(例:HTTP)レベルでの振り分けが実現することができない。

 

■次回

 

 Layer7レベルでロードバランシングすることができる「Ingress

 の概要を追いかけたい。

 

以上です。

【第3弾】Kubernetes学習【Kubernetesを基本をおさえたい】

ついに、Kubernetesの学習を再開する時がやってきた。

  

Udemy「米シリコンバレーDevOps監修!超Kubernetes完全入門(2020)」

 

の受講を開始させました^^。聞きやすいです。

 

そこのお前(本ブログ記事作成者である貴成本人へ)、しっかり理解していけよ!

 

なお、気が早いですが、上記講座終了後は下記を実施する予定。

・書籍「15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用まで」

・Udemy「米シリコンバレーエンジニア監修!AWS EKS KubernetesハンズオンBest Practices (2020)」

 

■1.Kubernetesの特徴

 

 Kubernetesは「k8s」と省略されることも多いようですが

 Kubernetesは、Dockerなどのコンテナを管理・統合するツール。 

 単体のホスト上で起動しているコンテナでは実現できない下記を実現可能。

 ・複数ホストを連携することで冗長化され、高いトラフィックに対応

 ・Pod(複数のコンテナ含む)の自動修復

 ・実行中のアプリケーションを自動スケーリング

 ・ローリングアップデート(例:コンテナの順次更新)

 ・複数ホスト上にある複数コンテナへのロードバランシング

 ・認証・認可、リソース監視、ログ統合管理

 

■2.KubernetesのMinikubeをインストール

 Windows環境のため、ハイパーバイザーとして、Hyper-Vを選択。

 下記3コマンド実行後、minikube statusコマンドを実行し、問題がないことを確認。

 ・Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
 ・minikube start --driver=hyperv
 ・minikube config set driver hyperv

 ※https://minikube.sigs.k8s.io/docs/drivers/hyperv/
 

   f:id:takanarukodou2:20210813235825p:plain

                                                     図1.Hyper-V選択

    f:id:takanarukodou2:20210813235713p:plain

                                 図2.minikube statusコマンド

 

■3.kubectlのインストール及びコマンド実行

 Kubernetesコマンドラインツールkubectlを使用すると、
 Kubernetesクラスターに対してコマンドを実行できるようになる。

 インストール方法としては、

 「curlを使用してWindowsへkubectlのバイナリをインストール」を選択した。

 ・curl -LO https://storage.googleapis.com/kubernetes-release/release/

  v1.22.0/bin/windows/amd64/kubectl.exe ※CMDで実行

 ・kubectl.exeをPATH環境変数に登録

 ・kubectl versionを実行し、バージョンを確認。
 ※https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

 

 

■次回

 

 「セクション3: (おさらい)猿でも分かるLinuxの基本操作」を軽く流して、

 「セクション4: HelloWorldでK8sのPod,Service,Ingress,Deploymentを理解しよう」に挑む。

 

 

以上です。

【第6弾】Docker学習【Travis CIとHerokuを連携させてWebアプリを起動させろ】

 

家族みんなで過ごすことができて、最幸の一日を過ごしました^^。

 

Udemy「米国AI開発者がゼロから教えるDocker講座」も

 

終わりに近づいております。

 

 

テーマは、「Travis CIとHerokuを連携させてWebアプリを起動」。

 

まずは、githubTravis CIを連携させてWebアプリのテストが通るかどうかを

確認するのですが、こちらは見事に成功しました。

 

     f:id:takanarukodou2:20210813013902p:plain


次に、Travis CIとHEROKUの連携ですが、

「.travis.yml」にデプロイ用の処理追記や、

本番環境用Dockerfile.prodの作成などを行いました。

 

 

その結果、Travis CIにおいて、下記のエラーが発生しました。

 error: could not restore untracked files from stash
 The stash entry is kept in case you need it again.

どうやら、githubのエラーのようなのですが、分かりません。

う~ん、諦めモードです。

Could not restore untracked files from stash (github.com)

 

f:id:takanarukodou2:20210813014338p:plain

 

一応、修了証明書を取得できたので、勉強した証に残しておきたいと思います。

f:id:takanarukodou2:20210813125221p:plain

 

■振り返り及び次回に向けて

 

CI/CDの成功体験積むことはできませんでしたが、

次は、いよいよ、Kubernetesに入りたいと思います。

いや、Pythonも興味ある。。。

どうしよう。。。

 

以上です。

【第5弾】Docker学習【複数のコンテナをdocker composeで作成】

引き続き、相も変わらず

 

Udemy「米国AI開発者がゼロから教えるDocker講座」を

 

聴講しながら、かつ、手を動かしています。

 

最幸の一日を過ごして参ります。

 

テーマは、「Webアプリをdocker composeで作成」。

 

Docker composeの使い所としては、

・docker runコマンドが長くなってしまう時

・複数のコンテナをまとめて起動したい時

 

今回は、[Webアプリ]のコンテナと[PostgreSQL]のコンテナ合計2個を、

Docker composeで起動して利用。

 

なお、大事な法則としては、

1個のコンテナには1個のアプリケーションのみ含ませること。

この規則は、忘れずに覚えていきたいと思います。

 

Docker composeの設定ファイル(docker-compose.yml)を作成しますが、

まずは、Webアプリの部分を記述。そして下記コマンドを実行し

・docker-compose up --build

・docker-compose exec web bash

 

ここで、Webアプリを起動すると、

 

  f:id:takanarukodou2:20210811143213p:plain

 

当然ながら、PostgreSQLに関する情報は記載していないのでエラーとなるようです。

 

docker-compose.ymlに、[PostgreSQL]のコンテナの記述を追加した上で、

(例:depends_on、linksなど)、

改めて、Webアプリを起動すると、

 

                       f:id:takanarukodou2:20210811203517p:plain

 

成功しました!※偉ぶっていうことではありません。

 

■振り返り及び次回に向けて

 

最後は、CI/CDパイプラインに関するセクション。

 

以上です。

【第4弾】Docker学習【GPUを利用するコンテナが動かない】

今日も懲りずに飽きずに、

 

Udemy「米国AI開発者がゼロから教えるDocker講座」を

 

進めています。

 

今日も、当たり前のように、最幸の一日を過ごして参りましょう。

 

GPUを利用したコンテナを動かすということで、

 

 

Windowsマシン上のLinuxサブシステムでさまざまなWebサイトを参照して、

 

nvidiaやcuda関連のパッケージを適当にインストールしまくっていた影響か、

 

Windows上でインストールしていたDocker Desktopが起動しなくなった。

 

対処としては、

 

アンインストール&インストールをすることで、Docker Desktopが

 

起動するようになった。

 

ただ、Docker imageもすべてきれいにクリーンされてしまった。。。

 

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> d2082b3e6065 6 minutes ago 72.8MB
<none> <none> 674c42afbee2 8 minutes ago 6.88GB

 

下記のWebサイトが有力だと思っていたが、自分の実力が足りず断念。

 

CUDA on WSL :: CUDA Toolkit Documentation (nvidia.com)

 

 

■振り返り及び次回に向けて

 

 

 Udemy「米国AI開発者がゼロから教えるDocker講座」の動画講義に戻ります。

 

以上です。

【第3弾】Docker学習【GPUを利用するコンテナを動かすことの難しさを知る】

Udemy「米国AI開発者がゼロから教えるDocker講座」を

 

猛烈に進めたい一心で、ほんの少し進めています。

 

さあ、今日も最幸の一日を過ごして参りましょう。

 

GPUを利用してコンテナを動かすということで、

 

動画ではAWS環境を利用するのだが、自分はGPU搭載の個人PCを利用する。

 

Windowsマシン上のLinuxサブシステムで構築を試みたが、

 

sudo apt-get install linux-headers-$(uname -r)コマンドが通らないっぽい。

 

E: Unable to locate package linux-headers-5.10.16.3-microsoft-standard-WSL2
E: Couldn't find any package by glob 'linux-headers-5.10.16.3-microsoft-standard-WSL2'
E: Couldn't find any package by regex 'linux-headers-5.10.16.3-microsoft-standard-WSL2'

 

linux-headers-5.10.16.3-microsoft-standard-WSL2は流石に用意されていないでしょ!

 

というわけで、Windowsマシン上でセットアップを進めていった。

 

実行コマンド:

docker run --gpus all -p 8888:8888 7635adae33d9

 

結果:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: initialization error: driver error: failed to process request: unknown.

 

ドライバーの初期化エラー?もう分かりません。

 

■振り返り及び次回に向けて

 

 AWS環境(GPUインスタンス:p2.xlarge)で構築した方が

 よかったかもしれませんね。

 

 linux-headers-5.10.16.3-microsoft-standard-WSL2は用意されていないと

 決めつけていたが、下記のドキュメントを見るともしかしたら、

 解決できるかもしれません。

 WSL の CUDA :: CUDA ツールキットのドキュメント (nvidia.com)

 

 分からないだらけで締めくくります。

 

 

以上です。

【第2弾】Docker学習【AWS上でコンテナを動かす環境構築編】

Udemy「米国AI開発者がゼロから教えるDocker講座」は

 

素晴らしい教材だと思います。

 

これならば、私のような頭脳の持ち主でも理解できます。

 

さあ、今日もDockerの知識を身に付けましょう。

 

さあ、今日も最幸の一日を過ごして参りましょう。

 

 

■DockerをAWSに送信して動かせる環境構築

 

 

  AWSのEC2上で、Dockerを動かせる環境を構築するための方法としては、

 下記に示す3個の方法があるようです。

 docker以外の基本的な操作としては、ファイル転送はsftp、EC2上での操作はssh

 

 (1)Dockerレジストリを利用する
  dockerhubに対して、事前にDocker imageをアップロードしておく。

  その後、AWSのEC2にログインし、dockerhubから、

  Docker imageをダウンロードすることになる。

  この方法が圧倒的に多いとのこと。

 (2)Dockerfileをアップロード
  AWSのEC2上で docker buildコマンドを実行する。

  ただし、この方法では、build context(ビルド環境、状況)が異なるため、

  注意が必要とのこと。
  メリットとしては、小容量のテキストファイル(Dockerfile)のアップロード

  なので、アップロードする時間が早い。Dockerfileをアップロードした後は、

  docker buildコマンドを実行する。

  Docker imageが作成できるまでに、5分程度時間が掛かった気がする。

   f:id:takanarukodou2:20210808151041p:plain


 (3)Docker imageを圧縮してアップロード
  個人情報が入っている場合など、インターネットにアクセスできない状況

  で利用するとよい。ただし、Docker imageは、Dockerfileと比較して、

  大きいサイズなので、アップロードの時間が多少掛かる。

  docker saveでDocker imageに圧縮し、

  docker loadでDocker imageを復元するといった感じ。

 

 

■振り返り及び次回に向けて

  個人のPCではマシンパワーが限られる。

 そのため、データ解析をする環境をクラウドで用意して、

 そこで解析することが一般的になっているのであろう。

 ただ、個人情報などや機微な情報が含まれる場合は注意が必要。

 

 次回は、GPUを利用してコンテナを動かす内容となっているようです。 

 

 

以上です。

【第1弾】Docker学習【Dockerfileの基本的な使い方、docker runコマンドのオプション】

Kubernetes学習に入ってない!

 

まずは、Dockerを理解しようと思っています。

 

Udemy「米国AI開発者がゼロから教えるDocker講座」に熱を燃やしています。

 

そんな最中、

 

Udemyでdockerの学習中にメンテナンスが入ってしまった。

 

個人的にはスペシャルゴールデンタイムなんだけど。。。

 

ちなみに、Udemyの学習時間が500分を超えたらしい。

 

でも、Linuxコマンド系の説明はほとんどスキップしているから正確ではないかも。

 

       f:id:takanarukodou2:20210807005456p:plain

 

正直申し上げると、何章まで進んだか良く分からない状況ですが、

 

docker runコマンドのオプションまで学習を進めた。

 

■1.Dockerfileの書き方

 

 ベストプラクティスは、Docker imageのLayer数は最小限にすること。

 Layerが作られるのは、RUN、COPY及びADDの3個。

 また、コマンドを&&で結合、バックスラッシュで改行などを駆使して、

 いかにLayer数を抑えるかがポイントになるみたいです。

 

 下記は、Dockerfileで利用する基本的な命令です。

 

 命令だけ見ると、アセンブラのような、SQL文のような不思議な感覚です。

 

 と言っても、どちらもそんなに詳しくはないですが。。。

 

 FROM ベースとなるDocker imageの指定

 RUN Linuxコマンドの実行(apt-getコマンドなど)

 CMD コンテナで利用するデフォルトのコマンドの指定

 COPY ファイルやディレクトリのコピー

 ADD 圧縮ファイルのコピー&解凍(例:tar、tar.gz)

 ENTRYPOINT コンテナで利用するデフォルトのコマンドの指定

 ENV 環境変数(例:PATH)の設定

 WORKDIR 実行ディレクトリの変更

 

 ん。。。RUNとENTRYPOINTは同じやんけ!

 でもその違いは省略。

 

■2.docker runコマンドのオプション

 

 ・ファイルシステムの共有

  docker run -it -v <ホストのパス>:<コンテナのパス> <Docker imageID>

 ・アクセス権限の制限

  docker run -it -u <ユーザID>:<グループID> <Docker imageID>

  ※大抵は、ホストで利用しているユーザの権限とする

 ・ホストのポートをコンテナのポートに接

  docker run -it  -p <ホストのポート>:<コンテナのポート> <Docker imageID> 

  ※コンテナ上にWebサービスを立ち上げることは当たり前になっている

 ・リソースの制限

  --cpus <CPU数>      コンテナが利用可能な上限のCPUを設定
  --memory <バイト数>    コンテナが利用可能な上限のメモリを設定

 

 

■次回

 

「Dockerfileを制する者がコンテナを制す」という格言は

 

今回まで、ここにあえて残しておく。

 

いよいよDockerの応用編に入るということで、

 

実践レベルで使えるようになるために少しずつでも力を磨いていく。

 

でも、受講してるだけやん!というツッコミは大好きw

 

以上です。

【第2弾】Kubernetes学習【Dockerを使いこなす】

おれもITエンジニアだ(今日は強気)。

 

やっぱり、Kubernetesが面白そう。

 

この感情が湧くと意外に熱中しやすい気がする。

 

でも、まだKubernetesではなく、コンテナ学習の段階。

 

Udemy「米国AI開発者がゼロから教えるDocker講座」を再開。

 

「セクション6: Dockerfileについて知ろう」まで聴講した。

 

図とコマンドを関連付けて説明していただけるので、物凄く分かりやすい。

 

■1.Docker imageを作成する方法

 

 Docker imageを作成する方法は、以下の2種類がある。

 ・Dockerfileから作成する方法(docker build -t)

 ・コンテナから作成する方法(docker commit)

 

 基本的には、Dockerfileから作っていく方が良いとのこと。

 理由は、そのコンテナがどのような内容かが明確であるから。

 

■2.コンテナを稼働させる

 
 docker run -it <Docker imageID> <コマンド> コンテナの新規作成&実行

  ※「docker run」と「docker exec」の違いが分からなくなってきた。

 docker ps 動いているコンテナのみ表示

 docker ps -a 動いていないものも含めてコンテナの一覧表示

 

■3.dockerhubに、Docker imageをアップロード

 docker tag <ソース> <ターゲット> 

  ※名称変更のコマンドであり、自分のリポジトリへアップロードする準備

 docker push <ユーザ名>/<リポジトリ>

 

■4.dockerhubにアップロードをしたDocker Imageをダウンロード

 docker rmi <Docker imageID>

  ※imageを削除。同じDocker imageがあるとダウンロードできないため。
 docker images 

  ※Docker imageの一覧表示
 docker pull <Docker imageID> 

  ※ダウンロードの実行

 

■次回

 

「Dockerfileを制する者がコンテナを制す」という格言をいただいたので、

 

 Dockerfileの書き方を少しマスターしていきたい。

 

 コンテナ同士の独立性、layerを共有するためディスク容量の節約など

 

 の良い面を垣間見れた。

 

 ただ、ここまでの一番の疑問は、docker hubにおきまして、

 

 docker imageは差分のみ記録されるとのことであるが、

 

 仮に、大元のimageがなくなった時はどうなるのか?

 

 あと、混乱しがちな点としては、そのコマンドが、

 

 Docker imageに対して行っているのか?コンテナに対して行っているのか?

 

 をしっかりと意識してやっていくひつようがあるということ。

 

f:id:takanarukodou2:20210801095955p:plain

 

以上です。