Kubernetes服务发布进阶
一. 基本概念
service 的作用体现在两个方面,对集群内部,它不断跟踪 pod 的变化,更新endpoint(端点)中对应 pod 的对象,提供了 ip 不断变化的 pod 的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对 pod 进行访问
在 Kubernetes 中,Pod 的 IP 地址和 service 的 ClusterIP 仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,Kubernetes 目前提供了以下几种方案:
NodePort:将 service 暴露在节点网络上,NodePort 背后就是 Kube-Proxy,Kube-Proxy 是沟通service 网络、Pod 网络和节点网络的桥梁。测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort 的端口管理就是个灾难。因为每个端口只能是一种服务,端口范围只能是30000-32767
LoadBalancer:通过设置 LoadBalancer 映射到云服务商提供的 LoadBalancer 地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。受限于云平台,且通常在云平台部署LoadBalancer 还需要额外的费用。在 service 提交后,Kubernetes 就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP 地址配置给负载均衡服务做后端
在这里插入图片描述
externalIPs:service 允许为其分配外部 IP,如果外部 IP 路由到集群中一个或多个 Node 上,Service 会被暴露给这些 externalIPs。通过外部 IP 进入到集群的流量,将会被路由到 Service 的Endpoint 上
Ingress:只需一个或者少量的公网 IP 和 LB,即可同时将多个 HTTP 服务暴露到外网,实现七层反向代理。可以简单理解为 service 的 service,它其实就是一组基于域名和 URL 路径,把用户的请求转发到一个或多个 service 的规则
注意:
目前比较流行的 Ingresscontroller有ingress-nginx(由 Kubemetes 官方维护)nginx-ingress(由 Nginx 官方维护,注意和 Ingress-nginx 的区别)、Traefik、Istio 等
- Ingress 组成
(1)ingress
ingress 是一个 API对象,通过 yam1 文件来配置,ingress 对象的作用是定义请求如何转发到service 的规则,可以理解为配置模板
ingress 通过 htp 或 htps 暴露集群内部 service,给 service 提供外部 URL、负载均衡、SSLTLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能
(2)ingress-controller
ingress-controller 是具体实现反向代理及负载均衡的程序,对ingress 定义的规则进行解析根据配置的规则来实现请求转发
ingress-controler 并不是k8s 自带的组件,实际上 ingress-controller 只是一个统称,用户可以选择不同的 ingress-controler实现,目前,由k8s 维护的 ingress-controller 只有 google云的 GCE 与 ingress-nginx 两个,其他还有很多第三方维护的 ingress-controler,具体可以参考官方文档。但是不管哪一种 ingress-controler,实现的机制都大同小异,只是在具体配置上有差异
一般来说,ingress-controler 的形式都是个 pod,里面跑着 daemon 程序和反向代理程序。daemon 负责不断监控集群的变化,根据 ingress 对象生成配置并应用新配置到反向代理比如ingress-nginx 就是动态生成 nginx 配置,动态更新 upstream,并在需要的时候reload 程序应用新配置
ingress-controler 才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controler,而ingress 对象是用来告诉 ingress-controller 该如何转发请求,比如哪些域名、哪些 URL 要转发到哪些 service 等等
- Ingress 工作过程
在这里插入图片描述
用户访问一个业务的流程如下
(1)用户在浏览器中输入域名
(2)域名解析至业务的入口 IP(一般为外部负载均衡器,比如阿里的 SLB 或者 DMZ 的网关)
(3)外部负载均衡器反向代理至kubernetes 的入口(一般为 Ingress,或者通过 NodePort 暴露的服务等)
(4)Ingress 根据自身的配置找到对应的 Service,再代理到对应的 Service 上
(5)最后到达 Service 对应的某一个 Pod 上
可见,在一般情况下,Ingress 主要是一个用户 kubernetes 集群业务的入口。是业务能够正常提供服务的核心,所以在生产环境中,推荐使用单独的服务器作为Ingress Controller。Controler 可以使用 Traefik、lstio、Nginx、HaProxy 等作为 Ingress controller。因为相对于其他 IngressController,管理人员更熟悉 Nginx 或者 HaProxy 等服务,所以本章主要讲解 Ingress Nginx的安装与常用配置,这也是 kubernetes 官方提供的 Ingress controller
- Ingress 工作原理
在这里插入图片描述
(1)ingress-controller 通过和 kubernetes APIServer 交互,动态的去感知集群中 ingress 规则变化
(2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个 service,生成一段 nginx 配置
(3)再写到 nginx-ingress-controller 的pod 里,这个 ingress-controller 的 pod 里运行着一个Nginx 服务,控制器会把生成的 nginx 配置写入 /etc/nginx.conf 文件中
(4)然后reload 一下使配置生效。以此达到域名区分配置和动态更新的作用
二. 安装 Ingress Nginx Controller
由于 IngrController相当干kubernetes 集群中服务的因此在生产环境中,定要保障Controller 的稳定性和可用性。为了提高 Ingress Controller 的可用性,我们-般采用单独的服务器作为Controller 节点,以此保障 Ingress controller 的 Pod 资源不会被其他服务的 Pod 影响
Ingress Nginx 官方提供了多种部署方式,本节课将采用 Helm 的方式进行安装,并且将 IngressController 安装在 k8s-node01节点
-
安装 helm
[root@k8s-master ~]# tar zxf helm-v3.9.4-linux-amd64.tar.gz
[root@k8s-master ~]# mv linux-amd64/helm /usr/local/bin/
[root@k8s-master ~]# helm version -
修改 Ingress controller 参数
(1)将controller 的registry 仓库地址修改为国内的
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
(2)修改 opentelemetry 镜像地址
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
(3)将 admissionwebhook 的镜像地址修改为国内的
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
(4)修改 hostNetwork 的值为 true
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
(5)dnsPolicy 设置为 clusterFirstWithHostNet
[root@k8s-master ~]# vim ingress-nginx/values.yaml
kubernetes 可以在 pod 级别通过 dnspolicy 字段设置 DNS 策略。目前支持的 DNS 策略如下:
DNS策略 说明
Default 继承 pod 所在宿主机的域名解析设置
ClusterFirst 将优先使用 kubernetes 环境的 dns 服务(如 coreDNS 提供的域名解析服务)将无法解析的域名转发到系统配置的上游 DNS 服务器
ClusterFirstwithHostNet 适用与以 hostNetwork 模式运行的 pod
None 忽略集群的 DNS 配置,需要手工通过 dnsconfig 自定义 DNS 配置。这个选项在 1.9 版本中None:开始引入,到 1.10 版本时升级为 Beta,到 1.14 版本时达到稳定版本
(6)nodeselector添加ingress:“true”
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
(7)修改 kind 类型为 Deamonset
[root@k8s-master ~]# vim ingress-nginx/values.yaml
AI写代码
bash
1
在这里插入图片描述
- 部署 Ingres
(1)给需要部署 Ingress controller 的节点打标签
[root@k8s-master ~]# ku label node k8s-node01 ingress=true
AI写代码
bash
1
在这里插入图片描述
(2)创建 namespace
[root@k8s-master ~]# ku create ns ingress-nginx
AI写代码
bash
1
在这里插入图片描述
(3)安装 ingress-nginx
[root@k8s-master ~]# cd ingress-nginx
[root@k8s-master ingress-nginx]# helm install ingress-nginx -n ingress-nginx .
[root@k8s-master ~]# ku get pod -n ingress-nginx -o wide
在这里插入图片描述
在这里插入图片描述
三. Ingress Nginx 使用入门
首先从最简单的配置开始,假如公司有一个 web 服务的容器,需要为其添加一个域名,此时可以使用Ingerss 实现该功能
-
创建 namespace
[root@k8s-master ~]# ku create ns study-ingress
AI写代码
bash
1
在这里插入图片描述 -
创建一个 nginx 作为 web 服务
[root@k8s-master ~]# ku create deployment nginx --image=nginx:1.7.9 -n study-ingress
AI写代码
bash
1
在这里插入图片描述 -
创建一个该 web 容器的 service
[root@k8s-master ~]# ku expose deployment nginx --port 80 -n study-ingress
AI写代码
bash
1
在这里插入图片描述 -
编辑 Ingress
[root@k8s-master ~]# vim web-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: study-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
- backend:
备注:路径类型
有3种支持的 path 类型:
类型 说明
Implementationspecific 对于这种 path 类型,匹配取决于 Ingressclass。可以将其视为一个单独的 pathType 或者将其认为和 Prefix 或者 Exact 路径类型一样
Exact 精确匹配 URL 路径,并且区分大小写
Prefix 根据 URL 中的,被/分割的前缀进行匹配。匹配区分大小写并且按照元素对路径进行匹配。path 元素指的是路径中由/分隔符分隔的标签列表。即只要用户请求的路径以指定的路径开始即可
注意:如果路径的最后一个元素是请求路径中最后一个元素的子字符串,那么这个是不匹配的。【举例:/foo/bar 匹配/foo/bar/baz,但是不匹配/foo/barbaz
- 创建 Ingress
[root@k8s-master ~]# ku create -f web-ingress.yaml
AI写代码
bash
1
在这里插入图片描述
注意:不要删除此 ingress,否则,后面的 ssl 无法访问
- 客户端测试
创建的 Ingress 绑定的域名为 nginx.test.com,由于本书的 Ingresscontroller 是以hostNetwork 模式部署的,因此将域名解析至 Ingresscontroller 所在的节点即可。如果Ingresscontroller 上层还有一层网关,解析至网关 IP 即可。接下来通过域名 nginx.test.com 即可访问 web 服务器
①:修改 hosts 文件
在这里插入图片描述
②:测试默认 nginx 页面
在这里插入图片描述
③:修改nginx的网页文件
在这里插入图片描述
④:测试 修改过的 nginx 网页文件
在这里插入图片描述
可以看到通过上述简单的 Ingress 资源定义就可以实现以域名的方式访问服务,不需要再去维护复杂的 Ngmx 配置文件,大大降低了运维的复杂度和出错的频率
四. Ingress Nginx实现域名重定向 Redirect
当一个服务需要更换域名时,并不能对其直接更改,需要一个过渡的过程。在这个过程中,需要将旧域名的访问跳转到新域名,此时可以使用 Redirect 功能。待旧域名无访问时,再停止旧域名
在 Neinx作为代理服务器时,Redirect可用于域名的重定向,比如访问old.com被重定向到new.com。Ingress 可以更简单地实现 Redirect 功能。接下来用 nginx.redirect.com 作为旧域名,baidu.com作为新域名进行演示
- 编辑 Ingress
[root@k8s-master ~]# vim redirect.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com
name: nginx-redirect
namespace: study-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.redirect.com
http:
paths:- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
- backend:
-
创建 Ingress
[root@k8s-master ~]# ku create -f redirect.yaml -
客户端测试
在客户端的 hosts 文件添加域名 nginx.redirect.com,IP 地址为 k8s-node01 节点的 IP 地址。使用域名 nginx.redirect.com 访问网站,打开的是 baidu,com,说明跳转成功
①:修改 hosts 文件
在这里插入图片描述
②:浏览器测试
在这里插入图片描述
五. Ingress Nginx实现可后端分离 Rewrite
现在大部分应用都是前后端分离的架构,也就是前端用某个域名的根路径进行访问,后端接口采用/api 进行访问,用来区分前端和后端。或者同时具有很多个后端,需要使用/api-a到A服务,/api-b到B服务,但是由于A和B服务可能并没有/api-a和/api-b的路径,因此需要将/api-x重写为“/”才可以正常到A或者B服务,否则将会出现 404 的报错。此时可以通过 Rewrite 功能达到这种效果
-
创建一个应用模拟后端服务
[root@k8s-master ~]# ku create deployment backend-api --image=nginx:1.7.9 -n study-ingress -
创建 service 暴露应用
[root@k8s-master ~]# ku expose deployment backend-api --port 80 -n study-ingress -
查看 service 的地址,并通过/api-a访问测试
-
编辑 Ingress,实现rewrite
[root@k8s-master ~]# vim rewirte.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: backend-api
namespace: study-ingress
spec:
ingressClassName: nginx
rules:
- host: nginx.test.com
http:
paths:- backend:
service:
name: backend-api
port:
number: 80
path: /api-a(/|$)(.*)
pathType: ImplementationSpecific
- backend:
annotations: ##用来定义 ingress 控制器的行为,具体行为如下
nginx.ingress.kubernetes.io/rewrite-target:/$2
##用于重写 URL,使得传入的请求在转发给后端服务之前,其路径部分会被修改。本案例中当用户访问nginx.test.com/api-a/xxxx 的时候,都被重定向为nginx.test.com/api-anginx.test.com/api-a指向了 service 名称为 backend-api 的后端 pod
path:/api-a(/| $ )(.*):这个路径使用正则表达式来匹配请求。这里有两个捕获组:
第一个捕获组(/| $ )匹配 /或者以 api-a 结尾
第二个捕获组(.*)匹配任意字符串,表示/api-a之后的路径部分,此处表示任意路径名称。$2 指的是匹配第二个捕获组
-
创建 Ingress
[root@k8s-master ~]# ku create -f rewirte.yaml
AI写代码
bash
1
在这里插入图片描述 -
客户端测试
访问前端:http://nginx.test.com
在这里插入图片描述
访问后端:http://nginx.test.com/api-a
在这里插入图片描述
六. Ingress Nginx 实现 SSL 配置
生产环境对外的服务一般需要配置 HTTPS 协议,使用 Ingress 也可以非常方便地添加 HTTPS 的证书
- 生成证书
[root@k8s-master ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj “/CN=nginx.test.com”
AI写代码
bash
1
在这里插入图片描述
备注:
命令字 含义
openssl req 这是 0penSsl 的请求(request)子命令,用于创建一个新的 x.509 证书请求或者直接创建一个自签名证书
-x589 这个选项告诉 openssL 创建一个自签名证书,而不是一个证书签名请求(CSR)
-nodes 此选项表示在生成密钥时不应加密密钥。这样生成的私钥将不会要求密码来解密,方便自动处理,但也意味着安全性较低,不适合生产环境
-days 365 指定自签名证书的有效期为 365 天。这表示证书将在一年后过期
-newkey rsa 2048:这个选项指示 0penssl 生成一个新的 RSA 密钥对,其中密钥长度为 2048 位。这是一个常见的安全密钥长度
-keyout tls.key 指定生成的私钥文件名。在这个例子中,私钥将被保存为 tls.key 文件
-out tls.crt 指定输出的证书文件名。生成的自签名证书将被保存为 tls.crt 文件
subi"/CN=nginx.test.com" 这是证书的主题(subject)字段
2. 创建证书的 secret
[root@k8s-master ~]# ku create secret tls ca-secret --cert=tls.crt --key=tls.key -n study-ingress
AI写代码
bash
1
在这里插入图片描述
- 编辑 Ingress
[root@k8s-master ~]# vim ingress-ssl.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
creationTimestamp: null
name: nginx-ingress-ssl
spec:
ingressClassName: nginx-ssl
rules:
- host: nginx.test.com
http:
paths:- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- backend:
- hosts:
- nginx.test.com
secretName: ca-secret
AI写代码
bash
- nginx.test.com
-
创建 Ingress
[root@k8s-master ~]# ku create -f ingress-ssl.yaml
AI写代码
bash
1
在这里插入图片描述 -
客户端测试
浏览器访问:https://nginx.test.com
在这里插入图片描述
在这里插入图片描述
七. Ingress Nginx 实现基本认证
-
安装 httpd-tools
[root@k8s-master ~]# dnf -y install httpd-tools
AI写代码
bash
1
在这里插入图片描述 -
使用 htpasswd 创建用户
[root@k8s-master ~]# htpasswd -c auth zhangsan
bash
1
-
基于密码文件创建 secret
-
编辑 Ingress
[root@k8s-master ~]# vim ingress-with-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-realm: Please Input Your Username and Password
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-type: basic
name: ingress-with-auth
namespace: study-ingress
spec:
ingressClassName: nginx
rules:
- host: auth.test.com
http:
paths:- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecifi
- backend:
Kubernetes(K8S) 入门进阶实战完整教程
JustinMars的博客
3749
Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响 虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境 优点:程序环境不会相互产生影响,提供了一定程度的安全性 缺点:增加了操作系统,浪费了部分资源 容器化部署:
kubernetes服务发布进阶
悟已往之不谏
433
ingress-controller 并不是 k8s 自带的组件,实际上 ingress-controller 只是一个统称,用户可以选择不同的 ingress-controller 实现,目前,由 k8s 维护的 ingress-controller 只有 google云的 GCE与 ingress-nginx 两个,其他还有很多第三方维护的 ingress-controller,具体可以参考官方文档。使用域名 nginx.redirect.com 访问网站,打开的是 baidu.com,说明跳转成功。
Kubernetes服务发布进阶
2302_79420346的博客
780
在 Kubernetes 中,服务暴露是集群与外部世界通信的关键环节。Kubernetes 提供了多种服务暴露的方式,其中 Ingress 作为一种灵活且强大的解决方案,逐渐成为生产环境中的首选。Ingress 不仅能够通过域名的方式访问集群内部的应用,还提供了负载均衡、SSL 终结、基于名称的虚拟主机等高级功能。与传统的 LoadBalancer 和 NodePort 相比,Ingress 更加适合复杂的微服务架构,尤其是在需要管理大量服务和域名的场景下1。
Kubernetes基础与进阶教程
07-11
Kubernetes基础与进阶教程知识点总结 #### 一、Kubernetes概述与架构 Kubernetes简介: Kubernetes,简称K8s,是一款由Google在2014年发起的开源容器编排平台,旨在自动化容器应用的部署、扩展和管理。自…
《Kubernetes Operator 开发进阶》- 作者絮絮叨
farmer_hutao的博客
1601
Kubernetes Operator 开发进阶》终于和读者朋友们见面了! 本书介绍?送书活动?你想知道的都在这篇文章里!
Kubernetes集群管理进阶:应用场景与实战部署
而Kubernetes,即K8s,是由Google公司主导开发的开源容器编排平台,它在容器化服务编排领域中占据着举足轻重的地位。今天我们将从几个方面对Kubernetes集群从入门到结束的整个过程进行深入探讨。 首先,Kubernetes…
Kubernetes快速进阶与实战-实践手册
10-27
Kubernetes的目标是自动化容器化应用的部署、扩展和管理,使开发者可以更高效地构建、发布和运行分布式应用程序。 1. 集群架构:Kubernetes集群由Master节点和Worker节点组成。Master节点负责集群的全局管理和…
容器编排K8S
本专栏主要内容:会持续更新 1.安装篇:kubeadm和二进制包安装 2.基础篇:基本概念、服务发布、配置管理 3.进阶篇:存储、资源调度、准入和权限控制 4.高级篇:存储进阶、Operator、Helm 5.运维篇:EFK、
一. 基本概念
- Ingress 组成
- Ingress 工作过程
- Ingress 工作原理
二. 安装 Ingress Nginx Controller - 安装 helm
- 修改 Ingress controller 参数
- 部署 Ingres
三. Ingress Nginx 使用入门 - 创建 namespace
- 创建一个 nginx 作为 web 服务
- 创建一个该 web 容器的 service
- 编辑 Ingress
- 创建 Ingress
- 客户端测试
四. Ingress Nginx实现域名重定向 Redirect - 编辑 Ingress
- 创建 Ingress
- 客户端测试
五. Ingress Nginx实现可后端分离 Rewrite - 创建一个应用模拟后端服务
- 创建 service 暴露应用
- 查看 service 的地址,并通过/api-a访问测试
- 编辑 Ingress,实现rewrite
- 创建 Ingress
- 客户端测试
六. Ingress Nginx 实现 SSL 配置 - 生成证书
- 创建证书的 secret
- 编辑 Ingress
- 创建 Ingress
- 客户端测试
七. Ingress Nginx 实现基本认证 - 安装 httpd-tools
- 使用 htpasswd 创建用户
- 基于密码文件创建 secret
- 编辑 Ingress
- 创建 Ingress
- 客户端测试