Kubernetes-service~ipvs模式、kube-dns、headless、service实现外部访问

一.service介绍

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。

service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

service的类型:

 ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
  NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP。
    LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用。
    ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过spec.externlName 设定)

二、IPVS模式

安装服务

yum install -y ipvsadm
lsmod |grep ip_vs

请添加图片描述

请添加图片描述

1.更改ipvs模式

更改配置文件的模式为ipvs

kubectl -n kube-system get cm

请添加图片描述

kubectl -n kube-system edit cm kube-system

请添加图片描述

修改未生效

ipvsadm -l

请添加图片描述

2.更新pod

更新kube-proxy pod

kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

请添加图片描述
再次查看

ipvsadm -ln

请添加图片描述

修改清单deployment.yaml 的镜像为myapp:v1
请添加图片描述

执行清单:

kubectl apply -f deployment.yaml
kubectl get pod

请添加图片描述

查看mysvc的详细信息:

kubectl describe svc mysvc

请添加图片描述
再次查看,刚才myapp节点生成的IP也出现了!

ipvsadm -ln

请添加图片描述
测试:访问IP

curl 10.102.253.86

可查看到访问次数

请添加图片描述

而且ip addr也可以看到这个ip!
请添加图片描述

三.kube-dns

k8s内内置dns解析服务,用于实现域名访问

kubectl  -n kube-system  get pod

 kubectl  -n kube-system  get  svc

请添加图片描述
创建并进入交互式pod,使用nslookup 命令查询dns记录,例如可以查看到mysvc的分配ip

kubectl  run demo --image=busyboxplus -it --restart=Never
 nslookup  mysvc.default

请添加图片描述
可以查看详细信息,看到Endpoints
dns端口为9153

kubectl  -n kube-system  describe  svc kube-dns 

请添加图片描述
查看域名解析pod节点信息如 ip

kubectl  -n kube-system  get pod -o wide

请添加图片描述
测试访问IP

kubectl get svc
curl 10.102.253.86

请添加图片描述

四.Headless无头模式

Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址。

Pod滚动更新后,依然可以解析

vim headless.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
      app: myapp
  clusterIP: None

请添加图片描述
拉起容器,查看svc信息
进入容器终端查看解析

kubectl apply -f headless.yaml
kubectl get svc

kubectl run demo --image=busyboxplus -it --restart=Never
nslookup nginx-svc

请添加图片描述
可以直接访问服务名,也是负载均衡的!

curl nginx-svc/hostname.html

请添加图片描述

退出容器并删除demo

请添加图片描述
安装dig插件,查看解析的A记录

yum install -y bind-utils
dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10

请添加图片描述

请添加图片描述

将deployment.yaml的版本更新V2

vim deployment.yaml
image: myapp:v2

请添加图片描述
`

执行清单:
请添加图片描述

可以看到解析的地址也变化了!

dig -t -A nginx-svc.default.svc.cluster.local. @10.96.0.10
kubectl describe svc nginx-svc

请添加图片描述

请添加图片描述

五、service实现外部访问

1.NodePort方式

编辑mysvc 的svc配置文件,将type改为NodePort

kubectl edit svc mysvc

type NodePort

请添加图片描述

请添加图片描述

我们可以查看到svc修改之后的类型变化了!

kubectl get svc

请添加图片描述
而且产生的端口在每个虚拟机都已经生成了!

netstat -antlp|grep 30548

请添加图片描述

请添加图片描述

可以直接在外部访问测试:实现了负载均衡!

curl 172.25.0.2:31641/hostname.html

请添加图片描述

将之前实验的pod节点demo删掉!

kubectl get pod
kubectl delete pod demo

请添加图片描述
进入容器中查看解析,自动写好了本地解析!

kubectl run demo --image=busyboxplus -it - --restart=Never

nslookup mysvc
cat /etc/resolv.conf

请添加图片描述

退出容器,删掉demo
请添加图片描述

2.metallb结合LoadBalancer

2.1.介绍

Kubernetes不提供网络负载均衡器的实现(LoadBalancer类型的服务)用于裸机集群。Kubernetes附带的Network LB的实现都是调用各种IaaS平台(GCP,AWS,Azure等)的粘合代码。如果您未在受支持的IaaS平台(GCP,AWS,Azure等)上运行,则LoadBalancers在创建时将无限期保持“待处理”状态。
裸机集群运营商只剩下两个较小的工具,即“ NodePort”和“ externalIPs”服务,可将用户流量引入其集群。这两个选项在生产用途上都有很大的缺点,这使裸金属集群成为Kubernetes生态系统中的二等公民。
MetalLB旨在通过提供与标准网络设备集成的Network LB实现来解决这种不平衡问题,从而使裸机群集上的外部服务也尽可能“正常运行”。

2.2.部署

修改kube-proxy的配置

kubectl edit configmap -n kube-system kube-proxy

strictARP: true

请添加图片描述

更新kube-proxy pod

 kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

请添加图片描述

创建一个目录metallb专门用来存放metallb的文件:
需要真机打开路由策略,使得虚拟机可以上网

cd
mkdir metallb
cd metallb
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文件
主要是为了修改镜像的版本!

vim metallb.yaml

请添加图片描述

在server1:
在私有仓库中创建一个新的项目metallb

请添加图片描述

将镜像下载好,平且上传至私有仓库

[root@server1 harbor]# docker pull metallb/controller:v0.10。2
[root@server1 harbor]# docker pull metallb/speaker:v0.10.2
[root@server1 harbor]# docker tag metallb/speaker:v0.10.2 reg.westos.org/metallb/speaker:v0.10.2
[root@server1 harbor]# docker push  reg.westos.org/metallb/speaker:v0.10.2
[root@server1 harbor]# docker tag metallb/controller:v0.10.2reg.westos.org/metallb/controller:v0.9.5
[root@server1 harbor]# docker push  reg.westos.org/metallb/controller:v0.10.2

请添加图片描述

请添加图片描述

执行metallb.yaml清单:

kubectl apply -f metallb.yaml
kubectl get ns

请添加图片描述

请添加图片描述

查看metallb-system节点

kubectl -n metallb-system get all

kubectl -n metallb-system get pod

请添加图片描述

请添加图片描述

自动生成secrets memberlist
查看:

kubectl -n metallb-system get secrets

请添加图片描述

2.3.定义地址池

vim configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.25.0.10-172.25.0.20

请添加图片描述

执行configmap.yaml
查看到cm中的配置信息已读取

kubectl apply -f configmap.yaml
kubectl get cm -n metallb-system

请添加图片描述

2.4测试

我们创建一个svc进行测试

vim lb-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: lb-svc
spec:
  ports:
    - name: http
      port: 80
      targetPort: 80
  selector:
    app: myapp
  type: LoadBalancer

请添加图片描述

将之前实验的svc删掉!

kubectl get svc
kubectl delete svc nginx-svc
kubectl delete svc mysvc

请添加图片描述

执行lb-svc.yaml并查看svc状态:
可以看到分配到了前面定义的10-20之间的IP!!

kubectl apply -f lb-svc.yaml
kubectl get svc

请添加图片描述

集群外部访问分配的IP实现负载均衡
请添加图片描述

当然也可以ipvsadm -ln看到负载均衡已经加入进来:
请添加图片描述

在server2,3上都可以ip addr看到172.25.0.10都已经出现!!
请添加图片描述

请添加图片描述

3.ExternalIP

需要外部添加IP到网卡中才可生效!
将前面实验的lb-svc删掉!!
请添加图片描述

vim exc-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.0.100  

请添加图片描述

执行exc-ip.yaml并查看SVC状态
请添加图片描述

查看当前配置的虚拟服务和RS的权重!

ipvsadm -ln

可以看到172.25.0.100已经出现!
请添加图片描述
但是此时在真机上访问172.25.0.100发现不能访问出现如下图情况:
请添加图片描述

为什么呢?
后面解决发现,是因为没有在server3或者server4上添加172.25.0.100的IP地址,因为他不能自动解析地址,需要手动添加!

ip addr add 172.25.0.100/24 dev eth0

请添加图片描述
然后访问就可以成功了!

curl 172.25.0.100

请添加图片描述

4.Externalname

通过给定域名访问解析

vim ex-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: www.westos.org

请添加图片描述

执行ex-svc.yaml后查看svc信息!

kubectl apply -f ex-svc.yaml

kubectl get svc

可以看到域名出现了!!
请添加图片描述

dig查看详细解析A记录

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

请添加图片描述

编辑my-service

kubectl edit svc my-service
改为www.baidu.com

请添加图片描述

查看svc信息发现域名已经变化:
请添加图片描述
再次dig查看详细解析A记录
发现域名也变化了!

dig -t A my-service.default.svc.cluster.local. @10.96.0.10

请添加图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dudududu--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值