如何在 BareMetal -KinD 中使用 LoadBalancer?

How can I use LoadBalancer in BareMetal -KinD?

我的问题非常简单,与名为 KinD 的 kubernetes 很棒的工具有关。我正在为我的烧瓶应用程序使用 KinD:

import os
import requests
from flask import Flask
from jaeger_client import Config
from flask_opentracing import FlaskTracing

app = Flask(__name__)
config = Config(
    config={
        'sampler':
        {'type': 'const',
         'param': 1},
                        'logging': True,
                        'reporter_batch_size': 1,}, 
                        service_name="service")
jaeger_tracer = config.initialize_tracer()
tracing = FlaskTracing(jaeger_tracer, True, app)

def get_counter(counter_endpoint):
    counter_response = requests.get(counter_endpoint)
    return counter_response.text

def increase_counter(counter_endpoint):
    counter_response = requests.post(counter_endpoint)
    return counter_response.text

@app.route('/')
def hello_world():
    counter_service = os.environ.get('COUNTER_ENDPOINT', default="https://localhost:5000")
    counter_endpoint = f'{counter_service}/api/counter'
    counter = get_counter(counter_endpoint)

    increase_counter(counter_endpoint)

    return f"""Hello, World!

You're visitor number {counter} in here!\n\n"""
FROM python:3.7-alpine
RUN mkdir /app
RUN apk add --no-cache py3-pip python3 && \
    pip3 install flask Flask-Opentracing jaeger-client
WORKDIR /app
ADD ./app /app/
ADD ./requirements.txt /app/
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "/app/main.py"]

deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-flask-deployment
spec:
  selector:
    matchLabels:
      app: my-flask-pod
  replicas: 2
  template:
    metadata:
      labels:
        app: my-flask-pod
    spec:
      containers:
      - name: my-flask-container
        image: yusufkaratoprak/awsflaskeks:latest
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 5000

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-flask-service
spec:
  selector:
    app: my-flask-pod
  ports:
  - port: 6000
    targetPort: 5000
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.10

Configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.42.42.100-172.42.42.105 #Update this with your Nodes IP range 

结果:

一切看起来都很好。当我写我的浏览器时:http://172.42.42.101:6000/

结果:

此外,我想添加我的服务事件。一切看起来都不错:

我还想添加@Kaan Mersin 建议:我添加了 80 作为默认端口。

实际上,对于裸机服务器,您应该使用除 LoadBalancer 之外的其他解决方案来公开您的应用程序,例如 NodePort、Ingress 等。因为 LoadBalancer 服务类型仅适用于 Google、Azure、AWS 等云提供商

查看 LoadBalancer

的官方文档

按照以下方式,认为您使用的是 NodePort 而不是 LoadBalancer,NodePort 服务类型也在 pods 之间负载平衡流量如果您只是期待平衡功能;

您需要从 运行 正在运行容器的主机外部使用 http://172.42.42.101:30160。端口 6000 只能在集群内部使用内部 IP 访问(10.96.244.204 在您的情况下)。每当您公开您的部署时,自动(您也可以手动定义)NodePort 之一(默认在 30000 - 32767 之间)分配给外部请求的服务。

有关服务详情,您需要运行以下命令。命令输出将为您提供 NodePort 和其他详细信息。

kubectl describe services my-service

请查看相关kubernetes documentation

Chrome 抛出的错误是 ERR_UNSAFE_PORT。将您的 Service 端口更改为 80,然后在 SuperUser 上点击 http://172.42.42.101/. Alternatively you can choose any other port you like so long as Chrome doesn't consider it an unsafe port. See this answer 以获取不安全端口列表。