1.service介绍
2.创建Service
创建一个deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 2
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
启动 两个Pod ,运行httpd 镜像,label是 run:httpd Service 会用这个label来挑选Pod
kubectl apply -f httpd.yml
Pod 分配了各自的IP,这是IP只能被Kubernetes Cluster 中的容器和节点访问

创建Service
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector: #指明label为run:httpd 的Pod作为Service 的后端
run: httpd
ports: #将Service的8081端口映射到Pod的80端口,使用TCP协议
- protocol: TCP
port: 8081
targetPort: 80

httpd-svc 分配到一个CLUSTER-IP 10.254.23.80 ,可以通过该IP访问后端的httpd Pod

根据 kubectl describe 查看httpd-svc 与 Pod 的对应关系

3.Cluster IP 的工作原理
Service Cluster IP 是一个虚拟IP ,是由Kubernetes 节点上的 iptables 规则管理的,IPtables 将访问Service 的流量转发到后台Pod ,而且使用了类似轮询的负载均衡策略。
Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个Cluster 能够通过Service 的Cluster IP 访问Service.
查看 有关httpd-svc的相关信息
iptables-save |grep httpd-svc
4. 外网访问Service
ClusterIP
service 通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问,这是默认的Service类型
NodePort
service 通过Cluster节点的静态端口对外提供服务。Cluster 外部可以通过<NodeIP>:<NodePort> 访问Service
LoadBalancer
service利用cloud provider 特有的Load balancer 对外提供服务,cloud provider 负责将load balancer 的流量导向Service。
目前支持的cloud provider有GCP、AWS、Azur等
添加type:NodePort,重新创建httpd-svc
apiVersion: v1
kind: Service
metadata:
name: httpd-svc-1
spec:
type: NodePort
selector:
run: httpd
ports:
- protocol: TCP
nodePort: 30000 #节点上的监听端口
port: 8081 #ClusterIP上监听端口
targetPort: 80 #Pod上监听端口
kubectl apply -f httpd-svc-1.yml

测试Node Port 是否正常工作

通过节点IP + 30000端口能够访问到 httpd-svc-1
最终,Node和ClusterIP在各自端口上接收到请求都会通过iptables 转发到Pod的target Port。
参考
https://www.cnblogs.com/benjamin77/p/9908547.html
来源:https://www.cnblogs.com/xmc2017/p/11382877.html