如何解决当另一台主机关闭时,在局域网中访问可用的Docker Swarm主机
我有一个包含3个服务(后端,前端,nginx)的堆栈。 我已将此堆栈部署在同一网络(LAN)(3台不同的PC)中3台不同主机上的Docker Swarm上。
让我们假设这些主机的IP地址为
192.168.1.13
192.168.1.55
192.168.8
我将路由器设置为将端口80的所有请求转发到192.168.1.13的80,对于443-> 443同样。
所有三个节点都是Manager。 192.168.1.13断开时会出现问题。然后,尽管所有服务都迁移到其他2个主机192.168.1.55和192.168.8,但我的路由器仍将我的所有请求转发到192.168.1.13,因此有人无法访问我的应用程序。如果我更改路由器配置以将请求转发到任何其他可用主机,则该应用程序正在运行。
我的问题是:
是否可以将路由器配置为将我的请求转发到位于所有主机顶部的虚拟IP?有没有其他方法可以解决我的问题?我曾考虑过Keepalived将关闭主机的IP传输到另一个已启动的主机,但是我不喜欢这种解决方案,而且我担心它会与我在路由器设置中完成的静态IP绑定发生冲突(我已经绑定了每个主机的MAC地址(例如192.168.1.13等)。我已经阅读了有关HAProxy的信息,但除了不确定是否可以解决我的问题外,理想情况下,如果我可以使用内置于负载均衡器的docker swarm,就不想添加额外的服务。码头工人蜂群入侵网络能否以某种方式挽救我的生命?
我的堆栈docker-compose文件如下:
version: '3.8'
services:
frontend:
image: mydocker_hub/frontend
deploy:
replicas: 4
ports:
- "3001:3000"
backend:
image: mydocker_hub/backend
deploy:
replicas: 4
ports:
- "8001:8080"
nginx:
image: mydocker_hub/nginx
deploy:
mode: global
ports:
- "80:80"
- "443:443"
depends_on:
- frontend
- backend
预先感谢,希望我对问题的解释足够清楚。
PS:我知道depends_on
在堆栈部署中被忽略,但是我忘记将其删除。
解决方法
好吧,我使用Keepalived解决了它。
我制作了以下3个配置文件,并将它们分别放置在3台主机上的import boto3
import math
import dateutil
import json
import os
import nltk
from nltk.corpus import stopwords
import string
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy
nltk.data.path.append("/tmp")
nltk.download("stopwords",download_dir = "/tmp")
nltk.download("punkt",download_dir = "/tmp")
nltk.download("wordnet",download_dir = "/tmp")
# grab environment variables
ENDPOINT_NAME = os.environ['ENDPOINT_NAME']
client = boto3.client(service_name='sagemaker-runtime')
def lambda_handler(event,context):
try:
print("Received event: " + json.dumps(event,indent=2))
request = json.loads(json.dumps(event))
transformed_data = json.dumps(event)
stopword = stopwords.words('english')
lemmatizer = WordNetLemmatizer()
vectorizer = TfidfVectorizer()
tokens = nltk.word_tokenize('this is sample text')
no_stop = [word for word in tokens if word not in stopword]
# no_punc = [word for word in no_stop if word not in string.punctuation]
# print(no_punc +'no punc**')
vertorized_data = vectorizer.fit_transform(no_stop)
vertorized_data = vertorized_data.toarray()
data = numpy.array(vertorized_data)
payload = json.dumps(data.tolist())
result = client.invoke_endpoint(EndpointName=ENDPOINT_NAME,Body=payload,ContentType='application/json')
result = result['Body'].read().decode('utf-8')
print(result)
return {
'statusCode': 200,'isBase64Encoded':False,'body': json.dumps(predictions)
}
except Exception as err:
return {
'statusCode': 400,'body': 'Call Failed {0}'.format(err)
}
上:
/etc/keepalived/keepalived.conf
然后,我将路由器指向192.168.1.100(我创建的虚拟IP),一切正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。