昨天介绍分享了存储模块信息获取的开发,那么下一步就是比较重要的的一个部分就是负载均衡模块的信息获取开发,原理还是使用客户端调用K8s集群API获取ingress相关的信息,但是获取之前,需要集群内已经安装部署了ingress服务。
那么先来介绍下什么是ingres:
官方对于ingress的介绍在服务、负载均衡和联网模块下
代码语言:javascript复制https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
官网给出的图很明了, Ingress控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
实现ingress所说的这些功能,需要有一个ingress控制器,例如ingress-nginx,也可以选择其他ingress控制器,这里有详细的控制器列表,可以查看:
代码语言:javascript复制https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
怎么部署ingress-nginx控制器呢:
以下为官网安装指南:
代码语言:javascript复制https://kubernetes.github.io/ingress-nginx/deploy/
1、如果有helm,使用以下命令安装
代码语言:javascript复制helm upgrade --install ingress-nginx ingress-nginx
--repo https://kubernetes.github.io/ingress-nginx
--namespace ingress-nginx --create-namespace
如果没有helm,就是用yaml方式安装:
代码语言:javascript复制kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
截止目前(5月23)最新版本为1.7.1
2、安装过程中肯定会出现镜像下载问题,因为这是国外的资源,网络不可达
所以将其中镜像仓库的地址替换为我从官方同步过来的镜像地址:
代码语言:javascript复制image: cilliandevops/ingress-nginx-controller:v1.7.1
image: cilliandevops/kube-webhook-certgen:v1.7.1
不会的话,后台私信获取已修改好的yaml文件
3、部署
修改完之后部署结果如上就是成功了,然后进行测试。
4、本地测试
建一个简单的 Web 服务器和相关服务:
部署一个httpd应用作为后端服务:
代码语言:javascript复制kubectl create deployment demo --image=httpd --port=80
暴露该应用的Service:
代码语言:javascript复制kubectl expose deployment demo
创建一个Ingress资源,匹配/*路径并转发到demo服务的80端口:
代码语言:javascript复制kubectl create ingress demo-localhost --class=nginx
--rule="demo.localdev.me/*=demo:80"
访问一下
代码语言:javascript复制http://demo.localdev.me
,显示如下就表明部署成功了,但前提是你已经将ingress控制器暴露为nodeport类型,以供访问。
那么如何使用go获取ingress列表信息呢?
给出示例代码:
代码语言:javascript复制package main
import (
"context"
"fmt"
networkingv1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func main() {
// 定义namespace变量
namespace := "default"
// 创建Kubernetes客户端配置
config, err := rest.InClusterConfig()
if err != nil {
panic(err.Error())
}
// 创建Kubernetes客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
// 获取指定Namespace下的Ingress资源列表
ingresses, err := clientset.NetworkingV1().Ingresses(namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
// 打印Ingress信息
for _, ingress := range ingresses.Items {
fmt.Printf("Name: %vn", ingress.Name)
fmt.Printf("Namespace: %vn", ingress.Namespace)
}
}
运行结果如下:
- 名称为demo-localhost
- Namespace为default
- 配置了一条规则,demo.localdev.me
- 该规则有一条路径/,将流量转发至demo Service的80端口
- 没有Annotation和TLS配置
看看到底是不是呢:
好了,今天的分享就到这了,祝学习顺利!