はじめに
この実験では、内部および外部サービスの作成、ラベルの操作、およびイングレスの基本を学ぶなど、さまざまな手法を使って Kubernetes アプリケーションを公開する方法を学びます。まず、Minikube を使ってローカル Kubernetes クラスタをセットアップし、次にサンプルの NGINX アプリケーションをデプロイして内部および外部で公開します。また、ラベルを使ってリソースを整理および選択する方法を学び、最後にイングレスについて学び、簡単なイングレス YAML の例を見ます。
この実験では、内部および外部サービスの作成、ラベルの操作、およびイングレスの基本を学ぶなど、さまざまな手法を使って Kubernetes アプリケーションを公開する方法を学びます。まず、Minikube を使ってローカル Kubernetes クラスタをセットアップし、次にサンプルの NGINX アプリケーションをデプロイして内部および外部で公開します。また、ラベルを使ってリソースを整理および選択する方法を学び、最後にイングレスについて学び、簡単なイングレス YAML の例を見ます。
このステップでは、Minikube を使ってローカル Kubernetes クラスタを起動して検証する方法を学びます。これは、ローカル マシンで Kubernetes アプリケーションを開発およびテストするための必須の最初のステップです。
まず、Minikube クラスタを起動します。
minikube start
出力例:
😄 minikube v1.29.0 on Ubuntu 22.04
✨ Automatically selected the docker driver
📌 Using Docker driver with root permissions
🔥 Creating kubernetes in kubernetes cluster
🔄 Restarting existing kubernetes cluster
🐳 Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀 Launching Kubernetes...
🌟 Enabling addons: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace
複数のコマンドを使ってクラスタの状態を検証します。
minikube status
kubectl get nodes
minikube status の出力例:
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
kubectl get nodes の出力例:
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 1m v1.26.1
これらのコマンドは、以下のことを確認します。
このステップでは、YAML マニフェストを使って Kubernetes アプリケーションを作成およびデプロイする方法を学びます。Kubernetes リソースを定義および適用するプロセスを示すために、簡単な NGINX ウェブ サーバーのデプロイを作成します。
まず、Kubernetes マニフェスト用のディレクトリを作成します。
mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests
NGINX のデプロイ用の YAML ファイルを作成します。
nano nginx-deployment.yaml
次のデプロイ マニフェストを追加します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
ファイルを保存します (Ctrl+X で次に Y で Enter)。
Kubernetes クラスタにデプロイを適用します。
kubectl apply -f nginx-deployment.yaml
出力例:
deployment.apps/nginx-deployment created
デプロイとポッドを検証します。
kubectl get deployments
kubectl get pods
kubectl get deployments の出力例:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
kubectl get pods の出力例:
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxx-yyy 1/1 Running 0 1m
nginx-deployment-xxx-zzz 1/1 Running 0 1m
nginx-deployment-xxx-www 1/1 Running 0 1m
次の手順に進む前に、ポッドが「Running」状態になるまで待ちます。
YAML マニフェストを解説しましょう。
apiVersion: Kubernetes API のバージョンを指定しますkind: リソースの種類 (Deployment) を定義しますmetadata: デプロイに名前とラベルを提供しますspec.replicas: ポッドのレプリカ数を設定しますselector: デプロイが正しいポッドを管理するのを助けますtemplate: ポッドの仕様を定義しますcontainers: コンテナ イメージとポートを指定しますこのデプロイは 3 つの同じ NGINX ポッドを作成し、Kubernetes がコンテナ化されたアプリケーションをどのように管理するかを示しています。
このステップでは、Kubernetes サービスを作成して NGINX のデプロイを内部および外部に公開する方法を学びます。2 つの一般的なサービスの種類:ClusterIP と NodePort を示します。
まず、プロジェクト ディレクトリに移動します。
cd ~/project/k8s-manifests
ClusterIP サービスの YAML ファイルを作成します。
nano nginx-clusterip-service.yaml
次のサービス マニフェストを追加します。
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip-service
spec:
selector:
app: nginx
type: ClusterIP
ports:
- port: 80
targetPort: 80
次に、NodePort サービスの YAML ファイルを作成します。
nano nginx-nodeport-service.yaml
次のサービス マニフェストを追加します。
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport-service
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
両方のサービスの設定を適用します。
kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml
出力例:
service/nginx-clusterip-service created
service/nginx-nodeport-service created
サービスを検証します。
kubectl get services
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30m
nginx-clusterip-service ClusterIP 10.104.xxx.xxx <none> 80/TCP 1m
nginx-nodeport-service NodePort 10.108.yyy.yyy <none> 80:30080/TCP 1m
NodePort サービスにアクセスするには、Minikube の IP を取得します。
minikube ip
出力例:
192.168.49.2
サービスの種類の主な違い:
このステップでは、kubectl describe service を使って Kubernetes サービスの詳細な設定を調べ、そのネットワーク プロパティを理解する方法を学びます。
まず、プロジェクト ディレクトリにいることを確認します。
cd ~/project/k8s-manifests
ClusterIP サービスの詳細を表示します。
kubectl describe service nginx-clusterip-service
出力例:
Name: nginx-clusterip-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.104.xxx.xxx
IPs: 10.104.xxx.xxx
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity: None
Events: <none>
次に、NodePort サービスの詳細を表示します。
kubectl describe service nginx-nodeport-service
出力例:
Name: nginx-nodeport-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.108.yyy.yyy
IPs: 10.108.yyy.yyy
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
ネットワーク接続性を検証するために、サービス エンドポイントを調べます。
kubectl get endpoints
出力例:
NAME ENDPOINTS AGE
kubernetes 192.168.49.2:8443 45m
nginx-clusterip-service 10.244.0.7:80,10.244.0.8:80,10.244.0.9:80 15m
nginx-nodeport-service 10.244.0.7:80,10.244.0.8:80,10.244.0.9:80 15m
サービスの説明から理解すべき重要な情報:
このステップでは、Kubernetes でラベルを使って効率的にリソースを整理して選択する方法を学びます。ラベルは、Kubernetes オブジェクトを管理および整理するのに役立つキーと値のペアです。
まず、ポッドの現在のラベルを検証します。
kubectl get pods --show-labels
出力例:
NAME READY STATUS RESTARTS AGE LABELS
nginx-deployment-xxx-yyy 1/1 Running 0 30m app=nginx,pod-template-hash=xxx
nginx-deployment-xxx-zzz 1/1 Running 0 30m app=nginx,pod-template-hash=yyy
nginx-deployment-xxx-www 1/1 Running 0 30m app=nginx,pod-template-hash=zzz
特定のラベルを使ってポッドを選択します。
kubectl get pods -l app=nginx
出力例:
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxx-yyy 1/1 Running 0 30m
nginx-deployment-xxx-zzz 1/1 Running 0 30m
nginx-deployment-xxx-www 1/1 Running 0 30m
ポッドの 1 つにカスタム ラベルを追加しましょう。
kubectl label pods nginx-deployment-xxx-yyy environment=development
nginx-deployment-xxx-yyy を自分のポッドの名前に置き換えてください。
出力例:
pod/nginx-deployment-xxx-yyy labeled
次に、複数のラベル セレクタを持つポッドを選択します。
kubectl get pods -l app=nginx,environment=development
出力例:
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxx-yyy 1/1 Running 0 30m
ポッドからラベルを削除します。
kubectl label pods nginx-deployment-xxx-yyy environment-
出力例:
pod/nginx-deployment-xxx-yyy unlabeled
サービスでのラベル選択を示します。
kubectl describe service nginx-clusterip-service
サービスがポッドを識別するためにラベルをどのように使用するかを示す「Selector」セクションを探します。
ラベルに関する要点:
このステップでは、kubectl コマンドを使用して Kubernetes サービスを削除および管理する方法を学びます。サービス管理を理解することは、Kubernetes リソースの維持と整理に不可欠です。
まず、現在のサービスを一覧表示します。
kubectl get services
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
nginx-clusterip-service ClusterIP 10.104.xxx.xxx <none> 80/TCP 45m
nginx-nodeport-service NodePort 10.108.yyy.yyy <none> 80:30080/TCP 45m
kubectl delete を使用して特定のサービスを削除します。
kubectl delete service nginx-clusterip-service
出力例:
service "nginx-clusterip-service" deleted
サービスの削除を確認します。
kubectl get services
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
nginx-nodeport-service NodePort 10.108.yyy.yyy <none> 80:30080/TCP 45m
複数のサービスの削除をより明確に示すために、サービスを再作成してから一緒に削除しましょう。
## Recreate services
kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml
## Delete multiple services at once
kubectl delete service nginx-clusterip-service nginx-nodeport-service
出力例:
service "nginx-clusterip-service" deleted
service "nginx-nodeport-service" deleted
すべてのサービスが削除されたことを確認します(デフォルトの kubernetes サービスを除く)。
kubectl get services
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
サービス削除に関する要点:
このステップでは、Kubernetes クラスタ内のサービスへの外部アクセスを管理する強力な方法である Kubernetes Ingress について学びます。
Ingress は、Kubernetes クラスタ内のサービスへの外部アクセス(通常は HTTP)を管理する API オブジェクトです。Ingress は以下の機能を提供します。
Ingress は 2 つのコンポーネントで構成されています。
注意:この実験では Ingress の基本的な紹介のみを提供しています。本番環境では、Ingress の設定ははるかに複雑になり、高度なルーティング、認証、レート制限などが含まれます。
Minikube で Ingress アドオンを有効にしましょう。
minikube addons enable ingress
出力例:
💡 ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
🔉 ingress was successfully enabled
2 つのサンプルアプリケーションのデプロイメントを作成します。
kubectl create deployment web1 --image=nginx:alpine
kubectl create deployment web2 --image=httpd:alpine
これらのデプロイメントをサービスとして公開します。
kubectl expose deployment web1 --port=80 --type=ClusterIP --name=web1-service
kubectl expose deployment web2 --port=80 --type=ClusterIP --name=web2-service
Ingress の YAML ファイルを作成します。
nano ingress-example.yaml
以下の Ingress 設定を追加します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /web1
pathType: Prefix
backend:
service:
name: web1-service
port:
number: 80
- path: /web2
pathType: Prefix
backend:
service:
name: web2-service
port:
number: 80
この Ingress 設定の主要なコンポーネント:
Ingress 設定を適用します。
kubectl apply -f ingress-example.yaml
Ingress リソースを確認します。
kubectl get ingress
出力例:
NAME CLASS HOSTS ADDRESS PORTS AGE
example-ingress nginx * 192.168.49.2 80 1m
Ingress の詳細を確認します。
kubectl describe ingress example-ingress
出力例にはルーティングルールとバックエンドサービスが表示されます。
Ingress のテスト:
## Get the Minikube IP
minikube ip
## Test access to the services through Ingress
curl $(minikube ip)/web1
curl $(minikube ip)/web2
各コマンドは、それぞれの Web サーバーのデフォルトページを返すはずです。
本番環境では、Ingress を以下のように設定できます。
Ingress のより包括的な情報については、Kubernetes のドキュメントを参照し、NGINX Ingress や Traefik などの専用の Ingress コントローラのドキュメントを調べることを検討してください。
この実験では、Minikube を使ってローカルの Kubernetes クラスタを起動して検証する方法を学びました。これは、ローカル マシン上で Kubernetes アプリケーションを開発およびテストする際に不可欠です。次に、YAML マニフェストを使って簡単な NGINX ウェブ サーバーのデプロイを作成してデプロイし、Kubernetes リソースを定義して適用するプロセスを示しました。また、Kubernetes サービスを作成してアプリケーションを内部または外部に公開する方法と、ラベルを使ってリソースを整理して選択する方法を学びました。最後に、Kubernetes Ingress の基本を学び、簡単な Ingress YAML の例を見ました。