以前、こんな記事を書いていました。
今回はmicrok8sでKubernetesを動かしてIngressでURLを発行してみたいと思います。
microk8sはこれまでお伝えしているようにアドオンがいくつかあり、必要なサービスをコマンド一つで有効化できます。KnativeとかIstioとか、Prometheusもあります。最近Metallbが追加されました。
microk8sのセットアップ
本題に入る前に、microk8sをセットアップしておきましょう。今回は1台のサーバーで動かすのでこれだけです。
% sudo snap install microk8s --classic --channel=1.22/stable
インストール後、今回はIngressを使いたいので次のようなコマンドを実行します。実行するとセットアップが始まります。
% sudo microk8s.enable ingress
これで終わりです。 なお、microk8sについては過去記事もご覧ください。
- https://tech.virtualtech.jp/entry/2019/10/17/135720
- https://tech.virtualtech.jp/entry/2019/10/25/150802
Ingressを使ったアプリの展開
[4/27/2022 update] Ingress APIバージョンを最新に更新。公式ドキュメントのIngressの例を参考にしました。
Ingressを使って、外部に公開してみます。 今回は「hello-world.example.com」と言うドメインでアプリケーションを公開してみます。 事前にDNSでFQDNで引けるようにするか、クライアントのhostsファイルなどで名前解決できるようにしておく必要があります。
まず、次のようなアプリケーションデプロイ用のYAMLを作成します。
$ cat deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxapp1
spec:
replicas: 1
selector:
matchLabels:
app: nginxapp1
template:
metadata:
labels:
app: nginxapp1
spec:
containers:
- name: nginxapp1
image: docker.io/library/nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginxapp1-service
labels:
app: nginxapp1
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginxapp1
次でアプリのIngressを定義します。
$ cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginxapp1-service
port:
number: 80
注記
ここで利用しているドメイン example.com は自分が所有するドメインに書き換えます。
当然ながらサブドメイン含めたドメインを、DNSサーバーに設定する必要があります。
テストしたいだけなら、ここに書いたドメインをクライアントの /etc/hosts に書いて実行します。
アプリをデプロイします。
$ microk8s.kubectl create -f deploy.yaml $ microk8s.kubectl create -f ingress.yaml
curlやブラウザーなどでアプリにアクセスできることを確認します。
$ curl http://hello-world.example.com/ <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...
ワイルドカードDNSサービスを使ったアプリの展開
次のようなYAMLを作成して、アプリケーションをデプロイしましょう。
nginx.172.17.28.74.nip.io のIPアドレスの部分はmicrok8sサーバーのIPアドレスを指定してください。
YAML例はこちらです。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: app1
template:
metadata:
name: app1
labels:
app: app1
spec:
containers:
- name: app1
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc1
labels:
app: app1
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: app1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: svc1
spec:
rules:
- host: nginx.172.17.28.74.nip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc1
port:
number: 80
しばらくすると、 http://nginx.172.17.28.74.nip.io でアクセスできるようになります。
ちなみにIngressはデプロイしてからアクセスできるようになるまで1〜2分程度の時間がかかります。
アクセスできない場合は dig nginx.172.17.28.74.nip.io で nip.io に指定しているIPアドレスが返ってくるか確認してください。それが返ってくるまでアクセスできません。
複数のサービスの展開
次のようなYAMLを書くと http://fruits.172.17.28.74.nip.io/apple 、 http://fruits.172.17.28.74.nip.io/banana で、それぞれ別々のコンテナーアプリケーションにアクセスできるようになります。ちなみにxip.ioのようなサービスは自分で建てることができるようです。まだ試してはいませんが、そのうちやってみたいと思います。
少々短めですが、本日のネタは以上です。
apiVersion: apps/v1
kind: Deployment
metadata:
name: banana
spec:
replicas: 1
selector:
matchLabels:
app: banana
template:
metadata:
name: banana
labels:
app: banana
spec:
containers:
- name: banana
image: hashicorp/http-echo
args:
- "-text=banana"
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: banana
labels:
app: banana
spec:
ports:
- port: 5678
targetPort: 5678
selector:
app: banana
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: apple
spec:
replicas: 1
selector:
matchLabels:
app: apple
template:
metadata:
name: apple
labels:
app: apple
spec:
containers:
- name: apple
image: hashicorp/http-echo
args:
- "-text=apple"
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: apple
labels:
app: apple
spec:
ports:
- port: 5678
targetPort: 5678
selector:
app: apple
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: www4.tooyama.org
http:
paths:
- path: /banana
pathType: Prefix
backend:
service:
name: banana
port:
number: 5678
- path: /apple
pathType: Prefix
backend:
service:
name: apple
port:
number: 5678
アクセスしてみましょう。
~$ curl http://fruits.172.17.28.74.nip.io/banana banana ~$ curl http://fruits.172.17.28.74.nip.io/apple apple
【追記】 次のサイトの情報が非常にわかりやすかったです。