【K8s】服务暴露插件ingress-controller部署指南(一)

部署环境:k8s_v1.20.2ingress-nginx-controller-v1.0.0DaemonSet+HostNetwork

【K8s】服务暴露插件ingress-controller部署指南(二)介绍了Deployment+NodePort模式的Service部署。

目录

一、了解ingress功能及原理

二、kubernetes发布服务的服务类型

三、准备容器化部署的yaml文件及镜像

准备yaml文件

准备镜像

四、部署ingress-nginx-controller

五、测试

 六、参考

七、说在最后


一、了解ingress功能及原理

虽然service或者pod都可以直接通过NodePort将端口直接映射到Node节点,但是大量pod使用映射方式无疑会带来巨大的管理压力,大范围使用非标端口会造成管理困难,Node节点映射太多端口也会带来安全隐患。

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:

【K8s】服务暴露插件ingress-controller部署指南(一)_第1张图片

可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

二、kubernetes发布服务的服务类型

Kubernetes ServiceTypes 允许指定你所需要的 Service 类型,默认是 ClusterIP。

Type 的取值以及行为如下:

  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType。
  • NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
  • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。
  • ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。

说明: 你需要使用 kube-dns 1.7 及以上版本或者 CoreDNS 0.0.8 及以上版本才能使用 ExternalName 类型。

你也可以使用 Ingress 来暴露自己的服务。 Ingress 不是一种服务类型,但它充当集群的入口点。 它可以将路由规则整合到一个资源中,因为它可以在同一IP地址下公开多个服务。

本例中选用ClusterIP方式发布ingress-controller,并且直接将ingress-controller的Port 80/443端口映射到Node节点

三、准备容器化部署的yaml文件及镜像

Kubernetes 作为一个项目,目前支持和维护 AWS, GCE 和 nginx Ingress 控制器。

其它支持的控制器请参阅Ingress 控制器

准备yaml文件

这里使用的是DaemonSet+HostNetwork模式,如使用Deployment+NodePort模式的Service部署,这一章节请参阅【K8s】服务暴露插件ingress-controller部署指南(二)

github官方地址

  • 注释注解
  • 【K8s】服务暴露插件ingress-controller部署指南(一)_第2张图片
  • 修改type: ClusterIP
  • 增加hostNetwork: true
  • 注释- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller

准备镜像

image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6
image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068

官方deploy.yaml文件中的imgae地址均为境外,本文提供了dockerhub的下载地址。(感谢群友帮忙下载,由本人上传至dockerhub)

docker pull serenade11/ingress-nginx-controller:v1.0.0
docker pull serenade11/kube-webhook-certgen:v1.0

下载后在deploy.yaml文件的image项填写对应的路径。

四、部署ingress-nginx-controller

kubectl apply –f deploy.yaml

部署完成,两个ingress-nginx-admission-* Pod是completed状态。

根据Node数量生成的ingress-nginx-controller-* Pod为Running状态。

【K8s】服务暴露插件ingress-controller部署指南(一)_第3张图片

Node节点查看监听端口,发现80和443端口已经处于监听状态。

netstat –lntp

在本地pc的hosts文件增加静态域名解析:NodeIP nginx.k8s.com

浏览器访问nginx.k8s.com,回显如下图,在ingress-controller找不到后端pod时,即显示该页面。

【K8s】服务暴露插件ingress-controller部署指南(一)_第4张图片

五、测试

创建一个Pod

vim nginx.yaml 
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-controller
spec:
  replicas: 1
  selector:
    name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: serenade11/nginx:curl
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: ClusterIP
  selector:
    name: nginx

kubectl apply -f nginx.yaml
kubectl get pod

此时一个nginx的pod和service已经创建完成
但是还需要创建一个ingress用于指定使用ingress-controller代理访问该Pod
指定访问域名为nginx.k8s.com。 

vim nginx-ingress.yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-service
spec:
  rules:
  - host: "nginx.k8s.com"
    http:
      paths:
      - pathType: ImplementationSpecific
        path:
        backend:
          service:
            name: nginx-service
            port:
              number: 80

kubectl apply -f nginx.yaml

回到PC机访问ngxin.k8s.com发现页面没变,清除缓存访问依然无效,
查看ingress-controller的Pod日志。

kubectl logs -f ingress-nginx-controller-6ngqs -n ingress-nginx

提示ingress资源未指定IngressClass。
查看官方提供的deploy中确实有创建IngressClass,但是指定了namespace:ingress-nginx
于是将该部分内容复制出来,用于在default空间也创建一个IngressClass。

vi ingressclass_default.yaml
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.1
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: nginx-default
  namespace: nginx
spec:
  controller: k8s.io/ingress-nginx

kubectl apply -f ingressclass_default.yaml

 修改nginx-ingress.yaml,指定ingressClassName使用刚才创建的class:nginx-default

spec:
  ingressClassName: nginx-default
  rules:

 apply一下yaml文件

 kubectl apply –f nginx-ingress.yaml

查看ingress状态,确认Address字段已经显示NodeIP。 

【K8s】服务暴露插件ingress-controller部署指南(一)_第5张图片

在PC浏览器重新访问ngxin.k8s.com,已经可以显示。

【K8s】服务暴露插件ingress-controller部署指南(一)_第6张图片

 六、参考

kubernetes docs
yaml文件查找及使用
ingress-controller部署模式
ingress-controller部署

七、说在最后

大家参阅中有疑问的欢迎一起讨论,在讨论中共同成长!

你可能感兴趣的:(kubernetes,kubernetes,docker,容器)