Nginxが展開されない
問題名
Nginxが展開されない
概要
大学でパソコン部に入部したあなたは、部内インフラ基盤を整えることになった。
先輩がハンズオンに参加してきたそうで、ハンズオンで教えられたマニフェストをそのまま部のサーバーに構築されたkubernetesで動かそうとしたが動かなかったらしい。
先輩はこれからレポートで忙しいそうなのであなたがハンズオンで教えられたマニフェストであるnginx.yaml
に記載されたリソースを動くようにしてほしい。
NginxにつけたいIPは192.168.24.10もしくは192.168.24.11のいずれかでよい。
masterのホームディレクトリにクラスタのアクセス情報があるため、masterからk8sクラスタは操作できる。
前提条件
- nginx.yamlの変更不可
初期状態
- NginxのPodがPending
終了状態
- nginx.yamlで定義したNginxのPodがrunningになっていること。
- Nginxに定められたIPでアクセスできること
- nginx.yamlに記載されたリソースが動作していること
構成情報
kubernetes Master x1, Node x1
問題状況
以下が nginx.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: cephfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: csi-cephfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
volumeMounts:
- name: nginx-data
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: cephfs-pvc
readOnly: false
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
Pod,PVC、LoadBalancerがPendingになっている。
解説
今回のkubernetesクラスタはKubeadmによって構築されている。
Type:LoadBalancerを用意するだけでアドレスは降ってこないことと、 PVがないことが原因である。
MetalLB
LoadBalancerはMetalLBを利用することで解決する。
https://metallb.universe.tf/installation/ より
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
metallb-config.yamlを作る
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.24.10-192.168.24.11
適用してあげる
kubectl apply -f metallb-config.yaml
ストレージ
hostPath
を利用することで永続ストレージを用意してあげることができる。
hostPathでデータを保存するディレクトリを用意する。今回は/data
とする。
sudo mkdir /data
ストレージの種類・プロファイルを設定するStorageClass、永続化ボリュームのオブジェクトであるPersistentVolumeを作成すると解決する。
sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cephfs
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
storageClassName: csi-cephfs
hostPath:
path: /data/test
type: DirectoryOrCreate
その他の回答
- アドレス
- パッチで LBに
externalIPs
を使ってIPをつける
- パッチで LBに
- ストレージ
- hostPathではなくNFSを利用
採点基準
- 指定したIPでNginxのType:LoadBalancerが利用できるようになっている:50%
- StorageClass,PersistentVolumeを用意して、NginxがRunningになっている:50%