Я столкнулся с этой проблемой в течение последних 3 дней и до сих пор не могу понять, почему я не могу получить доступ к NodePort за пределами кластера k8s с использованием типа службы NodePort.
В основном я настроил кластер из 3 узлов в rhel8, я следовал этому руководству https://www.tecmint.com/install-a-kubernetes-cluster-on-centos-8/ но столкнулся с некоторыми проблемами в сети Weavenet, поэтому я делаю это снова, но на этот раз с calico.
Вот мой кластер из 3 узлов:
Я установил последнюю версию calico для сетевого аддона, и, как вы можете видеть, все модули kube исправны и работают.
Теперь вот мой файл развертывания
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-k8s
spec:
selector:
matchLabels:
app: hello-k8s
replicas: 1
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- name: spring-boot
image: fuzzy28/hello-k8s:v3
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-k8s-svc
spec:
selector:
app: hello-k8s
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: NodePort
Я развернул его, и он отлично работает в узле, выделенном ниже.
Если мы проверим службу, она работает в порту 32020.
Я открыл порты во всех узлах, используя команду ниже
firewall-cmd --permanent --add-port=30000-32767/tcp
Итак, момент истины, после проверки этого в браузере за пределами кластера k8s, он недоступен. Я пробовал это на всех IP-адресах узлов, но недоступен.
Странно то, что URL-адрес доступен только внутри модуля, из которого он развернут.
Я действительно не понимаю, что здесь происходит, вот мои сетевые интерфейсы на случай, если хотите посмотреть.
Мне потребовалось время, чтобы выяснить, что является наиболее вероятной причиной проблемы. Оказывается, начиная с выпуска RHEL 8 iptables
устарели и nftables
являются его новой заменой.
38.2. Когда использовать firewalld, nftables или iptables
iptables
: Theiptables
полезность устарел в Red Hat Enterprise Linux 8. Используйте вместоnftables
.
Сеть Kubernetes использует iptables
и это несовместимо с nftables
.
Я пытался решить вашу проблему, отключив firewalld
и nftables
, и заставьте rhel8 использовать вместо этого iptables, но он все равно не решил всех проблем с подключением в кластере.
Похоже, лучшее, что вы можете сделать на данный момент, - это использовать старую версию rhel. Дайте мне знать, если у вас возникнут дополнительные вопросы.