编辑:我的设置的重点是实现(如果可能)以下内容:
我正在运行一个小型Kubernetes集群(使用kubeadm构建),以评估我是否可以将Docker(旧)Swarm设置移动到k8s。我绝对需要的功能是能够为容器分配IP,就像我使用MacVlan一样。
在我目前的泊坞设置中,我使用MacVlan将我公司网络的IP地址分配给某些容器,这样我就可以直接联系(无需反向代理),就好像它是物理服务器。我试图用k8s来实现类似的东西。
我发现了:
我的yaml文件是:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
kubernetes.io/hostname: k8s-slave-3
---
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- A.B.C.D
我正在跳跃,我的服务将获得IP A.B.C.D(这是我公司的网络之一)。我的部署工作正常,因为我可以使用它的 ClusterIP 从k8s集群内部访问我的nginx容器。
我错过了什么?或者至少,我在哪里可以找到有关网络流量的信息,以查看数据包是否即将到来?
编辑:
$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.96.0.1 <none> 443/TCP 6d
nginx-service 10.102.64.83 A.B.C.D 80/TCP 23h
感谢。
答案 0 :(得分:5)
如果这只是为了测试,请尝试
kubectl port-forward service/nginx-service 80:80
那么你可以
curl http://localhost:80
答案 1 :(得分:2)
首先运行以下命令:
kubectl get -n namespace services
以上命令将返回如下输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 <none> 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 <none> 3000:30017/TCP 13h
从上面的输出中很明显,尚未将外部IP分配给服务。要将外部IP分配给后端服务,请运行以下命令。
kubectl patch svc backend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
并为 frontend 服务分配外部IP,请运行此命令。
kubectl patch svc frontend -p '{"spec":{"externalIPs":["192.168.0.194"]}}'
现在获得名称空间服务以检查任一外部IP分配:
kubectl get -n namespace services
我们得到这样的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend NodePort 10.100.44.154 192.168.0.194 9400:3003/TCP 13h
frontend NodePort 10.107.53.39 192.168.0.194 3000:30017/TCP 13h
干杯!!!现在已分配Kubernetes外部IP。
答案 2 :(得分:1)
您可以尝试使用kube-keepalived-vip配置来路由流量。 https://github.com/kubernetes/contrib/tree/master/keepalived-vip
答案 3 :(得分:0)
您可以尝试添加&#34;输入:NodePort&#34;在您的服务的yaml文件中,然后您将有一个端口通过Web浏览器或从外部访问它。对我而言,它有所帮助。
答案 4 :(得分:0)
我不知道这在您的特定情况下是否有帮助,但是我所做的(并且我在Bare Metal集群中)是使用LoadBalancer
并设置loadBalancerIP
以及将externalIPs
设置为我的服务器IP。
之后,为负载均衡器显示了正确的外部IP。
答案 5 :(得分:0)
一种可行的解决方案(不仅适用于测试,尽管有其缺点),但您可以将hostNetwork
规范字段设置为{ {1}}。
这意味着您不需要公开Pod的服务,因为它始终可以通过单个端口(清单中指定的true
)在主机上进行访问。在这种情况下,无需保留DNS映射记录。
这也意味着您只能在给定节点上运行此Pod的单个实例(谈论缺点...)。因此,它非常适合DaemonSet对象。
如果您的Pod仍然需要访问/解析内部Kubernetes主机名,则需要将containerPort
规范字段设置为dnsPolicy
。此设置将使您的Pod可以访问K8S DNS服务。
示例:
ClusterFirstWithNoHostNet
答案 6 :(得分:0)
您只需修补外部IP
CMD:const products_schema = {
_id: {
auto: true
},
product_name: {
auto: false,
type: "string",
min: 5,
max: 10,
special_characters: ['_', ' '],
numbers: true,
alphabet: true,
required: true,
correct: ""
},
product_image: {
auto: false,
type: "array:string",
min: 0,
max: 50,
required: true
},
product_specification: {
auto: false,
type: "array:specification_schema",
min: 0,
max: 50,
required: true
}
};
for (const key in products_schema){
console.log(key);
for (const inner in products_schema[key]){
console.log(`${inner}:${products_schema[key][inner]}`);
}
}
例如:-$ kubectl patch svc svc_name -p '{"spec":{"externalIPs":["your_external_ip"]}}'
答案 7 :(得分:-1)
只需包含其他选项即可。
kubectl expose deployment hello-world --type=LoadBalancer --name=my-service --external-ip=1.1.1.1