Kubernetes入门(四)暴露服务service
service介绍k8s的service是一种为一组功能相同的pod提供单一不变的接入点的资源。service的IP地址和端口不改变。创建方式:①kubectl expose②通过yaml文件方式apiVersion: v1kind: Servicemetadata:name: kubiaspec:ports:- port: 80targetPort: 8080selector:app: kubi
service介绍
k8s的service是一种为一组功能相同的pod提供单一不变的接入点的资源。service的IP地址和端口不改变。
创建方式:
①kubectl expose
②通过yaml文件方式
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
pod的服务发现
发现内部的服务
①通过环境变量env发现服务
②通过DNS发现服务
发现集群外部的服务
两种方式:
①手动配置endpoint资源
endpoint资源:暴露一个service的IP和端口的列表,
该资源在创建pod选择器Selector时创建
②为外部服务创建别名
通过完全限定域名FQDN访问外部服务
集群服务暴露给外部客户端
三种方式:
①将服务类型设置为NodePort
每个节点都会打开一个端口,将外部请求转发给服务对应的pod
apiVersion: v1
kind: Service
metadata:
name: kubia-nodeport
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30123 #通过集群节点的30123端口可以访问该服务
selector:
app: kubia
该方式可能需要更改防火墙配置
②通过负载均衡器LoadBalancer暴露服务
apiVersion: v1
kind: Service
metadata:
name: kubia-LoadBalancer
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
创建后,LoadBalancer将配置服务的外部IP地址
注意问题
①网络跳数
随机选择的pod并不一定在同一个节点上,可能需要额外的网络跳转才能到达pod
②客户端的IP地址无法获取
通过节点端口获取的请求,由于对数据包进行了源网络地址转换(SNAT),因此数据包的IP地址将发生改变。
通过Ingress暴露服务
与LoadBalancer的差别:每个LoadBalancer都需要自己的负载均衡器,以及独有的公有IP地址,而Ingress只需要一个公网IP就能为许多服务提供访问。
Ingress是网络栈(HTTP)的应用层操作,并可以提供一些服务不能实现的功能,如基于cookie的会话功能
apiVersion: externsions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
rules:
- host: kubia.example.com #Ingress将该域名映射到服务
http:
paths:
- path: /
backend:
serviceName: kubia-nodeport #所有的请求都转发到80端口
servicePort: 80
Ingress支持:
①将不同的服务映射到同一台主机的不同路径
②将不同的服务映射到不同职级上
apiVersion: externsions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
rules:
- host: kubia.example.com #Ingress将该域名映射到服务
http:
paths:
- path: /
backend:
serviceName: kubia-nodeport #所有的请求都转发到80端口
servicePort: 80
- host: bar.example.com #Ingress将该域名映射到服务
http:
paths:
- path: /
backend:
serviceName: bar #所有的请求都转发到80端口
servicePort: 80
Ingress转发HTTPS(处理TLS传输)
例子:pod中运行的web服务器只接受http,Ingress控制器负责处理TLS相关的所有内容,此时需要将证书和私钥附加到Ingress,该资源存储在k8s的Secret中。
步骤:
①创建私钥和证书
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.cert -days 360 -subj /CN=kubia.example.com
②创建Secret
kubectl create secret tls tls-secret --cert=tls.cert --key=tls.key
③创建Ingress
apiVersion: externsions/v1beta1
kind: Ingress
metadata:
name: kubia
spec:
tls:
- hosts:
- kubia.example.com
secretNmae: tls-secret #添加前面创建的私钥和证书
rules:
- host: kubia.example.com #Ingress将该域名映射到服务
http:
paths:
- path: /
backend:
serviceName: kubia-nodeport #所有的请求都转发到80端口
servicePort: 80
使用headless服务来发现独立的pod
k8s允许客户端通过DNS查找来发现pod的IP
将clusterIP设置为None会使得service成为headless服务,k8s不为其分配集群IP地址,客户端可以通过该IP连接到它所属的pod上
apiVersion: v1
kind: Service
metadata:
name: kubia-headless
spec:
clusterIP: None
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
更多推荐
所有评论(0)