AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1023980
Accepted
aFku
aFku
Asked: 2020-07-05 01:28:17 +0800 CST2020-07-05 01:28:17 +0800 CST 2020-07-05 01:28:17 +0800 CST

Kubernetes,http访问集群中的应用程序

  • 772

我对 Kubernetes 很陌生。我需要一些建议如何访问部署在集群中的应用程序。

我有一个带有 Django 应用程序和 Gunicorn 的 docker 映像来运行 .wsgi。我正在使用此映像在具有 3 个节点的集群中部署容器(学习 k8s 的环境,1 个 master 2 个 worker)。如果我使用 nodePort 公开服务并使用 curl <node'sIP>:[port],从不包含在集群中的服务器,我可以访问应用程序。

但是现在我想要一个单一的入口点,它可以与任何副本连接。

我想过再创建一台机器,不包含在安装了 Nginx 或 HAproxy 的集群中,但我找不到任何解决方案如何将外部反向代理与 kubernetes 服务连接。

你能给我更好的解决方案,或者建议我如何继续我的想法吗?

http load-balancing reverse-proxy docker kubernetes
  • 2 2 个回答
  • 865 Views

2 个回答

  • Voted
  1. Sam Cogan
    2020-07-06T04:04:59+08:002020-07-06T04:04:59+08:00

    您缺少一些我建议您查看的基本 Kubernetes 概念:

    1. 服务- 这些提供了对您的 pod 的抽象,并提供了一种在多个副本上负载平衡流量的方法。这些可以在内部使用,也可以在外部暴露
    2. Ingress - 这允许您在集群内设置一个 Ingress 控制器,例如 Nginx,并将此反向代理您的流量到相应的服务。这比在集群外部创建 Nginx 实例要好得多,因为 Ingress 控制器会自动获取您在集群中创建的任何新入口。
    • 0
  2. Best Answer
    Dawid Kruk
    2020-07-08T06:02:18+08:002020-07-08T06:02:18+08:00

    TL;博士

    在托管的 Kubernetes 集群中GKE,EKS或者AKS您可以向云提供商请求服务的 IP 地址。

    例如,Virtualbox使用任何一种方式创建的 Kubernetes 集群kubespray都kubeadm 需要额外的工具才能获得External-IP服务。

    您可以使用在不受云提供商管理的集群中metallb进行分配。External-IP请看官网:

    • Metallb.universe.tf

    在这种情况下,公开应用程序的步骤是:

    • 部署应用程序 pod
    • 创建一个service附加到 pod
    • 部署metallb和配置它
    • 通过以下任一方式公开应用程序:
      • 创建服务类型LoadBalancer
      • 创建Ingress资源

    免责声明!

    创建Ingress资源需要Ingress控制器。我在下面附上了其中一个的链接。

    • Kubernetes.github.io:入口 nginx

    我在下面提供了一个示例和更多说明,说明如何在 Virtualbox 创建的集群中使用metallb和公开您的应用程序nginx-ingress-controller。


    这是一个示例,展示了如何在 Virtualbox 中创建的 Kubernetes 集群上公开应用程序:

    • metallb
    • nginx-ingress-controller

    我将这个答案分为两部分:

    • 虚拟盒子
    • Kubernetes

    虚拟盒子

    当您VM's在 Virtualbox 中创建时,您有多种方式来配置网络。他们之中有一些是:

    • Bridged networking- 将您的 Kubernetes 集群连接到物理网络
    • Host-only- 允许单个适配器连接到节点和允许网络连接的主机。Host-only此解决方案需要另一个可以访问 Internet 的适配器或连接相同网络适配器的网关(例如 PfSense) 。

    此示例使用带有Bridged适配器的客户端和 3 个节点:

    • client带IP地址:192.168.0.2
    • master带IP地址:192.168.0.117
    • worker1带IP地址:192.168.0.118
    • worker2带IP地址:192.168.0.119

    为确保此示例在主机之外工作,我使用了同一网络中的另一台设备。

    请确保节点之间具有完全连接,并且您的主机可以完全访问它们。

    Kubernetes

    让我们假设:

    • 集群配置正确并且可以访问 Internet
    • 您拥有此集群的完全访问权限
    • 您可以从任何其他主机“ping”每个节点
    • 您的 pod 响应您选择的端口上的请求(例如8000)

    脚步:

    • 创建一个 podgunicorn
    • gunicorn为pod创建服务定义
    • 部署Metallb
    • 使用服务类型公开应用程序LoadBalancer
    • Ingress使用资源公开应用程序

    创建一个 podgunicorn

    我使用下面的部署定义来创建一个响应请求的 pod:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gunicorn
    spec:
      selector:
        matchLabels:
          app: gunicorn
      replicas: 1
      template:
        metadata:
          labels:
            app: gunicorn
        spec:
          containers:
          - name: gunicorn
            image: ubuntu
            command:
            - sleep
            - "infinity"
    

    我使用ubuntu了我exec进入并运行以下命令的图像:

    • $ apt update && apt install -y python3 python3-pip
    • $ pip3 install gunicorn

    我使用的示例代码myapp.py:

    def app(environ, start_response):
        data = b"Hello, World!\n"
        start_response("200 OK", [
            ("Content-Type", "text/plain"),
            ("Content-Length", str(len(data)))
        ])
        return iter([data])
    
    • $ gunicorn -w 1 -b 0.0.0.0 myapp:app &

    以上示例基于:

    • Gunicorn.org

    在此步骤之后,您的 pod 应该在端口8000上响应Hello, World!.

    gunicorn为pod创建服务定义

    gunicornpod的服务定义:

    apiVersion: v1
    kind: Service
    metadata:
      name: gunicorn-service
    spec:
      selector:
        app: gunicorn
      ports:
        - name: gunicorn-port
          port: 8000
          targetPort: 8000
      type: NodePort
    

    部署Metallb

    以下官方Metallb文档:Metallb.universe.tf:安装:

    • 编辑kube-proxy以将strictARP模式从更改false为true:
      • $ kubectl edit configmap -n kube-system kube-proxy
    • $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
    • $ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
    • $ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)

    您还需要添加一个configMap告诉metallb他可以为服务分配哪些 IP 地址:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: metallb-system
      name: config
    data:
      config: |
        address-pools:
        - name: default
          protocol: layer2
          addresses:
          - 192.168.0.240-192.168.0.250
    

    请具体看一下:

          addresses:
          - 192.168.0.240-192.168.0.250
    

    请确保此地址范围不与您网络中使用的任何地址重叠,并且它与节点和客户端位于同一网络中。

    之后,您应该能够创建LoadBalancer将获得 IP 地址的类型的服务。

    使用服务类型公开应用程序LoadBalancer

    您应该能够运行:

    • $ kubectl expose deployment gunicorn --type=LoadBalancer --port=8000

    的输出$ kubectl get services应该显示:

    NAME               TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
    gunicorn           LoadBalancer   10.233.43.104   192.168.0.240   8000:32591/TCP   3s
    gunicorn-service   NodePort       10.233.34.96    <none>          8000:30862/TCP   73s
    kubernetes         ClusterIP      10.233.0.1      <none>          443/TCP          23h
    

    如您所见,gunicorn服务的EXTERNAL-IPIP192.168.0.240池位于metallb.

    本例中使用的物理网络是192.168.0.0/24

    您可以运行:curl 192.168.0.240:8000并获得:Hello, World!

    Ingress使用资源公开应用程序

    Ingress在公开您的应用程序之前,您需要部署控制器。nginx-ingress-controller您可以通过运行进行部署:

    • $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml

    该Ingress控制器将LoadBalancer附加一个服务类型,这将是请求的入口点。

    您可以通过调用来获取它的 IP 地址$ kubectl get svc -n ingress-nginx:

    NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.233.52.8     192.168.0.241   80:31380/TCP,443:30066/TCP   29m
    ingress-nginx-controller-admission   ClusterIP      10.233.37.255   <none>          443/TCP                      29m
    

    以下是将Ingress流量从控制器路由到您的 pod 的定义:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: gunicorn-ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: 
        http:
          paths:
          - path: /
            backend:
              serviceName: gunicorn-service
              servicePort: gunicorn-port
    

    应用后,您应该能够:

    • curl 192.168.0.241并得到回应gunicorn
    • 0

相关问题

  • 设置 http 代理以使用 Web 界面?

  • 无法连接到 Ubuntu Desktop 中的端口 80 或 VMWare Workstation 6.52 中的 Server 9.04

  • IIS 7.5 (Windows 7) - HTTP 错误 401.3 - 未经授权

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • Tomcat 6 HTTP 日志滚动和清除

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve