Ubuntu仮想マシンでkubeadm(v1.18)を使用してk8sクラスターをセットアップしました。次に、イングレスコントローラーを追加する必要があります。私はnginxを採用することに決めました(しかし、他のソリューションについてはオープンです)。 docs のセクション「bare-metal」に従ってインストールしました。
_kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.31.1/deploy/static/provider/baremetal/deploy.yaml
_
インストールは私には問題ないようです:
_kubectl get all -n ingress-nginx
_
_NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-admission-create-b8smg 0/1 Completed 0 8m21s
pod/ingress-nginx-admission-patch-6nbjb 0/1 Completed 1 8m21s
pod/ingress-nginx-controller-78f6c57f64-m89n8 1/1 Running 0 8m31s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller NodePort 10.107.152.204 <none> 80:32367/TCP,443:31480/TCP 8m31s
service/ingress-nginx-controller-admission ClusterIP 10.110.191.169 <none> 443/TCP 8m31s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 1/1 1 1 8m31s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-78f6c57f64 1 1 1 8m31s
NAME COMPLETIONS DURATION AGE
job.batch/ingress-nginx-admission-create 1/1 2s 8m31s
job.batch/ingress-nginx-admission-patch 1/1 3s 8m31s
_
しかし、カスタムIngressを適用しようとすると、次のエラーが発生します。
Error from server (InternalError): error when creating "yaml/xxx/xxx-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: Temporary Redirect
何が間違っているのでしょうか?
DNSの疑いがありますが、他のNodePortサービスは期待どおりに機能し、DNSはクラスター内で機能します。
ドキュメントはこちら に記載されているdefault-http-backendがないことだけがわかります。ただし、 this thread によると、これは私の場合は正常なようです。
最後に重要なこととして、私は マニフェストによるインストール (以前のインストールからingress-nginx名前空間を削除した後)と Helmチャートによるインストール も試しました。同じ結果になります。
私はほとんどk8sの初心者で、これが私の遊び場クラスターです。そのため、クラスター全体を最初からセットアップする必要がない限り、代替ソリューションにも対応できます。
更新:「カスタムIngressを適用する」とは、つまり、_kubectl apply -f <myIngress.yaml>
_
MyIngress.yamlのコンテンツ
_apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /someroute/fittingmyneeds
pathType: Prefix
backend:
serviceName: some-service
servicePort: 5000
_
最後に、インストール方法を変更して、Ingress Nginxを適切に実行することができました。以前のインストールが機能しなかった理由はまだわかりませんが、それでも解決策と、元の問題に対するいくつかの洞察を共有します。
ソリューション
Ingress nginxのアンインストール:ingress-nginx名前空間を削除します。これは検証するwebhook設定を削除しません-これを手動で削除します。次に、MetalLBをインストールし、イングレスnginxを再度インストールします。 Helm安定版リポジトリのバージョンを使用しました。これですべてが期待どおりに動作します。 Kubernetes SlackチャンネルのLongに感謝します。
元の問題に対するいくつかの洞察
インストールガイド によって提供されるyamlには、ValidatingWebHookConfigurationが含まれています。
apiVersion: admissionregistration.k8s.io/v1beta1
kind: ValidatingWebhookConfiguration
metadata:
labels:
helm.sh/chart: ingress-nginx-2.0.3
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.32.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: admission-webhook
name: ingress-nginx-admission
namespace: ingress-nginx
webhooks:
- name: validate.nginx.ingress.kubernetes.io
rules:
- apiGroups:
- extensions
- networking.k8s.io
apiVersions:
- v1beta1
operations:
- CREATE
- UPDATE
resources:
- ingresses
failurePolicy: Fail
clientConfig:
service:
namespace: ingress-nginx
name: ingress-nginx-controller-admission
path: /extensions/v1beta1/ingresses
Ingressを作成または更新するたびに検証が実行されます(私のIngress.yamlの内容は関係ありません)。サービスを呼び出すときの応答は一時的なリダイレクトであるため、検証は失敗しました。理由はわかりません。対応するサービスは次のとおりです。
apiVersion: v1
kind: Service
metadata:
labels:
helm.sh/chart: ingress-nginx-2.0.3
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.32.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller-admission
namespace: ingress-nginx
spec:
type: ClusterIP
ports:
- name: https-webhook
port: 443
targetPort: webhook
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
セレクターに一致するポッドは、次のデプロイメントに由来します。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
helm.sh/chart: ingress-nginx-2.0.3
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 0.32.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
containers:
- name: controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.32.0
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --ingress-class=nginx
- --configmap=ingress-nginx/ingress-nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 3
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
- name: webhook
containerPort: 8443
protocol: TCP
volumeMounts:
- name: webhook-cert
mountPath: /usr/local/certificates/
readOnly: true
resources:
requests:
cpu: 100m
memory: 90Mi
serviceAccountName: ingress-nginx
terminationGracePeriodSeconds: 300
volumes:
- name: webhook-cert
secret:
secretName: ingress-nginx-admission
この検証チェーンのどこかに問題があります。何を、なぜ、知っておくのは興味深いでしょうが、MetalLBソリューションを引き続き使用できます。このソリューションには検証用のWebhookがまったく含まれていないことに注意してください。
この問題は解決しました。問題は、Kubernetesバージョン1.18を使用しているが、現在のingress-NginxのValidatingWebhookConfigurationが最も古いAPIを使用していることです。ドキュメントを参照してください: https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites
Kubernetesクラスタが少なくともv1.16(admissionregistration.k8s.io/v1を使用)、またはv1.9(admissionregistration.k8s.io/v1beta1を使用)と同じくらい新しいことを確認します。
そして現在のyamlでは:
# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml
# before changing this value, check the required kubernetes version
# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites
apiVersion: admissionregistration.k8s.io/v1beta1
とルールで:
apiVersions:
- v1beta1
したがって、v1で変更する必要があります。
apiVersion: admissionregistration.k8s.io/v1
ルール-v1を追加します。
apiVersions:
- v1beta1
-v1
変更して再デプロイした後-カスタムIngressサービスが正常にデプロイされます