- **service分类 : **
-
**ClusterIP : **
-
默认类型,自动分配一个【仅集群内部】可以访问的虚拟IP
-
**NodePort : **
-
对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务
-
**LoadBalancer : **
-
使在NodePort的基础上,借助公有云创建一个外部负载均衡器,并将请求转发到NodePort
-
可以实现集群外部访问服务的另外一种解决方案,不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型
-
**ExternalName : **
-
把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 Kubernetes 1.7或更高版本的kube-dns才支持。
-
- **service和pod之间是通过 selector.app进行关联的 : **
spec: # 描述
selector: # 标签选择器,确定当前service代理控制哪些pod
app: xdclass-nginx
- **yml模板文件 : **
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
name: xdclass-svc
spec:
ports:
- port: 80 # service服务端口
protocol: TCP
targetPort: 80 # pod端口,常规和容器内部端口一致
selector:
app: xdclass-nginx-pod
status:
loadBalancer: {}
- **关于K8S中端口的概念区分 : **
- **port **
- 是service端口,即k8s中服务之间的访问端口 ,clusterIP:port 是提供给集群内部客户访问service的入口
- **nodePort **
- 容器所在node节点的端口,通过nodeport类型的service暴露给集群节点,外部可以访问的端口
- **targetPort **
- 是pod的端口 ,从port和nodePort来的流量经过kube-proxy流到后端pod的targetPort上,进入容器。
- **containerPort **
- 是pod内部容器的端口,targetPort映射到containerPort。
- 4种端口作用不一样,port和nodePort都是service的端口
- port暴露给集群内客户访问服务,nodePort暴露给集群外客户访问服务
- 这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod中的容器
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 #容器端口
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort # 有配置NodePort,外部可访问k8s中的服务 ,
ports:
- name: nginx
port: 80 # 服务service的访问端口
protocol: TCP
targetPort: 80 # pod端口,映射到容器端口
nodePort: 30015 # NodePort,通过nodeport类型的service暴露给集群外部访问
selector:
app: nginx
**操作 : **
# 创建Deployment
kubectl apply -f deploy-nginx-pod.yaml
# 查看deployment和pod (service的缩写是svc)
kubectl get deployment,pod,svc -n dev -o wide
# 暴露服务 clusterIP 类型
kubectl expose deploy xdclass-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
# 查看服务(多了个类型是ClusterIP的,通过curl clusterIp+port可以访问)
kubectl get deployment,pod,svc -n dev -o wide
# 查看服务详情
kubectl describe svc svc-nginx1 -n dev
- **NodePort : **
# 创建NodePort类型服务 (网络安全组记得开放32451端口)
kubectl expose deploy xdclass-deploy --name=svc-nodeport-nginx1 --type=NodePort --port=80 --target-port=80 -n dev
# 查看服务详情
kubectl describe svc svc-nodeport-nginx1 -n dev
Endpoint(缩写是ep)
- 是k8s中的一个资源对象,存储在etcd中,记录service对应的所有pod的访问地址
- 里面有个Endpoints列表,就是当前service可以负载到的pod服务入口
- service和pod之间的通信是通过endpoint实现的
# 查看endpoint列表
kubectl get ep svc-nodeport-nginx1 -n dev -o wide
- service如何决定分发请求到后端的Pod?
kubernetes提供了两种负载均衡策略
- 默认,kube-proxy的策略,如随机、轮询
- 使用会话保持模式,即同个客户端的请求固定到某个pod,在spec中添加sessionAffinity:ClientIP即可
**操作 : **
#查看全部pod和ip
kubectl get pods -n dev -o wide
#修改pod里面容器nginx的默认静态页面,内容为Pod所在的ip
kubectl exec -it xdclass-deploy-64967f6b67-p66wh -n dev /bin/sh
echo "xdclass.net 5" > /usr/share/nginx/html/index.html
# curl访问ip+port 或 浏览器直接访问