一、IPVS模式的service
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。 kube-proxy 通过 iptables 处理
Service 的过程,需要在宿主机上设置相当多的 iptables
规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
IPVS模式的service,可以使K8s集群支持更多量级的Pod。
kubectl edit cm kube-proxy -n kube-system
修改内容
更新kube-proxy pod
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配service IP
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
ip addr
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
二、k8s service的四种类型
1、ClusterIP
这个类型的service有一个ClusterIP,其实就一个VIP。具体实现原理依靠kubeproxy组件,通过iptables或是ipvs实现,这种类型的service只能在集群内访问
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
kubectl get svc
可以看到新建的service mysvc的类型为ClusterIP
集群中可以相互访问
不在集群中就不能访问
2、NodePort
基于ClusterIp,另外在每个Node上开放一个端口,可以从所有的位置访问这个地址。
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
type: NodePort
通过yaml文件创建NodePort类型的service
如果有其他类型的svc,想直接修改的话
kubectl edit svc mysvc
将type修改成NodePort
查询svc信息
kubectl get svc
可以看到这个服务为每个Node都打开了32416端口
netstat -antlp | grep 32416
在其他集群中,这个端口也被打开
在外部主机进行测试
3、LoadBalancer
从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer
类型的 Service。 在service提交后,Kubernetes就会调用 CloudProvider
在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端
更改kube-proxy配置
kubectl edit cm kube-proxy -n kube-system
将 strictARP: false 改为true
修改后刷新生效
kubectl get pod -n kube-system |grep kube-proxy |awk ‘{system(“kubectl delete pod “$1” -n kube-system”)}’
然后从网上拉去这俩个文件,并在harbor仓库里面建立
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
wget https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
然后编辑文件
修改/metallb.yaml
里面的内容
然后应用
kubectl appluy -f metallb.yaml
查看ns就可以发现被创建出来的新ns
查看新的ns所有信息
ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap可以将环境变量配置信息和容器镜像解耦,便于应用配置的修改。如果需要存储加密信息时可以使用Secret对象。
vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.25.32.10-172.25.32.20
然后应用创建cm
并查看创建的cm
vim lb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: lb-svc
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
selector:
app: myapp
type: LoadBalancer
创建类型为LoadBalancer的service
可以看到172.25.32.11后台有三个pod的ip
然后在真机里面访问
就会发现是负载均衡的
4、ExternalName
vim ex-svc.yaml
以下 Service 定义将my-service 服务映射到www.westos.org
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: www.westos.org
可以看到这个my-service的EXTERNAL-IP修改成了www.westos.org
解析一下这个服务的域名
dig -t A my-service.default.svc.cluster.local. @10.96.0.10
service允许为其分配一个公有IP
vim ext-ip.yaml
apiVersion: v1
kind: Service
metadata:
name: ex-service
spec:
selector:
app: myapp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
externalIPs:
- 172.25.32.100
但是访问不通
externalIPs不会被k8s管理,它属于集群管理员的职责范畴
在集群的另一个机子里面
ip addr add 172.25.32.100/24 dev eth0
就能访问了