生産環境、外部被ばくと進入ロードバランササービスのK8Sクラスタは、2つの方法で、主に以下のとおりです。
- ロードバランサは:クラウドは、サポートする能力IPVSのiptables /に頼って、ある機能のバランスを使用K8Sサービス負荷を、必要性をベンダー、それは、種々のプロトコルのために使用することができます
- 入口:比較的柔軟でのみHTTP / HTTPSプロトコル、付加サービスの必要性、ならびにこのシナリオでは、リバースプロキシ入力コントローラ、nginxのリバースプロキシに使用リバースプロキシサーバを介して負荷分散はK8Sの時代に、よく知られています、あったnginxの入コントローラのnginxの+入力の組み合わせである、入力コントローラは、構成変更が再起動nginxの場合には、入口リソースのnginxの構成を生成する責任があります。、再起動する必要があり、また一つとして含む入力コントローラに対応するクラウドネイティブリバースプロキシtraefik、されており、動的アウェアルーティングルールを変更することができます。
traefikは比較的新しいリバースプロキシ、インターネット関連情報が特に豊富ではないです、K8Sダッシュボードに成功した訪問の前に数日間の研究では、このレコード内の重要なポイントの一つとなります。
インストールtraefik
使用ヘルムのインストール、使用traefik 1.7.19最新チャート:
helm install stable/traefik -f traefik-values.yaml
traefik-values.yaml:
rbac:
enabled: true
dashboard:
enabled: true # 启用traefik dashboard
ingress:
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
deployment:
hostPort:
httpEnabled: true # traefik pod所在node上开启80端口
httpsEnabled: true # traefik pod所在node上开启443端口
dashboardEnabled: true # traefik pod所在node上开启8080端口,共traefik dashboard使用
ssl:
insecureSkipVerify: true # frontend不验证https的benkend
enabled: true # 启用https入口
extraVolumes:
- name: traefik-ssl
hostPath:
path: /share/k8s/traefik/ssl # 其中存放https入口的证书和key,名字必须为tls.crt,tls.key
type: DirectoryOrCreate
extraVolumeMounts:
- name: traefik-ssl
mountPath: /ssl # traefik pod从/ssl目录读取上述tls.crt,tls.key
詳細な設定方法を参照してください公式文書を次のように、上記のキーポイントは以下のとおりです。
- HTTPS入口K8Sによって提供ssl.enabled = trueの場合、証明書および鍵、ローカルディレクトリからノードによって、上記したノードの実施形態では、各ノードの第1ノードとプット証明書キーにポッドを取り付ける、より良い方法を開い秘密は、その秘密を作成するために、ポッドを搭載します
- どのように玄関へのアクセスに、私は、あなたがHTTP経由で、どこノードポッドを通じて入り口にアクセスすることができ、ノード上の開いているポートを介していた:// nodeipまたはhttps:// nodeip、あなたもそうでhttp、サービスのNodePortタイプを使用することができます。 //任意の-nodeip:HTTP-nodeportまたはhttps://任意の-nodeip:HTTPS-nodeportアクセス、値セットのサービス種別:nodePort
- 私はデフォルトの名前を使用するルールに一致PathPrefixStripルートはホストの試合です
traefikのダッシュボードが有効になっているため、インストールが自動的に進入のダッシュボードtraefikを作成します。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
labels:
app: traefik
chart: traefik-1.82.1
heritage: Tiller
release: traefik
name: traefik-dashboard
namespace: default
spec:
rules:
- host: traefik.example.com
http:
paths:
- backend:
serviceName: traefik-dashboard
servicePort: dashboard-http
ラベルアプリによってtraefik:侵入traefikの必要な認識を選択します。あなたは進入ノートがタグを含む追加しました。注釈およびホスト上の値から導出されています。私がホストをしたくないので、次のように、そうPathPrefixStripルーティングルールを使用し、私は上記の侵入を変更しました:
spec:
rules:
- http:
paths:
- backend:
serviceName: traefik-dashboard
servicePort: dashboard-http
path: /traefik
HTTPを使用している場合よう:// nodeip / traefikノードはまた、ダッシュボードのポートを開き、またはHTTP経由するので、ダッシュボードにアクセスすることができます:// nodeip:8080訪問。
K8Sダッシュボード演技
最新K8Sダッシュボード(V2.0.0-beta6)はkubernetes・ダッシュボードの名前空間をマウント:
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.254.238.13 <none> 8000/TCP 21d
kubernetes-dashboard LoadBalancer 10.254.253.226 <pending> 443:30223/TCP 21d
増加した侵入:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
labels:
app: traefik
name: kubernetes-dashboard
namespace: default
spec:
rules:
- http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 443
path: /k8s
HTTPSプロキシのバックエンド
K8Sダッシュボードは、唯一の最初の質問は、バックエンドのルーティングへのフロントエンドは、以下の状況をどのように表示されるか立ち往生HTTPSプロキシサービスで、HTTPSアクセスをサポートしています。
HTTP-> HTTP
HTTP-> HTTPS
https-> HTTP
https-> HTTPS
バックエンドがhttps、あるときかフロントエンドHTTPまたはHTTPS、あること、2及び4は、500エラーが報告されます、検証することができないため、フロントエンド、バックエンド、今回のソリューション:
- insecureSkipVerifyを設定し、これは常にセットリダイレクトはhttpsを使用して最善の方法のフロントエンドである場合、これは、比較的簡単ですどちらか
- どちらの設定入口TLS、TLS証明書情報の設定]ホスト
セットinsecureSkipVerify方法私が使用していました。一般的には最良の方法は、バックエンドのhttps重要でないかどうか、そして、TLSを終了し、httpsを使用常に入り口を使用することです。
異なる名前空間のサービスを代行
名前空間全体で上記の問題を解決した後、次の出会いK8Sダッシュボードサービスすることはできません赤でtraefikダッシュボードディスプレイのアクセスの問題、デフォルトの名前空間にデフォルトでインストールさヘルムtraefikはむしろK8Sダッシュボードがkubernetes、ダッシュボードの名前空間を搭載しているため、あなたはアクセスできないサービスに、解決策:
同じスペースに設置traefikとK8Sダッシュボードのどちらか
ExternalNameによってデフォルトの名前空間へのダッシュボードサービスのどちらか
apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard namespace: default spec: ports: - name: https port: 443 protocol: TCP targetPort: 443 sessionAffinity: None type: ExternalName externalName: kubernetes-dashboard.kubernetes-dashboard.svc.cluster.local
ExternalName方法私が使用していました。完全なドメインネームサービスがservicename.namespace.svc.cluster.localで、cluster.local kubeletが設定されています。
パスルーティングに基づいて、
サービスが訪問することができますが、登場MIMEタイプがサポートされたスタイルシートのMIMEタイプのエラーではありません。
当初、私はそれがtraefikだと思ったにREPONSEヘッダにX-Content-Typeの-オプションに参加しました:nosniffが、traefikのデフォルトが追加されていません発見しました。
最後に私がホストを使用していない、唯一の入力パスルーティングを使用して、URLパスを発見しました。
使用しているときのhttps:とき// nodeip / K8SアクセスK8Sダッシュボード、ルーティングルールはPathPrefixStripをしているので、バックエンドの要求にはhttps:// nodeip、その後、自宅を取得し、ファイル名がK8S、CSSのメインページK8S、JS、であるなど要求URLがhttpsであるように、ファイル・パスは、現在のドキュメントのパスからの相対である://nodeip/xxx.cssは、あなたは、道路、上記のエラーのルールに一致していません。
すべての通常の// nodeip / K8S /アクセスダッシュボード、:あなたは、httpsを使用した場合。
だから、家の定義の中で特定のルートに一致するパスを使用して、リスク、およびリソース・パスがあります:
ホームページ、CSS、JSおよびその他のリソースパス定義された方法 | 説明 |
---|---|
ベースではなく、リソースへのパス./または../および/または冒頭に定義されていない か <base href="./"> で始まるリソースパスを./ |
1.マッチ/パス、HTTPSのみを介し:// XXXX /パス/アクセス 2.マッチ/パス、およびHTTPSを介して後端サブ/、このときにリダイレクト:// XXXX /パス/またはhttps:// XXXX /パスがアクセスすることができます |
<base href="/"> 、リソースのパスではないと./または../または/始まります |
一致/他のパスが機能していない一致しただけ な単眼として、実際に遭遇したように、Aの状況を |
最良一致させる方法やホストルートので。
ダッシュボードの認定
上記の問題点を理解した後、最後にダッシュボードのログイン画面へ:
最初に私には、HTTPの入り口を使用した、トークン着陸アプローチを使用して、応答がない、ビューのツールの開発を通して、使用中の問題を見つけるのhttp入り口、ヘッダはjweTokenを運ばない、認証が失敗した場合、あなたはhttpsの入り口を使用する必要があります。
あるkubectlプロキシの採用、前にリコールhttp://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
も着陸ではないが、実際には、同じ問題です。
HTTPを使用入学着陸に失敗しました:
httpsのエントリを使用する場合は、jweTokenは、着陸の成功を運んでいます。
)
だから、決定的なセットのフロントエンドは常にHTTPS、値がtraefik.ingress.kubernetes.io/redirect-entry-point増加:HTTPS、そして指揮は、アップグレード進入自身のニーズに独自の変更を増やします:
dashboard:
enabled: true
ingress:
annotations:
traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
traefik.ingress.kubernetes.io/redirect-entry-point: https
# 不要使用ingress.kubernetes.io/ssl-redirect: "true",因为会丢掉path
かどうかは、そのような使用のhttp:// nodeip / K8S /またはhttps:// nodeip / K8S /成功裏に着陸することができます。
ようこそ忠パンさんのブログ