一、service访问pod
每个pod都会有自己的ip地址,当controller用新的pod代替发生故障的pod时,新的pod会分配到新的IP地址
service有自己的ip,而且这个ip是不变的。客户端只需要访问service的ip kubernetes则负责建立和维护service与pod的映射关系,无论后端pod如何变化,对客户端不会有任何影响,因为service没有变。
1.案例:
mkdir myservice
cp webyml/web.yml myservice/service.yml
vim service.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: httpd
name: httpd
spec:
replicas: 3
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- image: httpd
name: httpd
ports:
- containerPort: 80
验证结果:
2. 创建service
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
1.v1是service的apiversion
2.指明了当前资源类型为service。
3.service的名字为httpd-svc
4.selector指明挑选哪些label为run:httpd的pod作为service的后端
5.将service的8080端口映射到pod的80端口,使用TCP协议。
验证结果:
通过kubectl describe可以查看httpd-svc与pod的对应关系。
二、dns访问service
在cluster中,除了可以通过cluster ip 访问service,kubemetes还提供了更方便的dns访问
kubeadm部署时会默认安装coredns组件
kubectl get deployments.apps --namespace=kube-system
coredns是一个dns服务器,每当有新的service被创建,coredns会添加该service的记录 cluster中的pod可以通过《service_name》《namespace_name》访问service
kubectl run -it --rm busybox --image=busybox:1.28 sh
三、外网如何访问service
除了cluster内部可以访问service,很多情况我们也希望应用的service能够暴露给cluster外部
kubernetes提供了多种类型的service,默认是clusterIP
1.案例:
修改service httpd-svc的配置文件:
vim http-svc
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
run: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
添加type:NodePort,重新创建httpd-svc
kubectl apply -f http-svc.yml
kubernetes 依然会为httpd-svc分配一个clusterIP,不同的是:
1.EXTERNAL-IP 为nodes,表示可通过cluster每个节点自身的ip访问service
2.PORT(S) 8080:32312。8080是clusterIP监听的端口,32312则是节点上监听的端口。kubermetes会从30000-32767中分配一个可用的端口,每个节点都会监听此端口并请求转发给service。
通过三个节点ip+30904端口都能够访问httpd-svc
其作用就是负载均衡到每一个pod
2. 案例:
nodePort默认的是随机选择,不过我们可以用nodePort指定某个特定端口。
vim myservice/http-svc.yml
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
run: httpd
ports:
- protocol: TCP
nodePort: 30000
port: 8080
targetPort: 80
现在配置文件中就有三个Port了:
nodePort是节点上监听的端口。
port是clusterip上监听的端口。
targetPort是Pod监听的端口。
最终,Node和ClusterIP在各自端口上接收到的请求都会通过iptables转发到pod的targetPort
验证: