web-dev-qa-db-ja.com

ベアメタルシングルノードクラスターでKubernetes Ingress Port 80を機能させる方法

Kubeadmで作成されたベアメタルkubernetes(v1.11.0)クラスターがあり、問題なく正常に動作しています。 calicoでネットワークを構築し、kubectl taint nodesコマンドを使用して単一ノードクラスターにしました。 (単一ノードが要件です)。

ホストポート80でmydockerhub/sampleweb静的Webサイトイメージを実行する必要があります。このkubernetesを実行しているubuntuサーバーのIPアドレスが192.168.8.10であると仮定します。

静的ウェブサイトを192.168.8.10:80またはローカルDNSサーバー上のそれにマッピングされたホスト名で利用可能にする方法は? (例:frontend.sampleweb.local:80)。後で、別のサブドメインにマップされた異なるポートで他のサービスを実行する必要があります。 (例:ポート8080で実行されるサービスにルーティングするbackend.sampleweb.local:80)。

私は知る必要がある:

  1. ロードバランサーなしでこれを達成できますか?
  2. 作成に必要なリソースは何ですか? (進入、展開など)
  3. クラスターにはどのような追加構成が必要ですか? (ネットワークポリシーなど)

    サンプルのyamlファイルが提供されていれば大歓迎です。

Kubernetesの世界は初めてです。エンドツーエンドで問題なく動作するサンプルkubernetesデプロイメント( sock-shop など)を入手しました。 NodePortでサービスにアクセスしようとしましたが、別のポートで実行する代わりに、ホストで正確にポート80を実行する必要があります。多くのイングレスソリューションを試しましたが、うまくいきませんでした。

私のセットアップのスクリーンショット:
enter image description here

12
sith

私は最近 traefik.io を使用して、プロジェクトを同様の要件で構成しました。

そこで、traefikとイングレスを使用した基本的なソリューションを示します。

名前空間全体を専用にしました(kube-system)、traefikと呼ばれ、kubernetes serviceAccountを作成しました:

apiVersion: v1
kind: Namespace
metadata:
  name: traefik
---
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: traefik
  name: traefik-ingress-controller

入力規則によって呼び出されるtraefikコントローラーには、ClusterRoleとそのバインディングが必要です。

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  namespace: traefik
  name: traefik-ingress-controller

Traefinコントローラーはdaemonsetとしてデプロイされます(つまり、クラスター内の各ノードに1つずつ定義されます)。Kubernetesサービスはコントローラー専用です:

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: traefik
  labels:
    k8s-app: traefik-ingress-lb
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - name: traefik-ingress-lb
        image: traefik
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
  namespace: traefik
  name: traefik-ingress-service
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

最後の部分では、プロジェクトのマイクロサービスごとにサービスを作成する必要があります。ここに例を示します。

apiVersion: v1
kind: Service
metadata:
  namespace: traefik
  name: my-svc-1
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80 
    targetPort: 8080

また、要求を適切なサービスに転送するイングレス(ルールのセット):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: traefik
  name: ingress-ms-1
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - Host: my-address-url
    http:
      paths:
      - backend:
          serviceName: my-svc-1
          servicePort: 80

このイングレスでは、ホストURLを作成しました。これはクラスターのエントリポイントになるため、マスターK8Sノードの名前を解決する必要があります。マスターになるノードがさらにある場合は、ロードバランサーが提案されます(この場合、ホストURLはLBになります)。

kubernetes.io ドキュメンテーションを見て、kubernetesの概念を明確にしてください。 traefik.io も便利です。

これがあなたのお役に立てば幸いです。

10
Nicola Ben

Nicola Benのandswerに加えて、traefikサービスでexternalIPsを定義する必要があります。NicolaBenの手順に従って、サービス "my-svc-1"にexternalIPsセクションを追加するだけです。

apiVersion: v1
kind: Service
metadata:
  namespace: traefik
  name: my-svc-1
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80 
    targetPort: 8080
  externalIPs:
  - <IP_OF_A_NODE>

また、externalIP以外にも定義できます。

2
mmbenyoub