このラボでは、Serviceリソースを使ってPodへの安定したネットワークアクセスを提供し、負荷分散が行われることを確認します。
まずServiceの対象となるDeploymentを作成します。
cat << 'EOF' > whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 3
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami
ports:
- containerPort: 80
EOF
kubectl apply -f whoami-deployment.yaml
ClusterIPはクラスタ内部からのみアクセスできるServiceタイプです(デフォルト)。
cat << 'EOF' > whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami-svc
spec:
selector:
app: whoami
ports:
- port: 80
targetPort: 80
type: ClusterIP
EOF
kubectl apply -f whoami-service.yaml
# Service一覧
kubectl get services
# Serviceの詳細(Endpoints を確認)
kubectl describe service whoami-svc
一時的なPodを起動して、Service経由でアクセスしてみます。
# curlが使えるPodを起動してService名でアクセス
kubectl run curl-test --image=curlimages/curl --rm -it -- sh
# Pod内で以下を実行(何度か実行して異なるPodに振り分けられることを確認)
curl http://whoami-svc
curl http://whoami-svc
curl http://whoami-svc
exit
NodePortはノードのIPアドレスとポート番号で外部からアクセスできるようにするServiceタイプです。
cat << 'EOF' > whoami-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: whoami-nodeport
spec:
selector:
app: whoami
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
EOF
kubectl apply -f whoami-nodeport.yaml
# Service確認
kubectl get service whoami-nodeport
# ノードのIPでアクセス(何度かcurlして負荷分散を確認)
curl http://localhost:30080
curl http://localhost:30080
curl http://localhost:30080
レスポンスの Hostname が毎回異なるPod名になることを確認してください。これがServiceによる負荷分散です。
kubectl delete -f whoami-nodeport.yaml
kubectl delete -f whoami-service.yaml
kubectl delete -f whoami-deployment.yaml
# 1. Deployment作成
kubectl create deployment web --image=nginx --replicas=2
# 2. Service作成
kubectl expose deployment web --type=NodePort --port=80 --name=web-svc
# もしくはYAMLで nodePort: 30088 を指定
# もしくはYAMLで作成:
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30088
type: NodePort
EOF
# 3. アクセス確認
curl http://localhost:30088
# 4. クリーンアップ
kubectl delete service web-svc
kubectl delete deployment web