目录
- 1、暴露应用service服务
- userspace
- iptables-软件
- ipvs模型-建议使用
- 设置ipvs模型
- 2、service当中的四种类型-CluserIP,NodePort,LoadBalancer,ExternalName
- service主要作用
- 1.CluserIP和无头service
- 2.NodePort
- 3.LoadBalancer
- 4.ExternalName
- 5.跨越名称空间访问服务
1、暴露应用service服务
用来做负载均衡,同时向集群暴露服务,一个service就等同于一个微服务
# 关联哪些POD,标签
# 怎样暴露服务,开端口
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
release: stable
ports:
- name: http
port: 80
targetPort: 80
protocol: "TCP"
- name: https
port: 443
targetPort: 443
protocol: "TCP"
######################
selector: //标签选择器
release: stable //有release=stabl的标签,kubectl get pod --show-labels
- name: http
port: 80 //向外暴露端口
targetPort: 80 // 容器内部端口
protocol: "TCP" //以什么方式暴露,默认tcp
######################
userspace
以前userspace:
client pod 要访问server pod时,它先将请求发给本机内核空间中的service规则,由它再将请求转发给监听在指定套接字上的kube-proxy,kube-proxy处理完请求,并分发请求到指定server pod后,再将请求递交给内核空间中的service,由service将请求转给指定的server pod。由于其需要来回在用户空间和内核空间交互通信,因此效率很差
iptables-软件
现在iptables-软件方式:
直接由内核中的iptables规则,接收client请求,并处理完成后,直接转发给指定serverpod。这种方式不再将请求转发给kube-proxy,性能提升很多
ipvs模型-建议使用
在ipvs模式下,kube-proxy监视kubeernetes服务和端点,调用netlink接口相应地创建ipvs规则,并定期将ipvs规则与kubernetes服务和端点同步。改控制循环可确保ipvs状态匹配。访问服务时,ipvs将流量定向到后段pod之一。
ipvs代理模式基于类似于iptables模式的netfilter挂钩函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作。这意味着,与iptables模式下的kube-proxy相比,ipvs模式下的kube-proxy重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,ipvs模式还支持更高的网络流量吞吐量。
设置ipvs模型
设置kube-proxy中
详情:查看二进制部署
KUBE_HOSTNAME="192.168.0.214"
HOSTNAME=`hostname`
cat > /etc/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: ${KUBE_HOSTNAME}
healthzBindAddress: ${KUBE_HOSTNAME}:10256
metricsBindAddress: ${KUBE_HOSTNAME}:10249
clientConnection:
burst: 200
kubeconfig: /etc/kubernetes/cfg/kube-proxy.kubeconfig
qps: 100
hostnameOverride: ${HOSTNAME}
clusterCIDR: 10.96.0.0/16
enableProfiling: true
mode: "ipvs"
kubeProxyIPTablesConfiguration:
masqueradeAll: false
kubeProxyIPVSConfiguration:
scheduler: rr
excludeCIDRs: []
EOF
2、service当中的四种类型-CluserIP,NodePort,LoadBalancer,ExternalName
# CluserIP : 向集群内部暴露一个IP,外部无法访问
# NodePort : 在宿主主机中开启一个端口与负载均衡IP的端口一一对应,外界可以使用宿主主机的端口访问集群内部服务,端口随机,也可以固定端口。一般测试用,正式环境不实用,因为端口占用严重
# LoadBalancer:是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现
# ExternalName service 是sercice的一个特例,它没有选择器,也没有定义任何端口。它的作用是返回集群外service的外部别名。它将外部地址经过集群内部的再一次封装(实际上就是集群DNS服务器将CNAME解析到外部地址上),实现了集群内部访问即可。例如你们公司的镜像仓库,最开始时用ip访问,等到后面域名下来了再使用域名访问。你不可能去修改每处的引用。但是可以创建一个ExternalName,首先指向到IP,等后面再指向域名
service主要作用
service主要作用:提供负载均衡
ingress主要作用:提供域名转发
1.CluserIP和无头service
# 修改type=CluserIP
kubectl edit service service
向集群内部暴露一个IP,外部无法访问,随机ip
type: CluserIP
CluserIP: None
CluserIP:集群内网ip
无头service就是CluserIP没有的service,主要作用:因为访问可以直接用ingress域名端口转发,所以可以不使用内网ip,占ip资源。一般给ingress使用
apiVersion: v1
kind: Service
metadata:
name: bike-service
namespace: bike-namespace
spec:
ports:
- port: 8080
targetPort: 8080
selector:
app: bike-pod //pod标签名字
sessionAffinity: None
type: ClusterIP
2.NodePort
在宿主主机中开启一个端口与负载均衡IP的端口一一对应,外界可以使用宿主主机的端口访问集群内部服务,端口随机,也可以固定端口。一般测试用,正式环境不实用,因为端口占用严重
NodePort服务是让外部请求直接访问服务的最原始方式,NodePort是在所有的节点上开放指定的端口,所有发送到这个端口的请求都会直接转发到服务中的pod里;
这种方式不足:
1.一个端口只提供一个服务使用
2.只能使用30000-32767之间的端口
3.如果节点/虚拟机的IP地址发送变化,需要人工处理;
所以在生产环境,不推荐这种方式发布服务
# 修改type=NodePort
kubectl edit service service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.160.0.1 <none> 443/TCP 7d4h
service NodePort 192.175.3.121 <none> 80:31728/TCP,443:31976/TCP 3h11m
外部访问:http://192.168.0.216:31728/,集群任何ip都可以
3.LoadBalancer
LoadBalancer:是实现暴露服务的另一种解决方案,它依赖于公有云弹性IP实现
依赖于弹性ip向集群外部暴露服务的负载均衡
4.ExternalName
ExternalName:将其他链接设置一个集群内部的别名。代码里面使用内部的别名。链接资源有变化,只需要修改链接,别名不用修改。否则需要大量的修改。无缝迁移。类似把其他链接定义一个全局变量,代码内部使用变量,全局变量可以在配置文件修改
vi ExternalName.yaml填写内容:
apiVersion: v1
kind: Service
metadata:
name: baidu
spec:
externalName: www.baidu.com
type: ExternalName
kubectl apply -f externalname.yaml //部署
[root@sg-14 service]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
baidu ExternalName <none> www.baidu.com <none> 11m
kubectl run test -it --rm --image=busybox:1.28.3 // 启动进入容器内部,退出时删除
nslookup [service名称] // dns解析service的ip
nslookup baidu
[root@sg-14 service]# kubectl run test -it --rm --image=busybox:1.28.3
If you don't see a command prompt, try pressing enter.
/ # nslookup baidu
Server: 192.160.0.10
Address 1: 192.160.0.10 kube-dns.kube-system.svc.cluster.local
Name: baidu
Address 1: 112.80.248.76
Address 2: 112.80.248.75
/ #
5.跨越名称空间访问服务
在mysql名称空间内创建一个WordPress service,请问在default名称空间内怎样访问这个Servier下的pod服务?
service名称.命名空间.svc.cluster.local
选择了IT,必定终身学习