最简单的已经通过yaml文件把容器跑起来了,这个时候就是网络通讯的问题了
- K8s是基于扁平化的网络,也就是所有的Pod和node节点都是互通的
- docker run 是基于-p 作为映射端口,而yaml文件里写的ports并不是这个功能,前面也说了扁平化,说明这个参数并没有用,只是为了方便Pod中查看而已
- Pod也有一个单独IP地址的
IT产品的解决方案通常都是加一层,那么这层就是K8s的Service服务
哪些场景需要Service服务?
- 集群外部需要访问到Pod应用
- 集群内部Pod与Pod之间
这点可能就一点奇怪了,k8s不是扁平化的网络为什么还集群内Pod之间还需要使用Service
因为Pod生命周期太短,随时都可能被销毁,重建,那么使用Pod的IP应用到服务上是不可取的,Pod的IP其实是给IPVS或者iptable负载策略使用
Service服务
三种类型的Service
- ClusterIP:默认,提供集群内通讯IP
- NodePort:提供集群内通讯IP和把节点的IP地址映射出去(类似docker run -p 做的作用)
- LoadBalancer:Kubernetes 结合云平台的组件,如国外 GCE、AWS、国内阿里云等,将流量导向Service
Yaml文件格式
apiVersion: v1
kind: Service
metadata:
name: ldap-svc
labels:
app: ldap
spec:
type: NodePort #Service类型
ports:
- port: 8888
targetPort: 8080
protocol: TCP
nodePort: 30000 #映射节点的端口号,默认不写为随机端口30000-32767
selector: #非常重要,选择器的标签就是Pod定义的,可以为多个标签条件,只要符合这个标签的Pod都会被选中
app: ldap-web
帮助信息:
kubectl explain service #层级一,顶头写
kubectl explain service.spec #层级二,查看层级详情只要加上点+参数
这里直接就能看到版本号和kind
命令使用
kubectl get svc #svc为service缩写
NAME:定义的用户名,DNS就是使用这个域名
TYPE:NodePort类型
CLUSTER-IP:分配的集群内IP
EXTERNAL-IP:针对外部访问集群的IP,NodePort的none意思就是随便一个节点的IP+port
PORT:8888是集群内的映射,32032就是node节点的端口(包含主节点)
ipvsadm -ln
我使用的IPVS所以可以看到RR就是轮询的意思,一次访问3.8,一次访问4.8这样的轮询访问,映射信息是会随着Pod的消失而消失,新建而新建
kubectl describe service ldap-svc