1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

k3sでTraefik Ingressを使ってアプリケーションを公開する

Last updated at Posted at 2025-03-12

k3sでTraefik Ingressを使ってアプリケーションを公開する

AWS Cloud9上にk3sをインストールして遊んでいるのですが、Ingressを使ってWebアプリケーションをクラスタ外部に公開したい、となったときにIngress Controllerの設定が必要になりました。

k3sにはデフォルトでTraefikというIngress Controllerが組み込まれているようなので、今回は簡単にそちらをセットアップして使えるようにしたいと思います。

k3sのバージョンは以下の通り。

# k3s --version
k3s version v1.29.5+k3s1 (4e53a323)
go version go1.21.9

Traefix Ingress Controllerとは

Traefik Ingress ControllerはKubernetesで利用可能なIngress Controllerの一種。k3sをインストールするとデフォルトでTraefix Ingress Contollerを使えるようになるみたいです。

実機上でIngress Classを確認してみると、確かにtraefik.io/ingress-controllerという名前のIngress Controllerが存在することを確認できます。

Ingressをデプロイする際にはspec.ingressClassNametraefixを指定すれば良さそうです。

# kubectl describe ingressclass
Name:         traefik
Labels:       app.kubernetes.io/instance=traefik-kube-system
              app.kubernetes.io/managed-by=Helm
              app.kubernetes.io/name=traefik
              helm.sh/chart=traefik-25.0.3_up25.0.0
Annotations:  ingressclass.kubernetes.io/is-default-class: true
              meta.helm.sh/release-name: traefik
              meta.helm.sh/release-namespace: kube-system
Controller:   traefik.io/ingress-controller
Events:       <none>

Ingressをデプロイしてみる

以下のようなマニフェストを用意しました。
Ingressのマニフェストのspec.ingressClassNameの部分で明示的にtraefikを指定しています。ここについてはIngress Classの定義上、ingressclass.kubernetes.io/is-default-class: trueのアノテーションが付いているので、明示的に指定しなくても問題はなさそうです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  namespace: sample-namespace
spec:
  selector:
    matchLabels:
      app: sample-app
  replicas: 3
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - image: docker.io/httpd:2.4
        name: sample-app
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: sample-app-service
  namespace: sample-namespace
spec:
  selector:
    app: sample-app
  ports:
  - port: 8085
    targetPort: 80
    name: http
    protocol: TCP
  type: ClusterIP

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-app-ingress
spec:
  ingressClassName: traefik
  rules:
  - host: k8s.consulting-io.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sample-app-service
            port: 
              number: 8085

デプロイ後、Ingressリソースを確認すると以下のような状態。traefikを使用してIngressがデプロイされていることが確認できます。

$ kubectl get ingress
NAME                 CLASS     HOSTS                   ADDRESS        PORTS   AGE
sample-app-ingress   traefik   k8s.consulting-io.com   172.31.40.27   80      3d8h

ブラウザからもアクセスできました。

スクリーンショット 2025-03-12 22.51.10.png
example.com

参考

k3sの公式ドキュメントには以下のような記述があり、TrefifxでIngressを作成するとLoadBalancerタイプのサービスが作成されて、このサービス経由でクラスタ外部との通信が行われるようです。

The Traefik ingress controller deploys a LoadBalancer Service that uses ports 80 and 443, advertises the LoadBalancer Service's External IPs in the Status of Ingress resources it manages.

実際にkube-systemのサービスを確認するとLoadBalancerタイプのサービスがちゃんと作成されていました。

$ kubectl get svc -n kube-system
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
kube-dns         ClusterIP      10.43.0.10      <none>         53/UDP,53/TCP,9153/TCP       276d
metrics-server   ClusterIP      10.43.189.172   <none>         443/TCP                      276d
traefik          LoadBalancer   10.43.128.184   172.31.40.27   80:30323/TCP,443:31601/TCP   276d

まとめ

k3sではデフォルトでTraefik Ingressが利用可能になっており、特に何も工夫しなくてもIngressの作成からクラスタ上のアプリケーションの公開まで簡単にできました。

Nginx Ingressもインストールすれば利用可能みたいですが、とにかく手っ取り早くやりたいという方はTraefik Ingressがおすすめです。

参考記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?