继续在虚拟机环境下配置Kubernetes网络,这里会安装nginx-ingress和Loadbalance。首先先了解下k8s的网络模型。
在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在集群之外都是不能访问的。
PodIP是每个Pod唯一的IP,是通过K8S相应的网络插件来实现和分配的,比如采用Flannel做为网络插件通过etcd中存储和分配的IP地址,通过Flannel实现的overlay的网络进行转发。
各个网络插件的不同用法和介绍另表。Pod之间默认是相互可以ping通的。
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的方式也是不同的。
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
kubectl delete pod kube-proxy-XXX -n kube-system
验证
kubectl logs kube-proxy-xxx -n kube-system
日志出现Using ipvs Proxier即可
对于如果在集群外访问集群内服务,主要是可以通过以下几种方式:
入可以通过访问如下URL访问k8 dashborard
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问
将Servcie定义NodePort Type可以通过30000-32767
通过安装LoadBalancer或者使用云厂商提供的LoadeBalancer来实现
通过安装LoadBalancer 和Ingress 来实现
OpenELB 之前叫 PorterLB,是为物理机(Bare-metal)、边缘(Edge)和私有化环境设计的负载均衡器插件,可作为 Kubernetes、K3s、KubeSphere 的 LB 插件对集群外暴露 LoadBalancer 类型的服务,现阶段是 CNCF 沙箱项目,核心功能包括:
由于BGP方式需要路由器上配置BGP协议,这里仅仅展示Layer 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
二层模式下配置,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
这里通过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
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
nginx ingress是通过nginx进行第7层的转发和管理,从而实现负载均衡、SSL证书等nginx原来就有的功能
从以下地址获取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就可以完成安装
这里结合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.Wang原创文章,转载无需和我联系,但请注明来自lokie博客http://lokie.wang