概要
在kubernetes平台上, pod是由生命周期的。为了能给客户端提供固定的访问端点,所以在服务端(pods)和客户端之间,提供了一个中间层,此中间层称之为service。
-
service层的域名解析严重依赖于kubernetes集群上部署的附件(CoreDNS, kube-dns)。
-
kubernetes为了能向客户端提供网络功能,需要依赖于第三方的方案,可通过CNI标准接口进行接入。
-
node network: 真实地址,node network配置在node资源之上。
-
pod network: 真实地址,pod network配置在pod资源之上。
-
cluster network: 虚拟地址
(kube-proxy监听api-server.png)[…/png/kube-proxy监听api-server.png]
Node节点中的kube-proxy进程会监听Master节点中Api-server资源变动的信息。
-
service的工作模式: 1. userspace, iptables, ipvs
userspace: 1.1
iptables: 1.10
ipvs: 1.11类型:
ExternalName, ClusterIP, NodePort, and LoadBalancer资源记录:
SVC_NAME_, NS_NAME, DOMAIN, LTDsvc.cluster.local
redis.default.svc.cluster.local. -
service实际并非直接连接pod, 而是连接ndports(k8s的一个对象), 然后在连接到pod.
清单1
使用清单创建service
vim redis-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port: 6379 # service ip
targetPort: 6379 # pod ip
清单2
vim myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
role: canary
clusterIP: 10.99.99.99
type: NodePort
ports:
port: 80
targetPort: 80
NodePort: 30080
清单3
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: "None" # 无头service
ports:
port: 80
targetPort: 80
nodePort: 30080
示例
-
示例1,获取svc当前的svc服务资源,
kubectl get svc
-
示例2,创建清单1的实例,
kubectl apply -f redis-svc.yaml
-
示例3,创建的redis服务的详细信息,
kubectl describe svc redis
-
示例4,创建清单2的实例,
kubectl apply -f myapp-svc.yaml
-
示例5,查看清单2的进程,
while true; do curl http://172.20.0.66:30080/hostname.html; sleep 1; done
-
示例6, 修改myapp服务中的部分字段值,
kubectl patch svc myapp -p '{"sepc" : {"sessionAffinity":"ClientIP"}}'
-
示例7, 查看修改的myapp中的服务,
kubectl describe svc myapp
-
示例8, 注意对比和示例6中区别,
kubectl patch svc myapp -p '{"sepc" : {"sessionAffinity":"None"}}'
-
示例9, 创建清单3的实例,
kubectl apply -f myapp-svc
-
示例10, 查看运行结果,
dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
-
示例11, 查看当前的服务,
kubectl get svc -n kube-system
-
示例12, 查看pod的地址,
kubectl get pods -o wide -l app=myapp
后续工作
- 几种服务的区别是什么?