以前、こんな記事を書いていました。
今回はmicrok8sでKubernetesを動かしてIngressでURLを発行してみたいと思います。
microk8sはこれまでお伝えしているようにアドオンがいくつかあり、必要なサービスをコマンド一つで有効化できます。KnativeとかIstioとか、Prometheusもあります。最近Metallbが追加されました。
microk8sのセットアップ
本題に入る前に、microk8sをセットアップしておきましょう。今回は1台のサーバーで動かすのでこれだけです。
% sudo snap install microk8s --stable --classic
インストール後、今回は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を使ったアプリの展開
Ingressを使って、外部に公開してみます。 今回は「hello-world.example.com」と言うドメインでアプリケーションを公開してみます。 事前にDNSでFQDNで引けるようにするか、クライアントのhostsファイルなどで名前解決できるようにしておく必要があります。
まず、次のようなアプリケーションデプロイ用のYAMLを作成します。
$ cat deploy.yaml apiVersion: v1 kind: Service metadata: name: webapp1-nodeport-svc labels: app: webapp1-nodeport-svc spec: type: NodePort ports: - port: 8080 targetPort: 80 selector: app: webapp1-nodeport-pod --- apiVersion: apps/v1 kind: Deployment metadata: name: webapp1-nodeport-deployment spec: replicas: 2 selector: matchLabels: app: webapp1-nodeport-pod template: metadata: labels: app: webapp1-nodeport-pod spec: containers: - name: webapp1-nodeport-container image: nginx:1.18.0-alpine ports: - containerPort: 80
次でアプリのIngressを定義します。
$ cat ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: sample-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: hello-world.example.com http: paths: - path: / backend: serviceName: webapp1-nodeport-svc servicePort: 8080
アプリをデプロイします。
$ 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.xip.io
のIPアドレスの部分はmicrok8sサーバーのIPアドレスを指定してください。
xip.ioについてはこちらをご覧ください。
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/v1beta1 kind: Ingress metadata: name: svc1 spec: rules: - host: nginx.172.17.28.74.xip.io http: paths: - path: / backend: serviceName: svc1 servicePort: 80
しばらくすると、 http://nginx.172.17.28.74.xip.io:<ノードポート番号>
でアクセスできるようになります。
ちなみにIngressはデプロイしてからアクセスできるようになるまで1〜2分程度の時間がかかります。
アクセスできない場合は dig nginx.172.17.28.74.xip.io
で xip.io
に指定しているIPアドレスが返ってくるか確認してください。それが返ってくるまでアクセスできません。
複数のサービスの展開
次のようなYAMLを書くと http://fruits.172.17.28.74.xip.io/apple
、 http://fruits.172.17.28.74.xip.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: type: NodePort ports: - port: 5678 targetPort: 5678 nodePort: 30080 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: type: NodePort ports: - port: 5678 targetPort: 5678 nodePort: 31080 selector: app: apple --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: simple-fanout-example spec: rules: - host: fruits.172.17.28.74.xip.io http: paths: - path: /banana backend: serviceName: banana servicePort: 5678 - path: /apple backend: serviceName: apple servicePort: 5678
アクセスしてみましょう。
~$ curl http://fruits.172.17.28.74.xip.io/banana banana ~$ curl http://fruits.172.17.28.74.xip.io/apple apple
【追記】 次のサイトの情報が非常にわかりやすかったです。