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 rsa2048:这个选项指示 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
- 客户端测试