Kubernetes 网络模型

继续在虚拟机环境下配置Kubernetes网络,这里会安装nginx-ingress和Loadbalance。首先先了解下k8s的网络模型。

1. Kubernetes网络模型

在Kubernetes网络中存在两种IP(Pod IP和Service Cluster IP),Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,Service Cluster IP它是一个虚拟IP,是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。下面讲讲Kubernetes Pod网络设计模型:

ClusterIP和Pod IP其实都是虚拟的,是通过不同的网络插件和kube-proxy共同实现的,无论Pod IP还是ClusterIP在集群之外都是不能访问的。

1.1 Kubernetes网络模型

PodIP是每个Pod唯一的IP,是通过K8S相应的网络插件来实现和分配的,比如采用Flannel做为网络插件通过etcd中存储和分配的IP地址,通过Flannel实现的overlay的网络进行转发。
各个网络插件的不同用法和介绍另表。Pod之间默认是相互可以ping通的。

1.2 Servcie Cluster IP的理解:

Pod会因为调度和维护ip地址发生改变,并且存在多个同一类型的POD在不同Work Node上存在情况,因此K8S采用Service这种Resocue来抽象对于服务的访问。 Cluster IP就是集群分配个Servcie的IP

如可以通过

kubectl get svc -A #查看所有Servcie

    NAMESPACE              NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
default                kubernetes                           ClusterIP      10.96.0.1        <none>         443/TCP                      13d
ingress-nginx          ingress-nginx-controller             LoadBalancer   10.105.229.181   192.168.1.42   80:30581/TCP,443:30870/TCP   12d
ingress-nginx          ingress-nginx-controller-admission   ClusterIP      10.96.138.148    <none>         443/TCP                      12d
kube-system            kube-dns                             ClusterIP      10.96.0.10       <none>         53/UDP,53/TCP,9153/TCP       13d
kubernetes-dashboard   dashboard-metrics-scraper            ClusterIP      10.99.204.39     <none>         8000/TCP                     13d
kubernetes-dashboard   kubernetes-dashboard                 ClusterIP      10.102.192.254   <none>         443/TCP                      13d
openelb-system         openelb-admission                    ClusterIP      10.97.249.225    <none>         443/TCP                      13d

Service的类型有:ClusterIP,NodePort,Loadbalance分别提供了不同的集群外访问的能力。
ClusterIP默认在Pod上也是无法ping通的,因为In-cluster load balacne的方式也是不同的。

1.3 集群内负载均衡和IPVS

k8s集群内的负载均衡有iptables和ipvs,iptables是默认的实现方式这种方式下,clusterip是不能通过pod内ping的,ipvs方式下是可以的。

切换到ipvs方式:

  • 确认IPVS内核模块是否安装

    lsmod|grep ip_vs
    
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    
    yum install ipvsadm ipset -y
    
    
    
    
  • 修改kube-proxy

    kubectl edit configmap kube-proxy -n kube-system
    
     minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"                          # 修改此处
    nodePortAddresses: null
    
  • . 删除所有的 kube-proxy 等待重建

    kubectl delete pod kube-proxy-XXX -n kube-system

  • 验证

    kubectl logs kube-proxy-xxx   -n kube-system
     日志出现Using ipvs Proxier即可
    

1.4 集群外访问集群内的方式

对于如果在集群外访问集群内服务,主要是可以通过以下几种方式:

  • 通过kube-proxy来代理

入可以通过访问如下URL访问k8 dashborard
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问

  • 通过将Servcie定义为NodePort

将Servcie定义NodePort Type可以通过30000-32767

  • 通过LoadBalance访问

通过安装LoadBalancer或者使用云厂商提供的LoadeBalancer来实现

  • 通过将Service放在ingress 后并通过ingress挂载到LoadBlance访问

通过安装LoadBalancer 和Ingress 来实现

2. 安装和配置OpenELB LoadBalancer

2.1 OpenELB介绍

OpenELB 之前叫 PorterLB,是为物理机(Bare-metal)、边缘(Edge)和私有化环境设计的负载均衡器插件,可作为 Kubernetes、K3s、KubeSphere 的 LB 插件对集群外暴露 LoadBalancer 类型的服务,现阶段是 CNCF 沙箱项目,核心功能包括:

  • 基于 BGP 与 Layer 2 模式的负载均衡
  • 基于路由器 ECMP 的负载均衡
  • IP 地址池管理
  • 使用 CRD 进行 BGP 配置

由于BGP方式需要路由器上配置BGP协议,这里仅仅展示Layer 2方式

2.2 安装

https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml
下载配置和安装的yml文件,openelb也是有一些资源对象和容器组成的。由于k8s.gcr.io/ingress-nginx/kube-webhook-certgen 不能访问,需要替掉。

替换后运行:

kubectrl apply -f 替换后的文件

运行后可以查看到一下pod状态:

kubectl get pods -n openelb-system 
NAME                               READY   STATUS      RESTARTS   AGE
openelb-admission-create-cx7w8     0/1     Completed   0          13d
openelb-admission-patch-fvrvj      0/1     Completed   0          13d
openelb-keepalive-vip-mlgfc        1/1     Running     0          13d
openelb-keepalive-vip-t5xdg        1/1     Running     0          13d
openelb-manager-55cf8d98b5-smgm5   1/1     Running     0          13d

以下是一些CRD对象

     kubectl get crd |grep kubesphere
    bgpconfs.network.kubesphere.io           2022-04-10T08:01:18Z
    bgppeers.network.kubesphere.io           2022-04-10T08:01:18Z
    eips.network.kubesphere.io               2022-04-10T08:01:18Z

2.3 配置

二层模式下配置,node均在192.168.1.X 网段下:

首先需要为 kube-proxy 启用 strictARP,以便 Kubernetes 集群中的所有网卡停止响应其他网卡的 ARP 请求,而由 OpenELB 处理 ARP 请求。

kubectl edit configmap kube-proxy -n kube-system
......
ipvs:
  strictARP: true
......

重启kube-proxy

kubectl rollout restart daemonset kube-proxy -n kube-system

如果安装 OpenELB 的节点有多个网卡,则需要指定 OpenELB 在二层模式下使用的网卡,如果节点只有一个网卡,则可以跳过此步骤,假设安装了 OpenELB 的 master1 节点有两个网卡(eth0 192.168.0.2 和 ens33 192.168.0.111),并且 eth0 192.168.0.2 将用于 OpenELB,那么需要为 master1 节点添加一个 annotation 来指定网卡:

 kubectl annotate nodes master1 layer2.openelb.kubesphere.io/v1alpha1="192.168.0.2"

创建地址池:

yml文件如下:

apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
  name: eip-pool
spec:
  address: 192.168.1.42-192.168.1.49
  protocol: layer2
  disable: false
  interface: eth0

创建完成 Eip 对象后可以通过 Status 来查看该 IP 池的具体状态:

kubectl get eip 

2.4 测试:

这里通过LoadBalance暴露一个nginx服务来测试,

# openelb-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:  
    matchLabels:
      app: nginx
  template:  
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

# openelb-nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    protocol.openelb.kubesphere.io/v1alpha1: layer2
    eip.openelb.kubesphere.io/v1alpha2: eip-pool
spec:
  selector:
    app: nginx
  type: LoadBalancer
  ports:
    - name: http
      port: 80
      targetPort: 80

分别apply这两个yaml文件,创建服务。

创建完成后可以看到 Service 服务被分配了一个 EXTERNAL-IP,然后我们就可以通过该地址来访问上面的 nginx 服务了:

curl http://192.168.1.42

3. 安装和配置nginx-ingress

3.1 Ingress概念

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

3.2 Nginx ingress

nginx ingress是通过nginx进行第7层的转发和管理,从而实现负载均衡、SSL证书等nginx原来就有的功能

3.2.1 nginx ingress 安装

从以下地址获取yaml文件:
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

修改kc8的相关的镜像的地址为国内可以访问到的镜像地址。
由于需要和openelb配置,这里修改servider的Loadbalnacer 如下:

 apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.0
  name: ingress-nginx-controller-admission
  namespace: ingress-nginx
spec:
  ports:
  - appProtocol: https
    name: https-webhook
    port: 443
    targetPort: webhook
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  type: ClusterIP

直接kubectrl apply -f就可以完成安装

4 实例

这里结合openelb、nginx-ingress来将k8s dashboard暴露

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: k8s.5imakeup.com
    http:
      paths:
        - pathType: Prefix
          path: "/"
          backend:
            service:
              name: kubernetes-dashboard
              port:
                number: 443
  tls:
    - hosts:
        - k8s.5imakeup.com
      secretName: dashboard

其中的关于tls配置,需要添加一个secret

kubectl create secret tls dashboard --key /root/k8s/certs/k8s.5imakeup.com.key --cert /root/k8s/certs/k8s.5imakeup.com.pem -n kubernetes-dashboard

证书文件可以通过自己申请。

k8s.5imakeup.com的DNS解析设置为Openelb 的ip

kubectl apply后可以通过k8s.5imakeup.com 访问到dashboard

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com