Я установил Kubernetes с помощью kubeadm, голого металла на экземплярах Ubuntu Linux. Это экземпляры на GCE, но я не использую конкретную собственную кластерную службу GKE. Каждый экземпляр (как узел) имеет статический внешний IPv4-адрес. Я пытаюсь сделать сервис доступным извне, используя вход. Я пробовал MetalLB или перенаправление портов, но не могу заставить его работать. В первом случае, похоже, требуется ввод адресов по запросу, чего у меня нет.
Есть ли рекомендуемый способ заставить LoadBalancing работать со статическими внешними IP-адресами?
Я думаю, что основной причиной этой проблемы является конфигурация брандмауэра
. Вы можете подключиться к кластеру несколькими способами. Ниже я приведу вам примеры методов NodePort
.
Предположим, что кластер Kubernetes настроен правильно (с CNI
, Docker, Kubeadmbootstrap, taints и т. д.).
Вы можете использовать приведенный ниже пример для создания модулей hello-app
, которые будут реагировать на ваш трафик:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-1
spec:
replicas: 1
selector:
matchLabels:
key: application-1
template:
metadata:
labels:
key: application-1
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
NodePort
.Вы используете экземпляр GCE, поэтому ваша виртуальная машина уже имеет статический ExternalIP
.
Hello-app
было развернуто на предыдущем шаге, теперь вам нужно предоставить его с помощью service
типа NodePort
apiVersion: v1
kind: Service
metadata:
name: service-one
spec:
type: NodePort
selector:
key: application-1
ports:
- port: 80
targetPort: 8080
По умолчанию брандмауэр блокирует входящие запросы на порты. которые не занесены в белый список. Вам нужно будет создать правило, которое позволит трафику входить на определенные порты (например, 31085
). Для получения дополнительной информации см. Настройка правил брандмауэра.
Вы можете сделать это по следующему пути:
Меню навигации
> Сеть VPC
> Брандмауэр
> Создать правило брандмауэра
.
Вы можете создать правило, которое разрешает:
NodePort
например 31085
30000-32767
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 50m
service-one NodePort 10.110.184.238 <none> 80:31085/TCP 5m53s
Для доступа к вашему кластеру вы можете используйте
$ curl ExternalNodeIP:NodePort
$ curl 35.246.148.237:31085
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-v5826
Если вы не создадите FirewallRule для этого NodePort
, вывод curl будет следующим:
curl: (7) Failed to connect to 35.246.148.237 port 31085: Connection refused
При использовании Nginx Ingress
вы можете использовать:
Вы можете развернуть Nginx BareMetal, используя:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
Он создаст службу Nginx
как тип NodePort
. Это очень похоже на предыдущий метод, но разница в том, что ваши сервисы могут быть типа ClusterIP
и NodePort
.
С помощью этого метода можно применить Ingress для предоставления доступа к более чем 1 службе.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /one
backend:
serviceName: service-one
servicePort: 80
- path: /two
backend:
serviceName: service-two
servicePort: 80
$ kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service-one ClusterIP 10.106.21.3 <none> 80/TCP 2m4s
default service-two ClusterIP 10.105.161.86 <none> 80/TCP 2m2s
ingress-nginx ingress-nginx-controller NodePort 10.110.149.194 <none> 80:31337/TCP,443:30417/TCP 6m31s
ingress-nginx ingress-nginx-controller-admission ClusterIP 10.98.15.73 <none> 443/TCP 6m31s
### Output:
$ curl 35.246.148.237:31337/one
Hello, world!
Version: 1.0.0
Hostname: deployment-1-77ddb77d56-v5826
curl 35.246.148.237:31337/two
Hello, world!
Version: 2.0.0
Hostname: deployment-2-fb984955c-8pfls