K8s------Metallb实现Load Balancer服务
https://metallb.universe.tf/installation/kubectl edit configmap -n kube-system kube-proxykubectl get pod -n kube-system |grep kube-proxy | awk ‘{system(“kubectl delete pod “$1” -n kube-system”)}’wget
1 Metallb 的介绍
k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer
Metallb的作用就是通过k8s原生的方式提供LB类型的Service支持,开箱即用。
Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的 LoadBalancer 服务运行,并且没有可申请的负载均衡器之后,就会完成两部分的工作:
- 地址分配:用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务
- 地址广播:根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播
官网:https://metallb.universe.tf/installation/
2 Metallb工作模式
Metallb支持两种工作模式:Layer2模式和BGP模式
(1)Layer2模式
Metallb在这种模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。
缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。
BGP模式
这种模式需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。
缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。
3 Metallb 的部署
(1)编辑kube-proxy:
kubectl edit configmap -n kube-system kube-proxy
- 重载使配置生效:
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
- 创建命名空间:
kubectl apply -f namespace.yaml
- 创建secret:
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
(2)下载metallb的应用文件:
wget https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
- 将安装metallb所需的镜像上传至私有仓库
- 修改metallb的应用文件
(3)应用文件: kubectl apply -f metallb.yaml
- 查看命名空间:
kubectl get ns
(4)编辑ConfigMap文件:vim config.yml
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.25.12.100-172.25.12.200
- 应用文件:
kubectl apply -f config.yml
(5)测试:
[root@server2 ~]# kubectl get svc # 查看服务
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d12h
myservice ClusterIP 10.102.183.155 <none> 80/TCP 12h
nginx-svc LoadBalancer 10.106.176.102 172.25.12.100 80:32311/TCP 12h
curl 10.106.176.102/hostname.html
curl 172.25.12.100/hostname.html
- 应用文件:
kubectl apply -f demo-svc.yml
,创建服务和pod
---
apiVersion: v1
kind: Service
metadata:
name: demo-svc
spec:
selector:
app: demo
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-dep
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: myapp:v1
测试:
[root@server2 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-svc LoadBalancer 10.110.166.42 172.25.12.101 80:32456/TCP 28s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d12h
myservice ClusterIP 10.102.183.155 <none> 80/TCP 13h
nginx-svc LoadBalancer 10.106.176.102 172.25.12.100 80:32311/TCP 12h
[root@server2 ~]# curl 10.110.166.42
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# curl 10.106.176.102
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl get pod -L app
NAME READY STATUS RESTARTS AGE APP
demo-6d4f5bf58f-djlnv 1/1 Running 0 12h nginx
demo-6d4f5bf58f-r49bq 1/1 Running 0 12h nginx
demo-6d4f5bf58f-ztt7j 1/1 Running 0 12h nginx
demo-dep-6b46986cc6-2hw9d 1/1 Running 0 51s demo
demo-dep-6b46986cc6-nxtbp 1/1 Running 0 51s demo
demo-dep-6b46986cc6-z4klp 1/1 Running 0 51s demo
deployment-59dff4cf5d-fnhhb 1/1 Running 0 13h myapp
deployment-59dff4cf5d-h56kz 1/1 Running 0 13h myapp
deployment-59dff4cf5d-j7b7h 1/1 Running 0 13h myapp
- 应用文件:
kubectl apply -f deploy.yaml
应用文件:kubectl apply -f nginx-svc.yml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
查看服务的信息:kubectl get svc
查看指定命名空间的服务信息:kubectl -n ingress-nginx get svc
应用文件:kubectl apply -f ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: www1.westos.org
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
查看ingress的信息:kubectl get ingress
过滤端口:netstat -antl|grep :80
,外部访问服务不是通过暴露端口实现
查看ingress-demo 的详细信息:kubectl describe ingress ingress-demo
测试:
- 编辑测试主机的dns解析文件
- 查看pod的信息
- 可以通过域名访问服务
(2)加密
原理:client——>vip(metallb)——>ingress-nginx——>nginx-svc——>pod
(1)生成加密文件:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=www1.westos.org/O=www1.westos.org" kubectl create secret tls tls-secret --key tls.key --cert tls.crt
(2)应用文件:kubectl apply -f ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-demo
spec:
tls:
- hosts:
- www1.westos.org
secretName: tls-secret
rules:
- host: www1.westos.org
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
- 查看ingress-demo的详细信息:
kubectl describe ingress ingress-demo
测试
- 加密后不能通过域名访问服务
在浏览器端访问:忽略警告后可以在浏览器页面访问
更多推荐
所有评论(0)