我已经用Kubeadm创建了一个带有3个节点的Kubernetes集群。他们的IP地址和主机名是10.10.10.146/24(k8s1,master),10.10.10.135 / 24(k8s2),10.10.10.170 / 24(k8s3)。
现在我创建了一个nginx服务,其中包含3个包含此yaml文件的pod:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-app
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-app
image: nginx:1.14.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-srv
spec:
type: ClusterIP
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- 10.10.100.1
最后,其中一个豆荚被安排到k8s2,其中两个被安排到k8s3。
然后,如果我将10.10.100.0/24路由到k8s2,则只有一个pod工作。如果是k8s3,只有两个pod工作。如果是k8s1,没有豆荚工作。
如何通过外部IP从外部使所有pod正常运行,就像从内部通过cluster-IP一样,无论我将外部IP子网路由到哪个节点?或者那是不可能的,或者我需要其他东西,比如Kubernetes Ingress?
答案 0 :(得分:0)
有几个options要在群集外公开您的服务:
第一个选项是使用NodePort类型Kubernetes Service。这样,Service将在群集中的每个节点的网络接口上打开一个端口,并且所有到达该端口的流量都将转发到该服务。 默认情况下,此类服务的端口范围限制为30000-32767。
以下是Service NodePort配置的示例:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
type: NodePort
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
nodePort: 30080
如果您在AWS,GCP,Azure等云中运行Kubernetes群集,则可以使用第二个选项。如果您创建LoadBalancer类型的服务,它将在云中创建新的负载均衡器,并将来自该负载均衡器的所有流量转发到该服务。 这种方式的缺点是每个服务都会创建一个单独的负载均衡器,这将花费您额外的资金。
以下是Service LoadBalancer配置的示例:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
type: LoadBalancer
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
第三个选项是使用Ingress对象。应该在集群中运行Ingress控制器,以根据您创建的Ingress对象的内容配置云网络。 Ingress可以根据dns名称和URI路径为您提供将请求路由到不同服务的功能。您也可以在裸机Kubernetes集群上使用它,但在这种情况下,您负责将网络流量路由到Ingress控制器,例如通过防火墙规则。
以下是Ingress配置的几个示例:
# redirect all traffic to a service
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
spec:
backend:
serviceName: testsvc
servicePort: 80
# redirect traffic to a service for specified URI path
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /testpath
backend:
serviceName: test
servicePort: 80