上回,我们介绍如何利用k3s 快速构建边缘云计算,IOT物联网云计算能力,这回,我们谈谈k3s的负载均衡和Ingress应用能力。我们知道,k8s中,如果要使用负载均衡,得需要第三方云厂商或自建负载均衡,在边缘云计算和IOT物联网环境,一般是不具备这个条件的。但是,K3S提供了负载均衡能力和Ingress能力,下面我们探讨下怎么实现。
1、k3s提供负载均衡能力,为每个服务在每个k3s Node节点上都部署endpoint svclb-*,他负责node流量转发。如下图所示:Pod: svclb-kubernetes-dashboard* 提供kubernetes-dashboard服务负载均衡接入,Pod: svclb-traefik-* 提供traefik服务负载均衡接入。
kubectl -n kube-system get pod
NAME READY STATUS RESTARTS AGE
helm-install-traefik-crd-4n4bg 0/1 Completed 0 16d
traefik-56b8c5fb5c-9kn9z 1/1 Running 1 (14d ago) 16d
svclb-traefik-dd414390-jfngv 2/2 Running 2 (14d ago) 16d
coredns-59b4f5bbd5-hjn7n 1/1 Running 1 (14d ago) 16d
local-path-provisioner-76d776f6f9-8b8s9 1/1 Running 2 (14d ago) 16d
metrics-server-7b67f64457-vfvkj 1/1 Running 2 (14d ago) 16d
helm-install-traefik-5ztnb 0/1 Completed 0 42h
svclb-kubernetes-dashboard-783f186f-r9zvm 1/1 Running 0 17m
kubectl -n kube-system get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 16d
metrics-server ClusterIP 10.43.90.100 <none> 443/TCP 16d
traefik LoadBalancer 10.43.111.236 10.0.0.254 80:30058/TCP,443:30470/TCP 16d
kubectl -n kubernetes-dashboard get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard LoadBalancer 10.43.149.182 10.0.0.254 1443:32270/TCP 42h
现在以kubernetes-dashboard应用为例说明整个数据流流程。
当外部请求访问k3s的集群服务时:
首先,请求->node 的port: 1443, 然后,node 的iptables规则定义:转发1443流量到32270,32270就是kubernetes-dashboard服务入口,这样就实现外请求访问k3s服务功能。
iptables -t nat -L |grep 32270
KUBE-EXT-CEZPIJSAUFW5MYPQ tcp -- anywhere anywhere /* kubernetes-dashboard/kubernetes-dashboard */ tcp dpt:32270
在浏览器输入node IP:Port,就可实现通过负载均衡访问k3s内部服务啦!
2、k3s提供Ingress能力,默认情况下,k3s提供traefik ingress能力( 也可以采用nginx ingress)。
上面我们已经知道k3s会创建一个负载均衡:svclb-traefik,有了这个负载均衡器,同时,也提供Traefik ingress controller: traefik-*
kubectl -n kube-system get pod |grep traefik
helm-install-traefik-crd-4n4bg 0/1 Completed 0 16d
traefik-56b8c5fb5c-9kn9z 1/1 Running 1 (14d ago) 16d
svclb-traefik-dd414390-jfngv 2/2 Running 2 (14d ago) 16d
helm-install-traefik-5ztnb 0/1 Completed 0 42h
2) traefik dashbaord
kubectl -n kube-system port-forward deployment/traefik 9000:9000
3)、测试Ingress
编辑 nginx-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
name: nginx
targetPort: 80
type: ClusterIP
selector:
# apply service to any pod with label app: nginx
app: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: nginx.h2lcloud.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
执行并检查状态
kubectl apply nginx-deployment.yaml
kubectl get pod,svc,ing
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-85996f8dbd-brf2l 1/1 Running 0 38h
pod/nginx-deployment-85996f8dbd-l2jsl 1/1 Running 0 38h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 16d
service/nginx-svc ClusterIP 10.43.85.222 <none> 80/TCP 38h
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/nginx-ingress traefik nginx.h2lcloud.com 10.0.0.254 80 148m
4)、从浏览器检验访问
恭喜您,您的k3s 已经具备负载均衡和Ingress功能,可以采用负载均衡和Ingress发布应用了!!!