Я пытаюсь публично раскрыть панель управления kubernetes через вход в единый мастер-кластер. Проблема в том, что служба LoadBalancer (nginx ingress controller), которую я использую, не открывает порты 80/443, которые я ожидаю открыть / использовать. Вместо этого требуется несколько случайных портов из диапазона 30-32 КБ. Я знаю, что могу установить этот диапазон с помощью --service-node-port-range
, но я совершенно уверен, что мне не нужно было делать это год go на другом сервере. Я что-то здесь упускаю?
В настоящее время это мой стек / установка (чистая установка Ubuntu 16.04):
- Nginx Ingress Controller (устанавливается через helm)
- MetalLB
- Kubernetes Dashboard
- Kubernetes Dashboard Ingress для его открытого развертывания на
<domain>
- Cert-Manager (установлен через шлем)
k8s-dashboard-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
# add an annotation indicating the issuer to use.
cert-manager.io/cluster-issuer: letsencrypt-staging
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/secure-backends: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
name: kubernetes-dashboard-ingress
namespace: kubernetes-dashboard
spec:
rules:
- host: <domain>
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 443
path: /
tls:
- hosts:
- <domain>
secretName: kubernetes-dashboard-staging-cert
Вот как выглядит мой kubectl get svc -A
:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cert-manager cert-manager ClusterIP 10.101.142.87 <none> 9402/TCP 23h
cert-manager cert-manager-webhook ClusterIP 10.104.104.232 <none> 443/TCP 23h
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d6h
ingress-nginx nginx-ingress-controller LoadBalancer 10.100.64.210 10.65.106.240 80:31122/TCP,443:32697/TCP 16m
ingress-nginx nginx-ingress-default-backend ClusterIP 10.111.73.136 <none> 80/TCP 16m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 6d6h
kubernetes-dashboard cm-acme-http-solver-kw8zn NodePort 10.107.15.18 <none> 8089:30074/TCP 140m
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.228.215 <none> 8000/TCP 5d18h
kubernetes-dashboard kubernetes-dashboard ClusterIP 10.99.250.49 <none> 443/TCP 4d6h
Вот еще несколько примеров о том, что происходит:
curl -D- http://<public_ip>:31122 -H 'Host: <domain>'
- возвращает 308, поскольку протоколом является http, а не https. Ожидается
curl -D- http://<public_ip> -H 'Host: <domain>'
curl: (7) Failed to connect to <public_ip> port 80: Connection refused
- порт 80 закрыт
curl -D- --insecure https://10.65.106.240 -H "Host: <domain>"
- Очевидно, что достижение приборной панели через внутренний IP-адрес работает, и я получаю правильную k8s-приборную панель html.
--insecure
из-за того, что шифрование Let's еще не работает, так как вызов acme для порта 80 недоступен.
Итак, подведем итоги. получить 2.
работает? Например, доступ к сервису через 80/443?
РЕДАКТИРОВАТЬ: Nginx Ingress Controller .yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2020-02-12T20:20:45Z"
labels:
app: nginx-ingress
chart: nginx-ingress-1.30.1
component: controller
heritage: Helm
release: nginx-ingress
name: nginx-ingress-controller
namespace: ingress-nginx
resourceVersion: "1785264"
selfLink: /api/v1/namespaces/ingress-nginx/services/nginx-ingress-controller
uid: b3ce0ff2-ad3e-46f7-bb02-4dc45c1e3a62
spec:
clusterIP: 10.100.64.210
externalTrafficPolicy: Cluster
ports:
- name: http
nodePort: 31122
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 32697
port: 443
protocol: TCP
targetPort: https
selector:
app: nginx-ingress
component: controller
release: nginx-ingress
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 10.65.106.240
РЕДАКТИРОВАТЬ 2: metallb configmap yaml
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 10.65.106.240-10.65.106.250