GCP Могу ли я открыть внешний IP-адрес кластера Kubernetes без LoadBalancer?

Я хотел бы поддерживать очень недорогой кластер Kubernetes на GCP. Я использую единый пул узлов e1-small. Ежемесячная стоимость этого экземпляра составляет 4,91 доллара, и это нормально. Но проблема в том, что я использую для доступа к портам моего узла внешний IP-адрес. Во входящем экземпляре используется балансировщик нагрузки Google, который стоит около 18 долларов. Поэтому я в основном плачу за бесполезный балансировщик нагрузки, который мне действительно не нужен. Есть ли способ раскрыть IP-адреса этих экземпляров без балансировщика нагрузки?


person Dogacel    schedule 21.04.2021    source источник
comment
Вы можете открыть свой сервис с помощью nodeport и напрямую перепрограммировать его. Однако, если вам нужно использовать входящий контроллер, вы должны использовать балансировщик нагрузки или управлять своим входящим контроллером в своем кластере (например, на основе NGINX).   -  person guillaume blaquiere    schedule 21.04.2021
comment
@guillaumeblaquiere Но я хочу специально открыть порт 80 для внешнего IP. У меня есть доменное имя, и я назначаю ему порт 80. Есть ли способ привязать EXTERINAL_IP: 32322 к порту 80 моего домена domain.com?   -  person Dogacel    schedule 21.04.2021
comment
Вы определяете свои порты в файлах yaml развертывания, обслуживания и входа.   -  person Poopy McFartnoise    schedule 07.05.2021


Ответы (3)


Если вы открываете nodePort извне, вы откроете номер порта 10k +. Так что не порт 80 или 443 для веб-сайта. Вам необходимо проксировать соединение, например, с помощью балансировщика нагрузки.

Решение - использовать Cloud Run в качестве обратного прокси, например, с NGINX. В этом случае вы также можете использовать бессерверный соединитель VPC и подключиться к службе через частный IP-адрес в вашем VPC.

person guillaume blaquiere    schedule 21.04.2021

Привет, я понимаю, что вы изучаете различные способы предоставить вам услугу k8s для внешнего ip. По сути, существует 5 типов услуг. ClusterIP (по умолчанию), NodePort, LoadBalancer, ExternalName, Headless, вы можете выбрать один из следующих вариантов, который может быть наиболее подходящим в зависимости от типа используемой вами службы. Следующие документы помогут вам, предоставив подробные сведения об этом. https://cloud.google.com/kubernetes-engine/docs/concepts/service#types_of_services, https://cloud.google.com/kubernetes-engine/docs/how-to/exposing-apps,

person Prabhu Ram Muralidharan    schedule 07.05.2021

Добавьте репозиторий ingress-nginx

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

Используйте Helm для развертывания контроллера входящего трафика NGINX

helm install $NGINX ingress-nginx/ingress-nginx \
    --namespace $NAMESPACE \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeSelector."beta\.kubernetes\.io/os"=linux

Это ваш балансировщик нагрузки.

А теперь заведите себе диспетчер сертификатов ...

Отметьте пространство имен, чтобы отключить проверку ресурсов

kubectl label -n $NAMESPACE cert-manager.io/disable-validation=true

Добавить репозиторий Jetstack Helm

helm repo add jetstack https://charts.jetstack.io

Установите Helm-диаграмму cert-manager

helm install cert-manager jetstack/cert-manager \
  --namespace $NAMESPACE \
  --set installCRDs=true \
  --set nodeSelector."kubernetes\.io/os"=linux \
  --set webhook.nodeSelector."kubernetes\.io/os"=linux \
  --set cainjector.nodeSelector."kubernetes\.io/os"=linux

Затем вам нужно добавить CA Cluster Issuer ...

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: $EMAIL_ADDRESS
    privateKeySecretRef:
      name: letsencrypt
    solvers:
    - http01:
      ingress:
        class: nginx
          podTemplate:
            spec:
              nodeSelector:
                "kubernetes.io/os": linux

Применить CA Cluster Issuer

kubectl apply -f cluster-issuer.yaml

Вам также понадобится входной и служебный yaml.

Ingress

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: $INGRESS_NAME
  namespace: $NAMESPACE
  labels:
    app.kubernetes.io/part-of: $NAMESPACE
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/use-regex: "true"
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  tls:
    - hosts:
      - $YOUR_DOMAIN
      secretName: tls-secret
  rules:
  - host: $YOUR_DOMAIN
    http:
      paths:
      - backend:
          serviceName: $SERVICE_NAME
          servicePort: $SERVICE_PORT

Услуга

apiVersion: v1
kind: Service
metadata:
  name: $SERVICE_NAME
  namespace: $NAMESPACE
  labels:
    app.kubernetes.io/part-of: $NAMESPACE
    app.kubernetes.io/type: service
spec:
  type: ClusterIP
  ports:
  - name: fart
    port: $SERVICE_PORT
    targetPort: $SERVICE_PORT
  selector:
    app.kubernetes.io/name: $DEPLOYMENT_NAME
    app.kubernetes.io/part-of: $NAMESPACE

Развертывание этих ресурсов не должно стоить больше.

Если вас так беспокоят затраты, вы можете развернуть полностью функционирующий и общедоступный кластер локально с помощью minikube или micro-k8s.

person Poopy McFartnoise    schedule 07.05.2021