1. 介绍
有几种方法可以将Kubernetes集群上运行的应用程序暴露给外界,这样就不用只能在k8s集群内通过ip+端口访问了。
2. hostNetwork:true
当Pod配置为时hostNetwork: true
,在此Pod中运行的应用程序可以直接看到启动Pod的主机的网络接口。配置为在所有网络接口上侦听的应用程序将依次在主机的所有网络接口上访问。这是使用主机网络的Pod的示例定义:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
hostNetwork: true
containers:
- name: nginx
image: nginx
hostNetwork的优点是直接使用宿主机的网络,只要宿主机能访问,Pod就可以访问;
缺点:
- 易用性:Pod漂移到其他node上,访问时需要更换ip地址。当然可以将Pod绑定在某几个node上,并在这几个node上运行keepalived以漂移vip,这样就可以用vip来访问。
- 易用性:Pod间可能出现端口冲突,造成Pod无法调度成功。
- 安全性:Pod可以直接观察到宿主机的网络。
3. hostport
容器端口将通过<hostIP>:<hostPort>暴露给外部网络,其中hostIP是容器运行所在的Kubernetes节点的IP地址,而hostPort是用户请求的端口。这是一个示例pod定义:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
hostPort: 80
hostport和hostnetwork类似,不过它是经过了一系列的iptables规则所做的fullnat,并且性能来说是不如hostnetwork的,多了iptables的转发。
4. nodeport
默认情况下,可以在ClusterIP上访问Kubernetes服务,这是一个内部IP地址,只能从Kubernetes集群内部访问它。ClusterIP使Pod中运行的应用程序可以访问服务。为了使服务可以从群集外部访问,用户可以创建NodePort类型的服务。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
type: NodePort
ports:
- name: nginx
port: 80
nodePort: 30003
selector:
name: nginx
创建服务后,将在Kubernetes群集的每个节点上运行并在所有网络接口上侦听的kube-proxy组件接受端口30003上的连接。kube-proxy将传入的流量转发到选定的Pod。
5. loadbanlance
为了能够创建LoadBalancer类型的服务,必须在Kubernetes集群的配置中启用云提供商。从1.6版开始,Kubernetes可以在AWS,Azure,CloudStack,GCE和OpenStack上配置负载均衡器。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- name: nginx
port: 80
selector:
name: nginx
当然了,云上的slb是有费用的,尤其是大规格的。
6. ingress
Kubernetes Ingress提供了负载均衡器的典型功能:HTTP路由,sticky sessions, SSL termination, SSL passthrough,TCP和UDP负载均衡……目前,并不是每个Ingress控制器都实现所有可用功能。您必须查阅Ingress控制器的文档以了解其功能。详细情况请参考ingress高可用
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
spec:
rules:
- host: nginx.sy.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
7. pod的ip全局可达
当kubernetes的网络方案选择calico或者contiv时,还可以配置Pod IP全局可达,从而直接在集群外访问。