イングレスの展開は、高可用性
公式ウェブサイトのアドレスhttps://kubernetes.github.io/ingress-nginx/deploy/
イングレス振り付けファイルを取得します。
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
ノードラベルを追加します。
kubectl label node k8snode1 ingresscontroller=true
kubectl get nodes --show-labels
添付ファイル:
- 削除ラベル
kubectl label node k8snode1 ingresscontroller-
- 更新ラベル
kubectl label node k8snode1 ingresscontroller=false --overwrite
1、展開がDaemonSetあり、変更、およびコピー数をコメントアウト
kind: DaemonSet
#replicas: 1
2、hostNetworkネットワークを有効にし、指定されたノードを実行します
関連事業、このノードのホストノードは、このアプリケーションがポートを介してアクセス可能なネットワーク上の他のホストのホストへの進入、nginxのコントローラポートのhostNetwork露光。
Ingresscontrollerは=真タグを加えた指定されたノードnodeSelector前
hostNetwork: true
nodeSelector:
ingresscontroller: 'true'
3、ミラーアドレスの変更
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.24.1
図4に示すように、修飾されたコンテナ港
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
- --http-port=88 #默认80
- --https-port=4433 #默认443
ports:
- name: http
containerPort: 88 #更改为88
- name: https
containerPort: 4433 #更改为4433
図5に示すように、マスタノード耐性を増加させます
tolerations: #增加容忍,可分配到master节点
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
6、mandatory.yamlは、以下の
vim mandatory.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- nodes
- pods
- secrets
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- apiGroups:
- ""
resources:
- services
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- "extensions"
- "networking.k8s.io"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
- "networking.k8s.io"
resources:
- ingresses/status
verbs:
- update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
# Defaults to "<election-id>-<ingress-class>"
# Here: "<ingress-controller-leader>-<nginx>"
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
- "ingress-controller-leader-nginx"
verbs:
- get
- update
- apiGroups:
- ""
resources:
- configmaps
verbs:
- create
- apiGroups:
- ""
resources:
- endpoints
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: nginx-ingress-role-nisa-binding
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: nginx-ingress-role
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-nisa-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
# wait up to five minutes for the drain of connections
terminationGracePeriodSeconds: 300
serviceAccountName: nginx-ingress-serviceaccount
hostNetwork: true
nodeSelector:
ingresscontroller: 'true'
tolerations: #增加容忍,可分配到master节点
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
containers:
- name: nginx-ingress-controller
image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.24.1
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
- --http-port=88 #默认80
- --https-port=4433 #默认443
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 88 #更改为88
- name: https
containerPort: 4433 #更改为4433
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
テスト
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-static
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-static
labels:
name: nginx-static
spec:
replicas: 1
template:
metadata:
labels:
name: nginx-static
spec:
containers:
- name: nginx-static
image: nginx:latest
volumeMounts:
- mountPath: /etc/localtime
name: vol-localtime
readOnly: true
ports:
- containerPort: 80
volumes:
- name: vol-localtime
hostPath:
path: /etc/localtime
---
apiVersion: v1
kind: Service
metadata:
name: nginx-static
labels:
name: nginx-static
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
selector:
name: nginx-static
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: submodule-checker-ingress
spec:
rules:
- host: nginx.weave.pub
http:
paths:
- backend:
serviceName: nginx-static
servicePort: 80
kubectl create -f nginx-static.yaml
アクセス
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.x.x.x master1 nginx.test.pub
10.x.x.x master2
[root@master1 ingress]# curl nginx.test.pub
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
1.1のIngressプロフィール
1.1.1デマンド
ポート:corednsは、ドメイン名ポッド、外部サービス場合は、サービスにアクセスするために必要、対応するNodeIPにアクセスする必要の間で達成されます。サービスが増加した後ただし、ホストポートを指定するNodePortの必要性のために、より多くのポートは管理が困難になります。したがって、この場合には、進入がより適切なサービスを公開使います。
1.1.2進入コンポーネント説明
リバースプロキシ、ロードバランサ、イングレスコントローラー、イングレス:イングレスの使用は一般的に3つの要素を持っています
図1に示すように、リバースプロキシロードバランサ
プロキシロードバランサは非常に簡単ですリバース、それはnginxのを意味し、apacheのミドルウェアは、新しいK8Sはありません別の展開nginxのよう、あなただけのIngressコントローラーを展開する必要があり、一つの成分の中に進入コントローラとのnginxのを持っています。リバースプロキシ、ロードバランサを自由にクラスタにデプロイすることができ、あなたが途中でそうレプリケーションコントローラー、展開、DaemonSetを使用することができます
2、イングレス・コントローラ
イングレスコントローラは、基本的なアドオンとして、など常にkubernetesのAPIを扱う、リアルタイム知覚バックエンドサービス、変更ポッドによってモニター、進入コントローラとして理解し、ポッド、サービスおよびその他の増減を減らすことが、これらの変更は、情報を取得するとき後に、イングレスコントローライングレスの再結合は、以下の構成を生成し、その後、リバースプロキシ、ロードバランサを更新し、その設定を更新し、サービスディスカバリの役割に
3、イングレス
このルールは入力コントローラに結合し、およびコントローラ入口の動的ライトこれに、例えば、サービスときにドメインの要求に転送サービス、すなわち、に対応するドメイン名、入口は、上記で定義されたルールを理解するための簡単です全体的なサービスの発見を達成するため、負荷分散でのロードバランサの設定
下に示すように、全体の関係:
あなたは明らかに上の画像から見ることができ、要求は実際に、どのサービスに、そのサービスを通じて、ドメイン名の対応とその相互作用を介して、その後のIngressイングレスコントローラは、APIのkubernetesと対話するためにこのようなnginxのように来たか、ロードバランサをブロックされました住所やその他の情報は、サービスの発見、すなわち動的なマッピングを実現することができ、ルールをリロードし、その後、リアルタイムのロードバランサ、ロードバランサの後に書かれており、総合的なプロファイルを生成します。
3.1.3 nginxの-イングレスの作品
入力コントローラと知覚入力クラスタに対話、動的ルールの変更を介してAPIをkubernetes、それを読んで、カスタムルールのルールに従って、いくつかのnginxの設定を生成対応するドメインネームサービスのどれを記載しており、次いでnginx-を書い構成を検証するためにそれを再読み込み、その後そして、実行nginxのサービスにおけるポッドの進入コントローラは、コントローラが書き込み/etc/nginx.conf nginxの設定ファイルを生成する場所のポッド入力制御。設定され、動的に更新サブドメイン名を達成するために。
説明:別の開発会社に基づいて入力コントローラnginxのサービスに基づいては、に分かれています。
- K8Sコミュニティアングル - nginxの(https://github.com/kubernetes/ingress-nginx)
- nginxののnginxの-イングレス(https://github.com/nginxinc/kubernetes-ingress)
3.2.4イングレスコントローラの高可用性アーキテクチャ
クラスタトラフィックアクセス層として、イングレスコントローラの高可用性が特に重要であり、高可用性、我々は最初の問題を解決しなければならない単一障害点で、一般的に使用される方法は、展開の複数のコピーを使用することで、我々は、高可用性のIngressコントローラー・クラスターに接続Kubernetesを展開ビジネスアプリケーションやサービスリソースのための進入競争の発生を回避するために、クラスタトラフィックのアクセスポート、排他的Ingressノードの提案方法、など、と理由イングレスのマルチノード展開アーキテクチャの同じ層に。
図配備アーキテクチャ上述したように、入口は、容量Ingressノードスケーリングのレベルに基づいてトラフィックの後端部が、入口流れ統合アクセス層排他的キャリアクラスタインスタンスの複数。お使いのクラスタサイズが大きい早期にない場合はもちろん、それも仕方のIngressサービスアプリケーションミックスや事業部門を使用しますが、リソースの制約との分離を推奨することができます。