Hiển thị cổng 80 và 443 trên Google Container Engine mà không cần cân bằng tải


23

Hiện tại tôi đang làm việc trong một dự án sở thích nhỏ mà tôi sẽ tạo nguồn mở một khi nó sẵn sàng. Dịch vụ này đang chạy trên Google Container Engine. Tôi đã chọn GCE để tránh rắc rối về cấu hình, chi phí phải chăng và để tìm hiểu những thứ mới.

Các nhóm của tôi đang chạy tốt và tôi đã tạo một dịch vụ với loại LoadBalancerđể hiển thị dịch vụ trên cổng 80 và 443. Điều này hoạt động hoàn hảo.

Tuy nhiên, tôi phát hiện ra rằng đối với mỗi LoadBalancerdịch vụ, bộ cân bằng tải Google Compute Engine mới được tạo. Bộ cân bằng tải này khá đắt và thực sự đã hoàn thành cho một dự án sở thích trong một trường hợp duy nhất.

Để cắt giảm chi phí, tôi đang tìm cách để lộ các cổng mà không cần bộ cân bằng tải.

Những gì tôi đã cố gắng cho đến nay:

Có cách nào để hiển thị cổng 80 và 443 cho một phiên bản duy nhất trên Google Container Engine mà không cần bộ cân bằng tải không?

Câu trả lời:


10

Đúng, thông qua cácIP bên ngoài trên dịch vụ. Dịch vụ ví dụ tôi đã sử dụng:

apiVersion: v1
kind: Service
metadata:
  name: bind
  labels:
    app: bind
    version: 3.0.0
spec:
  ports:
    - port: 53
      protocol: UDP
  selector:
    app: bind
    version: 3.0.0
  externalIPs:
    - a.b.c.d
    - a.b.c.e

Xin lưu ý rằng các IP được liệt kê trong tệp cấu hình phải là IP nội bộ trên GCE.


Cảm ơn! Nhưng tôi nghĩ rằng tôi đã bỏ lỡ một cái gì đó. Dịch vụ này được triển khai nhưng không thể từ internet. Tôi đặt quy tắc tường lửa chính xác. Dịch vụ đang hiển thị chính xácexternalIp
Ruben Ernst

Xin lỗi vì trả lời trễ, quên rằng tôi đã dành thời gian cho cùng một vấn đề. Các IP được liệt kê cần phải là IP bên trong , không phải bên ngoài (Ít nhất là trên GCE).
ConnorJC

Cảm ơn, đó là giải pháp! Thật không may, tôi chưa được phép nâng cấp ... Tôi đã bỏ bình luận này để cho bạn biết rằng câu trả lời này kết hợp với nhận xét ở trên (đó là chìa khóa) đã giải quyết vấn đề của tôi!
Ruben Ernst

1
Bạn có muốn (hoặc @RubenErnst) mở rộng câu trả lời một chút không? Cụ thể, "IP được liệt kê trên GCE phải là IP intrenal". IP của bạn có nghĩa là gì? Bạn có thể làm cho điều này hoạt động với một IP tĩnh được gán cho cụm nút đơn của bạn không?
Brett

@Brett: Xin lỗi vì phản hồi muộn của tôi. Là câu hỏi của bạn đã được trả lời trong khi chờ đợi?
Ruben Ernst

4

Ngoài giải pháp tuyệt vời và hiệu quả của ConnorJC: Giải pháp tương tự cũng được mô tả trong câu hỏi này: Kubernetes - tôi có thể tránh sử dụng GCE Load Balancer để giảm chi phí không?

"InternalIp" đề cập đến ip bên trong của đối tượng tính toán (còn gọi là ip) (như được thấy trên Google Cloud Platform -> Google Compute Engine -> VM Instances)

Nhận xét này đưa ra gợi ý về lý do tại sao nên cấu hình ip bên trong chứ không phải ip bên ngoài.

Hơn nữa, sau khi đã cấu hình dịch vụ cho các cổng 80 và 443, tôi phải tạo quy tắc tường lửa cho phép lưu lượng truy cập đến nút đối tượng của mình:

gcloud compute firewall-rules create your-name-for-this-fw-rule --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

Sau khi thiết lập này, tôi có thể truy cập dịch vụ của mình thông qua http (s): // bên ngoài


Sử dụng IP nội bộ nút đã thực hiện thủ thuật. Như vậy nhầm lẫn với việc đặt tên!
James

1

Nếu bạn chỉ có chính xác một nhóm, bạn có thể sử dụng hostNetwork: trueđể đạt được điều này:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: caddy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: caddy
    spec:
      hostNetwork: true # <---------
      containers:
      - name: caddy
        image: your_image
        env:
        - name: STATIC_BACKEND # example env in my custom image
          value: $(STATIC_SERVICE_HOST):80

Lưu ý rằng bằng cách này, nhóm của bạn sẽ kế thừa trình phân giải DNS của máy chủ chứ không phải Kubernetes '. Điều đó có nghĩa là bạn không còn có thể giải quyết các dịch vụ cụm theo tên DNS. Ví dụ: trong ví dụ trên, bạn không thể truy cập staticdịch vụ tại http: // static . Bạn vẫn có thể truy cập các dịch vụ bằng cụm IP của chúng, được chèn bởi các biến môi trường .

Giải pháp này tốt hơn so với sử dụng dịch vụ bên ngoài của dịch vụ vì nó bỏ qua kube-proxy và bạn sẽ nhận được IP nguồn chính xác.


1

Để tổng hợp các câu trả lời @ConnorJC @ derMikey thành chính xác những gì làm việc cho tôi:

Đưa ra một nhóm cụm chạy trên Trường hợp tính toán động cơ :

gce vm name: gke-my-app-cluster-pool-blah`
internal ip: 10.123.0.1
external ip: 34.56.7.001 # will be publically exposed

Tôi đã thực hiện dịch vụ:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: my-app-service
spec:
  clusterIP: 10.22.222.222
  externalIPs:
  - 10.123.0.1 # the instance internal ip
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: my-app
  type: ClusterIP

và sau đó mở tường lửa cho tất cả (?) ips trong dự án:

gcloud compute firewall-rules create open-my-app --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

và sau đó my-appcó thể truy cập thông qua IP công khai GCE34.56.7.001 (không phải ip cụm)


0

Tôi không thích sử dụng các bộ cân bằng tải đám mây, cho đến khi cần thiết, vì chi phí và nhà cung cấp khóa.

Thay vào đó tôi sử dụng cái này: https://kubernetes.github.io/ingress-nginx/deploy/

Đó là một pod chạy bộ cân bằng tải cho bạn. Trang đó có ghi chú cài đặt cụ thể GKE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.