kubernetes 集群里的三种ip
Node IP node节点的IP ,即物理网卡的地址,
Pod IP Pod 的ip 地址, 容器里的ip地址,此为虚拟地址。
ClusterIP service的IP 虚拟ip
Node ip可以是物理机的ip也可以是虚拟机的ip meige service 都会再Node 节点上,开通一个端口
外部通过端口访问service里的pod 和部署项目一样ip :端口/项目名
再k8s 查询node ip
1.kubectl get nodes
2.kubectl describe node nodeName
显示出来的InternalIP 就是node ip
Pod IP
是每个Pod 的ip地址,它是容器网卡根据网桥的ip分配的通常都是虚拟二层虚拟网络。
同Service下的Pod 可以根据podip相互通信
不同service 下的pod再集群间pod通信要借助于,clusterIP
pod和集群外通信要借助于,node ip
在k8s 查询podIP
kubectl get pods查询pod
kubectl describe pod podname
cluster ip
srvice 的ip地址,此为虚拟ip 外部,网络无法ping通,只有,k8s内部集群内部访问才可以使用
ervice 通过 label 关联对应的 Pod
Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
提供了负载均衡功能,自动转发流量到不同 Pod
可对集群外部提供访问端口
集群内部可通过服务名字访问
创建 一个 Service,通过标签test-k8s跟对应的 Pod 关联上
service.yaml
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
type: ClusterIP
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc
kubectl describe svc test-k8s,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
想要直接把集群服务暴露出来,我们可以使用NodePort 和 Loadbalancer 类型的 Service
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
# 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767
应用配置 kubectl apply -f service.yaml
在节点上,我们可以 curl http://localhost:31000/hello/easydoc 访问到应用
并且是有负载均衡的,网页的信息可以看到被转发到了不同的 Pod
hello easydoc
IP lo172.17.0.8, hostname: test-k8s-68bb74d654-962lh
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)
会额外生成一个 IP 对外服务
K8S 支持的负载均衡器:负载均衡器
Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP