我对 Kubernetes 很陌生。我需要一些建议如何访问部署在集群中的应用程序。
我有一个带有 Django 应用程序和 Gunicorn 的 docker 映像来运行 .wsgi。我正在使用此映像在具有 3 个节点的集群中部署容器(学习 k8s 的环境,1 个 master 2 个 worker)。如果我使用 nodePort 公开服务并使用 curl <node'sIP>:[port],从不包含在集群中的服务器,我可以访问应用程序。
但是现在我想要一个单一的入口点,它可以与任何副本连接。
我想过再创建一台机器,不包含在安装了 Nginx 或 HAproxy 的集群中,但我找不到任何解决方案如何将外部反向代理与 kubernetes 服务连接。
你能给我更好的解决方案,或者建议我如何继续我的想法吗?
您缺少一些我建议您查看的基本 Kubernetes 概念:
TL;博士
在托管的 Kubernetes 集群中
GKE
,EKS
或者AKS
您可以向云提供商请求服务的 IP 地址。例如,
Virtualbox
使用任何一种方式创建的 Kubernetes 集群kubespray
都kubeadm
需要额外的工具才能获得External-IP
服务。您可以使用在不受云提供商管理的集群中
metallb
进行分配。External-IP
请看官网:在这种情况下,公开应用程序的步骤是:
service
附加到 podmetallb
和配置它LoadBalancer
Ingress
资源我在下面提供了一个示例和更多说明,说明如何在 Virtualbox 创建的集群中使用
metallb
和公开您的应用程序nginx-ingress-controller
。这是一个示例,展示了如何在 Virtualbox 中创建的 Kubernetes 集群上公开应用程序:
metallb
nginx-ingress-controller
我将这个答案分为两部分:
虚拟盒子
当您
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
让我们假设:
8000
)脚步:
gunicorn
gunicorn
为pod创建服务定义Metallb
LoadBalancer
Ingress
使用资源公开应用程序创建一个 pod
gunicorn
我使用下面的部署定义来创建一个响应请求的 pod:
我使用
ubuntu
了我exec
进入并运行以下命令的图像:$ apt update && apt install -y python3 python3-pip
$ pip3 install gunicorn
我使用的示例代码
myapp.py
:$ gunicorn -w 1 -b 0.0.0.0 myapp:app &
以上示例基于:
在此步骤之后,您的 pod 应该在端口
8000
上响应Hello, World!
.gunicorn
为pod创建服务定义gunicorn
pod的服务定义:部署
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 地址:请具体看一下:
请确保此地址范围不与您网络中使用的任何地址重叠,并且它与节点和客户端位于同一网络中。
之后,您应该能够创建
LoadBalancer
将获得 IP 地址的类型的服务。使用服务类型公开应用程序
LoadBalancer
您应该能够运行:
$ kubectl expose deployment gunicorn --type=LoadBalancer --port=8000
的输出
$ kubectl get services
应该显示:如您所见,
gunicorn
服务的EXTERNAL-IP
IP192.168.0.240
池位于metallb
.您可以运行:
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
:以下是将
Ingress
流量从控制器路由到您的 pod 的定义:应用后,您应该能够:
curl 192.168.0.241
并得到回应gunicorn