Xubuntu上のminikubeでIngressを使う

Xubuntu上のminikubeでIngressを使う

minikubeが停止している場合は開始します。

1
minikube start --driver=docker

初期の状態で何が動いているのかをチェックします。

1
kubectl get all -A            

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NAMESPACE     NAME                                   READY   STATUS    RESTARTS      AGE
kube-system pod/coredns-78fcd69978-vmdl6 1/1 Running 0 101s
kube-system pod/etcd-minikube 1/1 Running 0 115s
kube-system pod/kube-apiserver-minikube 1/1 Running 0 113s
kube-system pod/kube-controller-manager-minikube 1/1 Running 0 113s
kube-system pod/kube-proxy-db4dw 1/1 Running 0 101s
kube-system pod/kube-scheduler-minikube 1/1 Running 0 115s
kube-system pod/storage-provisioner 1/1 Running 1 (70s ago) 112s

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 115s
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 114s

NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 114s

NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/coredns 1/1 1 1 114s

NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/coredns-78fcd69978 1 1 1 101s

minikubeでIngressを有効にします

ドキュメント:
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

1
minikube addons enable ingress

Ingressを有効にしたあとの状態を確認します。

1
kubectl get all -A

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
NAMESPACE       NAME                                            READY   STATUS      RESTARTS        AGE
ingress-nginx pod/ingress-nginx-admission-create--1-httf5 0/1 Completed 0 24s
ingress-nginx pod/ingress-nginx-admission-patch--1-8pmjs 0/1 Completed 0 24s
ingress-nginx pod/ingress-nginx-controller-69bdbc4d57-flhbp 0/1 Running 0 24s
kube-system pod/coredns-78fcd69978-vmdl6 1/1 Running 0 3m25s
kube-system pod/etcd-minikube 1/1 Running 0 3m39s
kube-system pod/kube-apiserver-minikube 1/1 Running 0 3m37s
kube-system pod/kube-controller-manager-minikube 1/1 Running 0 3m37s
kube-system pod/kube-proxy-db4dw 1/1 Running 0 3m25s
kube-system pod/kube-scheduler-minikube 1/1 Running 0 3m39s
kube-system pod/storage-provisioner 1/1 Running 1 (2m54s ago) 3m36s

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m39s
ingress-nginx service/ingress-nginx-controller NodePort 10.108.240.214 <none> 80:30541/TCP,443:32559/TCP 24s
ingress-nginx service/ingress-nginx-controller-admission ClusterIP 10.109.86.198 <none> 443/TCP 24s
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3m38s

NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 3m38s

NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
ingress-nginx deployment.apps/ingress-nginx-controller 0/1 1 0 24s
kube-system deployment.apps/coredns 1/1 1 1 3m38s

NAMESPACE NAME DESIRED CURRENT READY AGE
ingress-nginx replicaset.apps/ingress-nginx-controller-69bdbc4d57 1 1 0 24s
kube-system replicaset.apps/coredns-78fcd69978 1 1 1 3m25s

NAMESPACE NAME COMPLETIONS DURATION AGE
ingress-nginx job.batch/ingress-nginx-admission-create 1/1 4s 24s
ingress-nginx job.batch/ingress-nginx-admission-patch 1/1 5s 24s

ingress-nginxネームスペースに展開されているようです。
このネームスペースを指定します。

1
kubectl get all -n ingress-nginx

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create--1-httf5 0/1 Completed 0 2m5s
pod/ingress-nginx-admission-patch--1-8pmjs 0/1 Completed 0 2m5s
pod/ingress-nginx-controller-69bdbc4d57-flhbp 1/1 Running 0 2m5s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller NodePort 10.108.240.214 <none> 80:30541/TCP,443:32559/TCP 2m5s
service/ingress-nginx-controller-admission ClusterIP 10.109.86.198 <none> 443/TCP 2m5s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 2m5s

NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-69bdbc4d57 1 1 1 2m5s

NAME COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create 1/1 4s 2m5s
job.batch/ingress-nginx-admission-patch 1/1 5s 2m5s

この状態でクラスタにアクセスしてみます。
まずはminikubeのIPを確認します。

1
minikube ip

例:

1
192.168.49.2

そのIPにアクセスしてみます。

1
curl `minikube ip`

404の結果が返ってきます。

1
2
3
4
5
6
7
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

サンプルアプリケーションをデプロイします

HTTP サーバをminikubeにデプロイします。

ドキュメント:
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/#deploy-a-hello-world-app

まずはdeploymentとpodです。

1
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

続いてserviceです。

1
kubectl expose deployment web --type=NodePort --port=8080

結果を確認します。

1
kubectl get service web

例:

1
2
NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
web NodePort 10.109.141.151 <none> 8080:31972/TCP 6s

上の例では、該当ノードの31972ポートで公開されています。

サービスのURLを表示するコマンドです。

1
minikube service web --url

例:

1
http://192.168.49.2:31972

ここにcurlでアクセスしてみます。

1
curl `minikube service web --url`

例:

1
2
3
Hello, world!
Version: 1.0.0
Hostname: web-79d88c97d6-8zcks

Ingressリソースを作成する

Ingressリソースを使って、ノードのIPアドレスとポート番号を指定するのではなくホスト名でアクセスできるようにします。ここではhttp://hello-world.infoとします。

以下のファイルをexample-ingress.yamlとして作成します。
これは、hello-world.infoへのアクセスをwebサービスの8080ポートにプロキシするという内容です。
このIngressリソースはdefaultネームスペースに作成します。defaultに作らなければいけないわけではありませんが、同じネームスペースのサービスを探すようです。もし異なるネームスペースのサービスにプロキシしたいならExternalNameサービスを間に挟めばよさそうです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8080

作成したファイルを適用します。

1
kubectl apply -f example-ingress.yaml

結果を確認します。

1
kubectl get ing    

例:

1
2
NAME              CLASS   HOSTS              ADDRESS        PORTS   AGE
example-ingress nginx hello-world.info 192.168.49.2 80 2m41s

この状態で動作を確認してみます。しかし、hello-world.infoとノードのIPは関連づいていません。
そこでHostヘッダで指定してみます。minikube ipはノードのIPを取得するコマンドです。

1
curl -H "Host: hello-world.info" `minikube ip`

さっきと同じ結果が返ってくればOKです。

これで、ノードポートを意識せずにPodまでアクセスできるようになりました。