目录

  • 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就等同于一个微服务

k8s statefulset类型使用 hostpath k8s server类型_IP

# 关联哪些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。由于其需要来回在用户空间和内核空间交互通信,因此效率很差

k8s statefulset类型使用 hostpath k8s server类型_TCP_02

iptables-软件

现在iptables-软件方式:
直接由内核中的iptables规则,接收client请求,并处理完成后,直接转发给指定serverpod。这种方式不再将请求转发给kube-proxy,性能提升很多

k8s statefulset类型使用 hostpath k8s server类型_IP_03

ipvs模型-建议使用

在ipvs模式下,kube-proxy监视kubeernetes服务和端点,调用netlink接口相应地创建ipvs规则,并定期将ipvs规则与kubernetes服务和端点同步。改控制循环可确保ipvs状态匹配。访问服务时,ipvs将流量定向到后段pod之一。
	ipvs代理模式基于类似于iptables模式的netfilter挂钩函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作。这意味着,与iptables模式下的kube-proxy相比,ipvs模式下的kube-proxy重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,ipvs模式还支持更高的网络流量吞吐量。

k8s statefulset类型使用 hostpath k8s server类型_TCP_04

设置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都可以

k8s statefulset类型使用 hostpath k8s server类型_IP_05

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,必定终身学习