K8S 入門から実践まで - K8S へのアプリケーションのデプロイ

K8S 入門から実践まで - K8S へのアプリケーションのデプロイ

背景

最近、k8s 関連のブログやビデオをいくつか更新したところ、いくつかのフィードバックをいただきました。フィードバックは、おおよそ次のカテゴリに分けられます。

  • 同社はサービス指向の変革を遂げていますが、クラウドネイティブにはまだ触れていません。
  • 同社のアプリケーションの一部はクラウドネイティブへの変革を遂げていますが、作業の大部分はインフラストラクチャ部門と運用保守部門によって推進されています。私は単なる開発者なので、詳細は理解していませんし、k8s へのアクセス権もありません。
  • 依然として、主に仮想マシンの展開に基づく従来の運用と保守に基づいています。

2番目のタイプが大部分を占めます。同社はクラウドネイティブ化を進めているものの、純粋なビジネスR&Dの同僚とはあまり関係がないようで、自身の仕事に変化はない。

ちょうどそのとき、私はビジネスR&Dの視点からインフラ部門に異動したばかりでした。私は両方の役割に携わっており、ビジネス R&D スタッフが会社のクラウド ネイティブ アーキテクチャを理解できるよう支援してきました。

そのため、研究開発の観点からk8sを実践できるよう、体系的に皆さんを導いていきたいと考えています。

k8s の一部の機能は実際には運用と保守を重視しており、R&D の優先度はそれほど高くないためです。そのため、インストール、コンポーネント、その他のモジュールなど、k8s の運用と保守に関するいくつかの知識ポイントについては説明しません。主に日々の開発で使うコンポーネントについてお話します。

プラン

はじめる

  • アプリケーションをk8sにデプロイする
  • クロスサービス呼び出し
  • クラスターへの外部アクセス

高度な

  • 設定の使用方法
  • サービスメッシュの実践

アプリケーションを操作する

  • アプリケーションプローブ
  • ローリングアップデートとロールバック
  • エレガントなログコレクション
  • アプリケーションの可観測性
  • 指標の視覚化

k8sは共通のミドルウェアを導入する

  • Helmワンクリックデプロイ
  • アプリケーションライフサイクルを自動化するオペレータの作成

ここでディレクトリを整理しました。各章には、一緒に視聴できるブログとビデオがあります。お好みに合わせてお選びいただけます。

動画も関係するので、週2回の更新を目標に、2か月以内にすべての更新を完了したいと考えています。

私の経験によれば、上記の内容をすべてマスターすれば、k8s をより深く理解できるようになります。

アプリケーションをk8sにデプロイする

まず、第 1 章 [アプリケーションを k8s にデプロイする] から始めて、Go を使用して簡単な Web アプリケーションを作成し、それを Docker イメージにパッケージ化してから、k8s にデプロイしてインターフェース呼び出しを完了します。

アプリケーションの作成

func main() { http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { log.Println("ping") fmt.Fprint(w, "pong") }) http.ListenAndServe(":8081", nil) }

アプリケーションは非常にシンプルで、ping インターフェイスを提供し、pong を返します。

Dockerファイル

# 第一阶段:编译Go 程序FROM golang:1.19 AS dependencies ENV GOPROXY=https://goproxy.cn,direct WORKDIR /go/src/app COPY go.mod . #COPY ../../go.sum . RUN --mount=type=ssh go mod download # 第二阶段:构建可执行文件FROM golang:1.19 AS builder WORKDIR /go/src/app COPY . . #COPY --from=dependencies /go/pkg /go/pkg RUN go build # 第三阶段:部署FROM debian:stable-slim RUN apt-get update && apt-get install -y curl COPY --from=builder /go/src/app/k8s-combat /go/bin/k8s-combat ENV PATH="/go/bin:${PATH}" # 启动Go 程序CMD ["k8s-combat"]

その後、docker イメージを構築するための dockerfile が作成されました。

 docker: @echo "Docker Build..." docker build . -t crossoverjie/k8s-combat:v1 && docker image push crossoverjie/k8s-combat:v1

make docker を使用すると、イメージがローカルでビルドされ、dockerhub にアップロードされます。

デプロイメントの作成

次のステップは、プロセス全体の中で最も重要な部分であり、デプロイメントを記述する k8s を扱う唯一の場所でもあります。

前回のビデオ「1 分で k8s を理解する」では、一般的なコンポーネントについて説明しました。

最も一般的なものはデプロイメントであり、通常はステートレス アプリケーションをデプロイするために使用されます。他のコンポーネントについてはまだあまり知る必要はありません。デプロイメントの記述方法を見てみましょう。

 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat name: k8s-combat spec: replicas: 1 selector: matchLabels: app: k8s-combat template: metadata: labels: app: k8s-combat spec: containers: - name: k8s-combat image: crossoverjie/k8s-combat:v1 imagePullPolicy: Always resources: limits: cpu: "1" memory: 300Mi requests: cpu: "0.1" memory: 30Mi

今のところ、最初の 2 行の apiVersion と kind に注意を払う必要はありません。これらは、デプロイメントを記述するための固定された方法であると考えてください。

メタデータ: 名前が示すように、メタデータが定義され、デプロイメントの名前をポッドに伝える場所です。ここでは次のように定義されています: k8s-combat

真ん中:

 metadata: labels: app: k8s-combat

分かりやすいです。デプロイメントにラベルを付けることです。通常、このラベルを他のコンポーネントに関連付けることは理にかなっています。そうでなければ、それは単なるラベルです。

タグはキーと値のペアの形式であり、キーと値の両方をカスタマイズできます。

ここでの app: k8s-combat は、以下の仕様の下のセレクターと一致しており、両方とも app: k8s-combat に関連付けられていることを示しています。

テンプレートで定義されたラベルは、セレクターをテンプレートで定義された Pod に関連付けるためにも使用されます。

Pod は、k8s で同じ機能を持つコンテナのグループです。 Pod は複数のコンテナにバインドできます。ここではアプリケーション コンテナーが 1 つだけあります。他のコンテナについては、後で istio とログ収集について説明するときに説明します。

テンプレートで定義された内容はわかりやすいです。コンテナのプル アドレスと占有されているリソース (CPU/メモリ) を指定します。

replicas: 1: は、レプリカが 1 つだけデプロイされていること、つまりノードが 1 つだけであることを意味します。

アプリケーションをデプロイする

次に、次のコマンドを使用します。

 kubectl apply -f deployment/deployment.yaml

クラウドベンダーが提供する k8s 環境は、本番環境でよく使用されます。 https://minikube.sigs.k8s.io/docs/start/minikube を使用してローカルでシミュレートできます。

このデプロイメントが適用され、コンテナが同時に k8s にデプロイされて使用されます。

 kubectl get pod

バックグラウンドでは、k8s は入力したリソースに基づいて適切なノードを選択し、そこに現在の Pod をデプロイします。

先ほどデプロイした Pod がリストされます。

 ❯ kubectl get pod NAME READY STATUS RESTARTS AGE k8s-combat-57f794c59b-7k58n 1/1 Running 0 17h

次のコマンドを使用します:

 kubectl exec -it k8s-combat-57f794c59b-7k58n bash

docker を使用する場合と同様に、コンテナーに入ります。

次に、curl コマンドを実行してインターフェースにアクセスします。

 root@k8s-combat-57f794c59b-7k58n:/# curl http://127.0.0.1:8081/ping pong root@k8s-combat-57f794c59b-7k58n:/#

この時点で別のターミナルを開いて実行します。

 ❯ kubectl logs -f k8s-combat-57f794c59b-7k58n 2023/09/03 09:28:07 ping

もちろん、コンテナ内のログを印刷できますが、前提として、アプリケーション ログは標準出力に書き込まれます。

要約する

以上がこの章の主な内容です。重点は、アプリケーション プログラマーを Docker イメージにパッケージ化してイメージ ウェアハウスにアップロードし、k8s によるスケジュール設定と実行のためにデプロイメントを構成することです。

関連するソース コードと yaml リソース ファイルは次のとおりです。

https://github.com/crossoverJie/k8s-combat。

<<:  OpenTelemetry Operator を使用して観測可能なデータを SigNoz に送信する

>>:  マルチリージョン展開が簡単に: Linode VLAN による迅速なマルチリージョン展開

推薦する

最適化 ≥ ユーザーエクスペリエンス? 私にとって SEO とは何でしょうか?

2009年、私は誰もが羨む公務員という楽な仕事を正式に辞め、ウェブマスター業界に飛び込みました。私が...

3つの主要なクラウドネイティブデータベース: Aurora、PolarDB、Socrates

1. 「クラウドネイティブ データベース」とは何ですか?クラウド コンピューティングの出現により、企...

pzea: 香港 VPS、シンガポール VPS、日本 VPS、すべて 30% オフ、一部 50% オフ、Windows 対応

pzea は割引を提供しています: シンガポール VPS、香港 VPS、日本 VPS はすべて、月払...

移行実務 | VMware および Hyper-V から OpenStack への移行

[[329658]]導入現在、5 年間稼働している VMware の完全なセットを保有しています。...

PV値は重みに影響します。ベテランウェブマスターがPV値を向上させる方法を教えます

ウェブサイトの重さは、すべてのウェブサイトが追求する動機と目標です。ウェブサイトの重さを改善するには...

クラウド ネイティブでの観測可能なデータ収集の実践については、この記事をお読みください。

この記事は、GOPS 2022 上海での Yu Tao 教授の講演に基づいてまとめられています。さら...

デジタルトランスフォーメーションとハイブリッドクラウド戦略の策定のメリット

世界各国が流行病への対応に取り組んでいる中、科学界は可能な限り短期間で効果的なワクチンを開発したいと...

クラウドストレージアーキテクチャの技術的特徴と3つの開発方向

クラウドコンピューティングは、個人用 PC とインターネットに続く第 3 の情報革命として知られてい...

stallionhost - $6.5/年/128MB RAM/5GB HDD/300GB トラフィック

Stallionhost は 1 年前に設立された小さな VPS ビジネスです。ワンマンとも言えます...

Linodeについてはどうですか? [年] Linode Core - ダラスデータセンター簡易評価

Linodeはどうですか? Linode のダラス データ センターはどうですか?ダラスの現在の速度...

メーデー プロモーションがもうすぐ始まります。ウェブマスターは良いマーケティング プランを立てましたか?

企業が電子商取引プラットフォームに参加し、従来のマーケティングの限界を打ち破ると、ホリデー プロモー...

新しいSEOコンセプト:キーワードランキングネットワーク

キーワードランキングネットワークは、中国のSEO専門家Obsessionによって初めて提案されました...

ウェブサイト構築の究極の目標は、ウェブサイトの利益ポジショニングです

1. 収益性の観点から運用上の問題を考えます。収益はウェブサイト運営の原動力です。どのような種類のウ...