1、K8S集群部署MetaLLB
https://github.com/metallb/metallb
MetalLB是一款开源的云原生负载均衡器实现,可以在基于裸金属服务器或虚拟机的Kubernetes 环境中使用LoadBalancer类型的Service对外暴露服务。
- MetalLB核心功能的实现依赖于两种机制:地址分配:基于指定的地址池进行分配;
- 对外公告:让集群外部的网络了解新分配的IP地址,MetalLB使用ARP、NDP或BGP实现
部署步骤:
# MetalLB是一款开源的云原生负载均衡器实现,可以在基于裸金属服务器或虚拟机的Kubernetes 环境中使用LoadBalancer类型的Service对外暴露服务。MetalLB核心功能的实现依赖于两种机制:地址分配:基于指定的地址池进行分配;对外公告:让集群外部的网络了解新分配的IP地址,MetalLB使用ARP、NDP或BGP实现
kubectl get configmap kube-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" | kubectl apply -f - -n kube-system
# 部署metallb
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/refs/heads/main/config/manifests/metallb-native.yaml
MetalLB默认将其各组件部署于metallb-system名称空间下,运行如下命令,打印各Pod的运行状态 。
kubectl get pods -n metallb-system
待如上各Pod转为Running状态后,即可进行后续的步骤
# 创建地址池,MetalLB提供了名为IPAddressPool的自定义资源类型,它允许用户以声明式方式定义用于分给LoadBalancer的IP地址范围。下面是一个IPAddressPool资源示例,它所选定的地址范围是当前集群节点网络中的一个空闲地址空间
vim metallb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: localip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.139.101-192.168.139.200
autoAssign: true
avoidBuggyIPs: true
# 部署地址池资源
kubectl apply -f metallb-ip-pool.yaml
# 查看是否部署成功
kubectl get IPAddressPool -n metallb-system
NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES
localip-pool true true ["192.168.139.101-192.168.139.200"]
# 创建二层公告机制:将地址池中的某地址配置在某节点上,并以externalIP的形式分配给某LoadBalancer使用之前,需要向整个本地网络通告该地址相关的ARP地址信息。具体使用时,请将如下示例中的interfaces修改为集群中各节点上实际使用的接口名称。
vim localip-pool-l2a.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: localip-pool-l2a
namespace: metallb-system
spec:
ipAddressPools:
- localip-pool
interfaces:
- ens33
# 部署localip-pool-l2a.yaml
kubectl apply -f localip-pool-l2a.yaml
# 查看是否部署成功
kubectl get L2Advertisement -n metallb-system
# 创建LB Service进行测试
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=2
kubectl create service loadbalancer demoapp --tcp=80:80
# 运行如下命令,查看service资源对象demoapp上是否自动获得了External IP
kubectl get svc demoapp
# 其结果应该类似如下内容,这表明EIP地址分配已经能够正常进行,即可于集群外部的客户端上通过IP地址“192.168.139.101”对demoapp服务发起访问测试
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp LoadBalancer 10.108.253.82 192.168.139.101 80:30753/TCP 90s
2、K8S集群部署OpenELB(建议使用第一个附件MetaLLB)
https://github.com/openelb/openelb
OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务
# 获取yaml文件
wget https://ghfast.top/https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml
# 部署OpenELB
kubectl apply -f openelb.yaml
创建了一个Eip资源对象,它提供了一个地址池给LoadBalancer Service使用
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
name: eip-pool
annotations:
eip.openelb.kubesphere.io/is-default-eip: "true"
# 指定当前Eip作为向LoadBalancer Server分配地址时使用默认的eip对象;
spec:
address: 192.168.139.80-192.168.139.90
# 地址范围,也可以使用单个IP,或者带有掩码长度的网络地址,需要是k8snode节点同网段的IP但未被使用的IP地址;
protocol: layer2
# 要使用的OpenELB模式,支持bgp、layer2和vip三种,默认为bgp;
interface: ens33
# OpenELB侦听ARP或NDP请求时使用的网络接口名称,仅layer2模式下有效,名字需要是k8s节点上的网卡名;
disable: false
部署Eip资源
kubectl apply -f eip.yaml
#可查看验证EIP是否成功部署
kubectl get eip eip-pool -o yaml
创建Deployment和LoadBalancer Service,测试地址池是否已经能正常向Service分配LoadBalancer IP。
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=2
# 编辑svc文件,注解处与eip名称一致为eip-pool
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
lb.kubesphere.io/v1alpha1: openelb
eip.openelb.kubesphere.io/v1alpha2: eip-pool
labels:
app: demoapp
name: demoapp
namespace: default
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: demoapp
type: LoadBalancer
# 部署svc
kubectl apply -f svc.yaml
# 运行如下命令,查看service资源对象demoapp上是否自动获得了External IP
kubectl get service demoapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp LoadBalancer 10.103.100.243 192.168.139.91 80:30290/TCP 4m25s
#此时可通过访问 EXTERNAL-IP 里面的地址的方式访问pod服务了
curl 192.168.139.91
3、部署Ingress-nginx
ingress-nginx Github官网
https://github.com/kubernetes/ingress-nginx
# 部署ingress-nginx,注意ingress-nginx版本支持的k8s版本
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.2/deploy/static/provider/cloud/deploy.yaml
#修改deploy.yaml文件内的如下内容,将Local改成Cluster
externalTrafficPolicy: Cluster
# 然后部署ingress-nginx-controller
kubectl apply -f deploy.yaml
# 部署ingress,测试是否可通过域名访问到k8s集群内的服务
kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=2
kubectl create service clusterip demoapp --tcp=80:80
# 编写ingress文件
vim ingress-demoapp.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demoapp
annotations:
kubernetes.io/ingress.class: "nginx" ##指定Ingress Controller类型
spec:
rules:
- host: www.demoapp.com
http:
paths:
- backend:
service:
name: demoapp
port:
number: 80
path: /
pathType: Exact
# 部署ingress
kubectl apply -f ingress-demoapp.yaml
# 查看是否成功
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
demoapp <none> www.demoapp.com 192.168.139.102 80 92s
4、部署Metrics Server
Metrics Server用于为Kubernetes集群提供核心指标API。它存在单实例部署和高可用部署两种模式,相应的资源配置文件名称分别为components.yaml和high-availability-1.21+.yaml。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml
# 提示:Metrics Server基于https协议从各节点收集指标,同各节点的10250端口建立通信连接之前,它会验证各节点的数字证书。这些数字证书中的CN通常是节点名称,因此,若Kubernetes集群上的Pod无法通过DNS服务解析到各节点的主机名,该验证将返回失败信息,并导致指标收集操作无法完成。此种情况下,可以通过修改资源配置文件中启动Metrics Server进行的命令行选项来完成。
# 具体方法是,首先将“--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname”选项修改为“--kubelet-preferred-address-types=InternalIP”,或额外添加“--kubelet-insecure-tls”选项。修改后的配置片断示例如下。
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.k8s.io/metrics-server/metrics-server:v0.7.2
# 待metrics-server的Pod状态转为Running后,即可运行下面的命令,了解Kubernetes集群中各节点的指标数据信息。而将命令中的nodes替换为pods,即可打印Pods相关的资源指标数据。
kubectl top nodes
5、部署argo-cd
云原生时代的持续部署工具,实现gitops的重要工具
https://github.com/argoproj/argo-cd
# 进入到argo-cd项目的指定版本号页面,可以看到部署的命令
https://github.com/argoproj/argo-cd/releases/tag/v3.0.5
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.0.5/manifests/install.yaml
# 配置argo-cd外部访问,将svc代理模式改为LoadBalancer,前提是配置了matllb的地址池,或者改成nodePort类型
kubectl edit svc argocd-server -n argocd
type: LoadBalancer
# 访问账号密码:
默认账号: admin
密码:
kubectl get secret -n argocd argocd-initial-admin-secret -o jsonpath="{.data.password}"|base64 -d
# 修改默认admin密码
# 1、需要部署argocd命令
wget https://github.com/argoproj/argo-cd/releases/download/v3.0.5/argocd-linux-amd64
chmod +x argocd-linux-amd64
mv argocd-linux-amd64 /usr/local/bin/argocd
# 2、修改密码前需要使用argocd命令先登录
argocd login svc暴漏出来的地址即可,根据提示输入账号,密码即可
# 3、修改密码
argocd account update-password
作者:于浩 创建时间:2025-05-30 14:21
最后编辑:于浩 更新时间:2025-06-10 18:08
最后编辑:于浩 更新时间:2025-06-10 18:08