Kubernetes 使用 ingress 配置 https 集群(十五)

本文详细介绍了如何在Kubernetes集群中利用Ingress资源进行HTTPS升级,从创建后端Pod到部署Ingress Controller,再到生成SSL证书和配置TLS,最终实现通过HTTPS访问集群内的服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、背景

1.1 需求

我们有这样的一个需求,就是把 Pod 集群升级为 https,目前的办法就是要么每个容器配置 https,然后前端通过 Service 进行调度,但是这样配置起来会比较麻烦,以及每个容器的建立都通过 https ,也增加了建立连接的负担。

我们需要一种这样的改造,就是客户端连接到 Service 是通过 https,而 Service 向后端 Pod 的调度通过 http,这样可以极大的优化我们的集群,这里我们就需要用到 Kubernetes 的另外一种资源 Ingress

Kubernetes 使用 ingress 配置 https 集群(十五)

1.2 Ingress

Ingress 就是一个负载均衡的应用,它和 Service 的不同之处在于,Service 只可以支持 4 层的负载均衡,而 Ingress 是支持 7 层的负载均衡,支持 http 和 https,包括通过主机名的访问已经路径访问的过滤。

那为什么不直接使用 Nginx?这是因为在 K8S 集群中,如果每加入一个服务,我们都在 Nginx 中添加一个配置,其实是一个重复性的体力活,只要是重复性的体力活,我们都应该通过技术将它干掉。

Ingress就可以解决上面的问题,其包含两个组件Ingress ControllerIngress

  • Ingress:将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可;
  • Ingress Controller:将新加入的 Ingress 转化成 Nginx 的配置文件并使之生效,包含 Contour、F5、HAProxy、Istio、Kong、Nginx、Traefik,官方推荐我们使用 Nginx。

Kubernetes 使用 ingress 配置 https 集群(十五)

1.3 环境介绍

我们是采用了三台服务器的一个集群,部署文档请查看我之前的博文

IP角色
192.168.1.200k8s-master
192.168.1.201k8s-node01
192.168.1.202k8s-node02
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   117s   v1.13.0
node01   Ready    <none>   52s    v1.13.0
node02   Ready    <none>   42s    v1.13.0

二、安装部署

我们这里只针对上面架构图中的域名www.wzlinux.com改造成https。

我们将以官方的标准脚本为基础进行搭建,参考请戳官方文档。官方文档中要求执行如下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

2.1、创建后端 Pod 应用

我们创建一个控制器wzlinux-deploy.yaml,内容如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: wzlinux-dep
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: wzlinux
    spec:
      containers:
      - name: wzlinux
        image: wangzan18/mytest:v1
        ports:
        - containerPort: 8080

创建好之后查看如下:

[root@master ingress]# kubectl get pod
NAME                           READY   STATUS    RESTARTS   AGE
wzlinux-dep-78d5d86c7c-fj8f5   1/1     Running   0          53m
wzlinux-dep-78d5d86c7c-hr6gd   1/1     Running   0          53m
wzlinux-dep-78d5d86c7c-jqf59   1/1     Running   0          53m

2.2 创建后端 Pod Service

测试好 Pod 一些正常之后,我们为这一组 Pod 创建一个 Service,文件wzlinux-svc.yaml内容如下:

apiVersion: v1
kind: Service
metadata:
  name: wzlinux-svc
spec:
  selector:
    run: wzlinux
  ports:
  - port: 80
    targetPort: 8080

这个 Service 并不是我们用了代理访问 Pod 的,只是用来ingress-controller来进行选择控制使用的,所以上图描述为虚线。

[root@master ingress]# kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    58m
wzlinux-svc   ClusterIP   10.106.219.230   <none>        8080/TCP   50m
[root@master ingress]# curl 10.106.219.230:8080
Hello Kubernetes bootcamp! | Running on: wzlinux-dep-78d5d86c7c-fj8f5 | v=1

2.3、创建 ingress 资源

为了实现过滤以及 https 功能,我们需要创建 ingress 资源文件,ingress controller 把其中的资源加载到 nginx 里面,资源文件wzlinux-ingress.yaml文件内容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wzlinux-ingress
spec:
  rules:
  - host: www.wzlinux.com
    http:
      paths:
      - path:
        backend:
          serviceName: wzlinux-svc
          servicePort: 8080

我们这里先不改为 https,先使用虚拟主机域名过滤模式,创建好资源之后查看

[root@master ingress]# kubectl get ingress
NAME              HOSTS             ADDRESS   PORTS   AGE
wzlinux-ingress   www.wzlinux.com             80      37m

可以看到配置了域名www.wzlinux.com,其他地址访问将返回404。

2.4、为 Nginx Pod 创建 Service

我们可以查看部署的 Nginx Pod 容器,我们设定的 ingress 资源会被 controller 更新到里面,我们可以查看如下:

[root@master ingress]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-766c77b7d4-dlcpf   1/1     Running   0          31m

为了是外网可以访问到这个 Nginx Pod,我们需要为其再创建一个 Service,文件ingress-nginx.yaml,文件内容如下:

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30080
  - name: https
    port: 443
    targetPort: 443
    nodePort: 30443
  selector:
    app.kubernetes.io/name: ingress-nginx

测试是否正常,记得在/etc/hosts中把域名执行的IP改为node节点的地址。

[root@master ~]# curl 192.168.1.200:30080
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.15.6</center>
</body>
</html>
[root@master ~]# curl www.wzlinux.com:30080
Hello Kubernetes bootcamp! | Running on: wzlinux-dep-78d5d86c7c-hr6gd | v=1

可以看到通过域名访问正常调度到后端,其他地址访问返回404,目前整个流程已经测试完成,下面我们升级为 https。

三、升级为 https

3.1 首先我们要制作证书

关于证书大家可以使用 openssl 制作,创建私有:

openssl genrsa -out wzlinux.key 2048

制作自签证书。

openssl req -new -x509 -key wzlinux.key -out wzlinux.crt -subj /C=CN/ST=Shanghai/L=Shanghai/O=DevOps/CN=www.wzlinux.com

不过我这里使用阿里云的官方免费证书,大家可以到阿里云进行申请。
Kubernetes 使用 ingress 配置 https 集群(十五)

Kubernetes 使用 ingress 配置 https 集群(十五)
制作好证书之后下载即可,里面包含公钥和私钥。

3.2、创建 secret 资源

可以使用 yaml 文件创建,文件名称wzlinux-secret.yaml内容如下:

apiVersion: v1
kind: Secret
data:
  tls.crt: base64 encoded cert
  tls.key: base64 encoded key
metadata:
  name: wzlinux-secret
  namespace: default
type: Opaque

因为编码的密码太长,我们这里直接使用命令行进行创建吧,操作比较简单。

kubectl create secret tls wzlinux-secret --cert=wzlinux.crt --key=wzlinux.key

查看创建好的 secret。

[root@master ingress]# kubectl describe secret wzlinux-secret
Name:         wzlinux-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  kubernetes.io/tls

Data
====
tls.crt:  1996 bytes
tls.key:  1675 bytes

3.3 更改 ingress 资源

重新编辑wzlinux-ingress.yaml,增加一个 tls 字段:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: wzlinux-ingress
spec:
  tls:
  - hosts:
    - www.wzlinux.com
    secretName: wzlinux-secret
  rules:
  - host: www.wzlinux.com
    http:
      paths:
      - path:
        backend:
          serviceName: wzlinux-svc
          servicePort: 8080

3.4 浏览器访问验证

打开浏览器,记得修改好 hosts 域名解析。
Kubernetes 使用 ingress 配置 https 集群(十五)

四、ingress 资源介绍

4.1、通过访问路径过滤

foo.bar.com -> 178.91.123.132 -> / foo    service1:4200
                                 / bar    service2:8080

配置文件我们设置为如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080

4.2、基于名称解析的虚拟主机

foo.bar.com --|                 |-> foo.bar.com s1:80
              | 178.91.123.132  |
bar.foo.com --|                 |-> bar.foo.com s2:80

配置文件内容格式如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: first.bar.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80
  - host: second.foo.com
    http:
      paths:
      - backend:
          serviceName: service2
          servicePort: 80
  - http:
      paths:
      - backend:
          serviceName: service3
          servicePort: 80

4.3、https

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - sslexample.foo.com
    secretName: testsecret-tls
  rules:
    - host: sslexample.foo.com
      http:
        paths:
        - path: /
          backend:
            serviceName: service1
            servicePort: 80
### 如何在聊天机器人 (Chatbox) 中使用知识库进行问答或信息检索 #### 集成知识库的重要性 为了使聊天机器人更加智能化并能提供精准的信息,集成就绪的知识库显得尤为重要。这不仅提升了机器人的响应质量,还增强了用户体验[^2]。 #### 使用 Chatbox 和外部知识库的方法 对于像 Chatbox 这样的平台来说,虽然本身提供了与多种大型语言模型交互的能力,但其核心并不自带复杂的数据存储解决方案。因此,在实际应用中通常会采用第三方服务来实现这一目标。具体做法如下: - **API 调用方式**:通过 RESTful API 或 GraphQL 接口连接至已有的企业级数据库或其他形式的知识管理系统; - **插件扩展机制**:部分高级版本可能支持自定义开发插件,允许开发者创建专门针对特定业务场景下的数据源适配器; - **嵌入式搜索引擎**:引入Elasticsearch、Solr等全文索引引擎作为中间层,负责处理来自前端查询请求并将结果返回给调用方——即我们的聊天程序实例。 #### 实现步骤概述 尽管这里不建议使用具体的“首先”、“然后”,还是可以给出一个逻辑顺序供参考理解流程: 1. 明确需求分析阶段要解决的问题以及预期达到的效果。 2. 选定合适的技术栈组合方案,比如Python Flask/Django框架配合PyMySQL驱动对接MySQL Server,或是Node.js Express搭配MongoDB NoSQL文档型数据库等等。 3. 编写必要的接口函数完成前后端之间的通信协议设计工作,并确保安全性和性能优化措施到位。 4. 测试联调期间不断调整参数配置直至满足生产环境部署标准为止。 5. 上线运行后持续监控维护系统稳定状态的同时收集反馈意见以便后续改进迭代升级计划制定依据。 ```python import requests def fetch_knowledge_base_data(query_string): url = 'http://your.kb.api/v1/search' params = {'q': query_string} response = requests.get(url, params=params) if response.status_code == 200: return response.json() else: raise Exception('Failed to retrieve data from knowledge base') ``` 上述代码片段展示了如何向远程服务器发起 HTTP GET 请求以获取匹配项列表。当然这只是其中一个简单例子而已,实际情况可能会涉及到身份验证令牌传递、错误重试策略设定等多个方面考量因素。 #### 结合角色提示增强互动效果 除了单纯依赖于预设好的静态条目外,还可以考虑加入动态生成的回答模式。例如当检测到来访者询问有关历史事件的时间节点时,则临时赋予AI助理相应的历史学家身份特征去组织措辞表达观点[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值