k8s的网络优化(metallb)

一、metallb部署

参考网址:官方网站

为什么使用metallb?

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

部署准备

如果您在IPVS模式下使用kube-proxy,则从Kubernetes v1.14.2开始,您必须启用严格的ARP模式。
请注意,如果您将kube-router用作服务代理,则不需要此设置,因为默认情况下它启用了严格的arp。
您可以通过在当前集群中编辑kube-proxy配置来实现:

[root@server2 ~]# kubectl edit configmap -n kube-system kube-proxy

并修改如下图内容
在这里插入图片描述
更新kube-proxy pod

[root@server2 ~]# kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

开始部署

[root@server2 ~]# mkdir metallb/
[root@server2 ~]# cd metallb/
[root@server2 metallb]# wget https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
[root@server2 metallb]# wget https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
[root@server2 metallb]# kubectl apply -f namespace.yaml
[root@server2 metallb]# vim metallb.yaml    #查看里面需要的镜像 

在这里插入图片描述
在这里插入图片描述

我们需要提前将镜像下载好,平且上传至私有仓库

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

注意这里我是在我的私有仓库里创建了对应名字的项目
在这里插入图片描述

[root@server2 metallb]# kubectl apply -f metallb.yaml
创建密钥,否则会出现报错
[root@server2 metallb]# kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
[root@server2 metallb]# kubectl -n metallb-system get secrets
[root@server2 metallb]# kubectl -n metallb-system get all

在这里插入图片描述
在这里插入图片描述

配置

定义地址池

[root@server2 metallb]# vim config.yml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 172.25.1.100-172.25.1.200
[root@server2 metallb]# kubectl apply -f config.yml

测试

我们创建一个svc进行测试

[root@server2 metallb]# vim  nginx.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  #externalIPs:
  #- 172.25.2.100
  #clusterIP: None
  #type: NodePort
  type: LoadBalancer  #指定一个 LoadBalancer 类型的 Service
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1

在这里插入图片描述
我们可以看到我们部署的nginx-svc已经分配到了一个地址池中的ip
在这里插入图片描述
集群内部访问
在这里插入图片描述
集群外部访问
在这里插入图片描述

扫描二维码关注公众号,回复: 13136653 查看本文章

二、metallb+ingress

上篇博客中有对于ingress的yaml文件,可以复制过来进行修改,需要修改网络模式

[root@server2 ingress-nginx]# vim deploy.yaml

在这里插入图片描述
去除之前做的节点绑定
在这里插入图片描述
在这里插入图片描述

[root@server2 ingress-nginx]# kubectl apply -f deploy.yaml
[root@server2 ingress-nginx]# kubectl -n ingress-nginx get all

在这里插入图片描述
user -> vip(metallb) -> ingress-nginx -> svc -> pod

[root@server2 ingress-nginx]# cat nginx-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: myapp:v1
[root@server2 ingress-nginx]# cat demo.yml 
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-test
spec:
 # tls:
 #   - hosts:
 #     - www1.westos.org
 #     secretName: tls-secret
  rules:
    - host: www1.westos.org
      http:
        paths:
        - path: /
          backend:
            serviceName: nginx-svc
            servicePort: 80
[root@server2 ingress-nginx]# kubectl apply -f nginx-svc.yml
[root@server2 ingress-nginx]# kubectl apply -f  demo.yml
[root@server2 ingress-nginx]# kubectl get ingress
[root@server2 ingress-nginx]# kubectl describe ingress nginx-test

在这里插入图片描述

[root@server2 ingress-nginx]# kubectl get svc nginx-svc

在这里插入图片描述
这里需要给这个ip做好地址解析,然后在外部访问域名查看效果。
在这里插入图片描述

三、calico网络插件

官网:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises

calico简介:

flannel实现的是网络通信,calico的特性是在pod之间的隔离。
通过BGP路由,但大规模端点的拓扑计算和收敛往往需要一定的时间和计算资源。
纯三层的转发,中间没有任何的NAT和overlay,转发效率最好。
Calico 仅依赖三层路由可达。Calico 较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。

准备环境

[root@server2 ~]# mkdir  calico
[root@server2 ~]# cd calico/
[root@server2 calico]# ls
[root@server2 calico]# wget https://docs.projectcalico.org/manifests/calico.yaml
从yaml文件中找到所需的镜像,从官方拉取并上传到自己的私有仓库

注意此处我已经在仓库中创建的calico项目

[root@server1 harbor]# docker pull  docker.io/calico/cni:v3.18.1
[root@server1 harbor]# docker tag docker.io/calico/cni:v3.18.1 reg.westos.org/calico/cni:v3.18.1
[root@server1 harbor]# docker push reg.westos.org/calico/cni:v3.18.1
[root@server1 harbor]# docker pull docker.io/calico/node:v3.18.1
[root@server1 harbor]# docker tag docker.io/calico/node:v3.18.1 reg.westos.org/calico/node:v3.18.1
[root@server1 harbor]# docker push reg.westos.org/calico/node:v3.18.1
[root@server1 harbor]# docker pull docker.io/calico/pod2daemon-flexvol:v3.18.1
[root@server1 harbor]# docker tag docker.io/calico/pod2daemon-flexvol:v3.18.1 reg.westos.org/calico/pod2daemon-flexvol:v3.18.1
[root@server1 harbor]# docker push reg.westos.org/calico/pod2daemon-flexvol:v3.18.1
[root@server1 harbor]# docker pull docker.io/calico/kube-controllers:v3.18.1
[root@server1 harbor]# docker tag docker.io/calico/kube-controllers:v3.18.1 reg.westos.org/calico/kube-controllers:v3.18.1
[root@server1 harbor]# docker push  reg.westos.org/calico/kube-controllers:v3.18.1

在这里插入图片描述
最后将yaml文件中的image地址改成如图所示:
在这里插入图片描述
此处将IPIP模式关闭
在这里插入图片描述
之前安装的flannel插件,需保持一致;如果没有安装过flannel,则不需要管
在这里插入图片描述
先将之前flannel网络组件删除

[root@server2 ~]# kubectl delete -f kube-flannel.yml

安装插件

所有节点都需要进行以下两步操作
[root@server2 calico]# cd /etc/cni/net.d/
[root@server2 net.d]# mv 10-flannel.conflist /mnt
[root@server2 calico]# kubectl apply -f calico.yaml
[root@server2 calico]# kubectl -n kube-system get pod

在这里插入图片描述

calico网络架构

Felix:监听ECTD中心的存储获取事件,用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。

BIRD:一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,路由的时候到这里来。
在这里插入图片描述
IPIP工作模式:适用于互相访问的pod不在同一个网段中,跨网段访问的场景。
在这里插入图片描述
BGP工作模式:适用于互相访问的pod在同一个网段,适用于大型网络。
在这里插入图片描述

网络策略

NetworkPolicy策略模型:控制某个namespace下的pod的网络出入站规则
在这里插入图片描述
官网:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
限制访问指定服务:

# vim nginx-policy.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx

猜你喜欢

转载自blog.csdn.net/Sun__s/article/details/114370460
k8s