在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。
为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供—个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。
Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则。
安装ipvsadm
#10.97.97.97:80是service提供的访问入口
#当访问这个入口的时候,可以发现后面有三个pod的服务在等待调用,# kube-proxy会基于rr(轮询〉的策略,将请求分发到其中一个pod上去
#这个规则会同时在集群内的所有节点上都生成,所以在任何一个节点上访问都可以。
[ root@node1 ~]# ipvsadm -Ln
安装deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pod
template:
metadata:
labels:
app: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
进入nginx修改主页面的信息
kubectl exec -it deployment-5ffc5bf56c-z2vwk -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# echo "1" > /usr/share/nginx/html/index.html
# exit
[root@master ~]# curl 10.244.1.4
1
安装service
apiVersion: v1
kind: Service
metadata:
name: service
namespace: dev
spec:
selector:
app: nginx-pod
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port: 80
targetPort: 80
出现的错误:标签要一样 app:nginx-pod
查看
[root@master ~]# kubectl describe svc -n dev
Name: service
Namespace: dev
Labels: <none>
Annotations: <none>
Selector: app=nginx-pod
Type: ClusterIP
IP: 10.97.97.97
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.2:80,10.244.2.2:80,10.244.2.3:80
Session Affinity: None
Events: <none>
[root@master ~]# kubectl get deploy -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
deployment 3/3 3 3 17m
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
deployment-5ffc5bf56c-4p8wk 1/1 Running 0 17m
deployment-5ffc5bf56c-d9tqr 1/1 Running 0 17m
deployment-5ffc5bf56c-ljzzm 1/1 Running 0 17m
[root@master ~]# curl 10.97.97.97
2
[root@master ~]# curl 10.97.97.97
3
[root@master ~]# curl 10.97.97.97
1