- 前提条件
0.0 环境准备
0.1 安装docker
0.2 安装k8s
kubectl run kubia --image=nuptaxin/kubia --port=8080
- 将服务暴露给外部客户端的方式(默认type为ClusterIP)
- 服务类型设置成NodePort:该服务仅在内部集群IP和端口上才可访问,但也可以通过所有节点上的专用端口访问
- 服务类型设置成LoadBalance:服务可以通过一个专用的负载均衡器来访问
- 创建一个Ingress资源:通过一个IP地址公开多个服务,运行在http层
- 使用NodePort类型的服务
- 创建NodePort类型的服务【指定nodePort端口不是强制的,如果忽略将选择一个随机端口】
- 定义:kubia-svc-np.yaml(指定的externalIPs此时为ECS的内部IP地址)
apiVersion: v1 kind: Service metadata: name: kubia-svc-np spec: type: NodePort externalIPs: - 172.26.166.148 ports: - port: 8080 targetPort: 8080 selector: run: kubia
- 创建:
kubectl create -f kubia-svc-np.yaml
- 查看:
kubectl get svc kubia-svc-np
- 访问服务
http://8.130.177.188:8080
- 删除服务
kubectl delete svc kubia-svc-np
- 通过负载均衡器将服务暴露出来【如果在不支持Load Balancer服务的环境中运行,则不会调起负载均衡器,但该服务仍将表现的像一个NodePort服务。因为Load Balancer服务是NodePort服务的扩展】
- 定义:kubia-svc-lb.yaml(指定的externalIPs此时为ECS的内部IP地址)
apiVersion: v1 kind: Service metadata: name: kubia-svc-lb spec: type: LoadBalancer ports: - port: 8080 targetPort: 8080 selector: run: kubia externalIPs: - 172.26.166.148
- 创建:
kubectl create -f kubia-svc-lb.yaml
- 查询:(可以查到External-IP)
kubectl get svc kubia-svc-lb
- 请求:(如果有多个svc绑定到80端口,后创建的服务还需要指定lb的port,在查询中ports列可见)
http://8.130.177.188:8080
- 会话亲和性:
每次访问可能都是同一个pod,使用kubectl explain查看如果设置为None。原因是http请求会使用keep-alive,curl每次都会打开一个新连接 - 删除服务
kubectl delete svc kubia-svc-lb
- 了解外部连接的特性
- 了解并防止不必要的网络跳数:通过节点端口连接服务时(包括先通过负载均衡器),随机选择的pod不一定在同一节点。阻止额外跳数配置externalTrafficPolicy。(安装了多个node可以测试下,只有一个node不好测试)
- 定义:kubia-svc-lb-local.yaml
apiVersion: v1 kind: Service metadata: name: kubia-svc-lb-local spec: externalTrafficPolicy: Local type: LoadBalancer ports: - port: 8080 targetPort: 8080 selector: run: kubia externalIPs: - 172.26.166.148
- 创建:
kubectl create -f kubia-svc-lb-local.yaml
- 问题:
- 如果节点本地没有pod,则连接将挂起!!!
- 负载均衡器可能导致流量分配不均(每个节点上pod数量不一致时)
- 请求:(如果有多个svc绑定到80端口,后创建的服务还需要指定lb的port,在查询中ports列可见)
http://8.130.177.188:8080
- 记住客户端IP是不记录的
- 通过节点端口接收连接时,进行了SNAT转换,因此数据包的源IP将发生改变(web应用的访问日志将无法显示浏览器的IP)
- 使用local策略将保留IP,因为此策略下不执行SNAT
- 了解并防止不必要的网络跳数:通过节点端口连接服务时(包括先通过负载均衡器),随机选择的pod不一定在同一节点。阻止额外跳数配置externalTrafficPolicy。(安装了多个node可以测试下,只有一个node不好测试)
- 资源清理
kubectl delete po kubia
kubectl delete svc kubia-svc-lb-local