仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

microk8sでKubernetes Ingressをもう少し触ってみた

以前、こんな記事を書いていました。

tech.virtualtech.jp

今回はmicrok8sでKubernetesを動かしてIngressでURLを発行してみたいと思います。

microk8sはこれまでお伝えしているようにアドオンがいくつかあり、必要なサービスをコマンド一つで有効化できます。KnativeとかIstioとか、Prometheusもあります。最近Metallbが追加されました。

microk8sのセットアップ

本題に入る前に、microk8sをセットアップしておきましょう。今回は1台のサーバーで動かすのでこれだけです。

% sudo snap install microk8s --stable --classic

インストール後、今回はIngressを使いたいので次のようなコマンドを実行します。実行するとセットアップが始まります。

% sudo microk8s.enable ingress

これで終わりです。 なお、microk8sについては過去記事もご覧ください。

サービスの展開

次のようなYAMLを作成して、アプリケーションをデプロイしましょう。 nginx.172.17.28.74.xip.io のIPアドレスの部分はmicrok8sサーバーのIPアドレスを指定してください。

xip.ioについてはこちらをご覧ください。

qiita.com

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.ioxip.io に指定しているIPアドレスが返ってくるか確認してください。それが返ってくるまでアクセスできません。

アクセスはできたとは言え、ノードポートの指定をアクセスするのに必要なのは面倒ですよね。そもそもノードポートは変わってしまうし。

そこで、次のようにサービスの部分でノードポートを固定化してみました。 こうすると、アクセスURLにノードポートを指定することなく、アクセスできます。

---
apiVersion: v1
kind: Service
metadata:
  name: svc1
  labels:
    app: app1
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 32080
  selector:
    app: app1

複数のサービスの展開

次のようなYAMLを書くと http://fruits.172.17.28.74.xip.io/applehttp://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: 80
---
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

【追記】 次のサイトの情報が非常にわかりやすかったです。

matthewpalmer.net