KubeSphere全图配置双协议应用路由

622 阅读6分钟
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

前言

在前面的文章中我们安装完成KubeSphere后测试模拟了一个nginx的访问,但是这种访问方式是通过服务的外部访问设置配置的NodePort访问模式,也就是通过集群节点的端口访问服务

但是在上图的NodePort访问模式下如果遇到这个节点因为某些原因挂掉了,集群将这个nginx服务调度到了另一节点则无法再通过之前的地址访问,这是我们无法接受的,所以我们需要配置网关路由来做到对服务负载的分发


分离空间

如果使用的admin账号需要先配置一个企业空间项目角色用户用来将我们的环境隔离开来,后面建立服务网关跟路由都可以建立在项目上

创建企业空间

第一步:工作台->点击企业空间进入下图页面->创建

image.png

第二步:填写信息->创建

image.png

创建完成

image.png

创建项目

操作步骤:工作台->企业空间页面->进入test-space空间-->项目->创建->填写信息->确定

image.png

创建完成

image.png


创建nginx服务

先创建一个外部能看到效果的web服务,如果KubeSphere上安装了应用商店可以直接在应用商店安装。

命令安装nginx

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

应用商店安装

第一步:左上角应用商店->找到nginx->点击安装

image.png

第二步:同意安装协议->选择企业空间跟项目->下一步

image.png

第三步:默认副本数量->默认不开启Ingress->安装

image.png

创建后可以在test-project的项目里操作这个nginx

image.png

配置外部访问

应用商店安装的nginx默认没有开启外部访问,在服务中开启nginx的外部访问

image.png

访问模式就选择NodePort即可

image.png

确定后会给出一个外部访问端口,我这个是30422

image.png

再去容器组找到我们当前的nginx在那个节点上

image.png

根据节点ip+端口进行访问nginx服务,我的就是10.0.24.14:30422,如果通过公网地址访问就找一下此节点的公网ip+端口即可。如下图即访问成功

image.png


配置网关

网关配置可以在项目上也可以在集群上,按小颗粒度我们将网关放到test-project项目上

操作步骤:进入项目->项目设置->网关设置->启用网关->默认NodePort模式->确定

image.png


配置路由

操作步骤:进入项目->应用负载->应用路由->创建路由

image.png

基本信息

路由名称必填,我们要为test-project项目的nginx服务建立路由就用test-project-nginx名称

image.png

路由规则

设置域名:如果有域名可以直接使用,没有就随机写一个在客户端配置hosts文件,我这里随便写一个域名:test.dfa2f1d.io 协议:默认HTTP,如果使用HTTPS需要配置证书字典 路径:选择服务跟路径端口

image.png

高级设置

这一步是设置nginx-ingres的注释跟标签,目前不需要设置,直接点击创建

image.png

创建完成

image.png


验证访问

在项目的网关配置中开放的节点端口为:HTTP: 31184/HTTPS: 31869

image.png

再nginx服务的路由配置的域名为test.dfa2f1d.ioHTTP协议

image.png

那访问地址就是test.dfa2f1d.io:31184,这个域名是随便写的,我们本地需要配置hosts添加本地DNS映射。如果是windows系统进入以下目录:C:\Windows\System32\drivers\etc,修改hosts文件添加以下内容

# ip为上面网关对应的节点ip
10.0.20.8 test.dfa2f1d.io

访问地址:test.dfa2f1d.io:31184

image.png


验证可用性

路由配置完成了要验证一下它的可用性,现在nginx的副本只有一个,挂掉后重启的过程肯定是访问不了的,这样无法测试路由的可用性,所以先多创建几个副本

增加副本数量

应用负载->工作负载中找到nginx应用,可用选择修改yaml文件调整副本数量

image.png

spec: replicas修改为3,这个属性是副本数量

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-kz54mr
  namespace: test-project
  labels:
    app.kubernetes.io/instance: nginx-kz54mr
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: nginx
    app.kubesphere.io/instance: nginx-kz54mr
    helm.sh/chart: nginx-1.3.5
  annotations:
    deployment.kubernetes.io/revision: '1'
    kubesphere.io/creator: admin
    meta.helm.sh/release-name: nginx-kz54mr
    meta.helm.sh/release-namespace: test-project
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/instance: nginx-kz54mr
      app.kubernetes.io/name: nginx
  template:
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/instance: nginx-kz54mr
        app.kubernetes.io/name: nginx
      annotations:
        kubesphere.io/creator: admin
    spec:
      volumes:
        - name: html
          emptyDir: {}
      containers:
        - name: nginx
          image: 'nginx:1.18.0-alpine'
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          resources: {}
          livenessProbe:
            httpGet:
              path: /
              port: 80
              scheme: HTTP
            initialDelaySeconds: 5
            timeoutSeconds: 1
            periodSeconds: 3
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /
              port: 80
              scheme: HTTP
            initialDelaySeconds: 5
            timeoutSeconds: 1
            periodSeconds: 3
            successThreshold: 1
            failureThreshold: 6
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

点击确定后会更新创建nginx副本

image.png

也可以直接在nginx应用里可视化增加/减少副本

image.png

模拟宕机

应用负载->容器组里找到nginx的三个Pod

image.png

这时候随机删除两个`Pod`并刷新刚才的访问地址看看是否能正常访问,在路由的情况下只要不是同一时间内没有可用的`Pod`路由会自动转发到可用的Pod上,也可以全部删除Pod看看会变成什么样子

留下一个Pod

image.png

只要有存活的Pod使用路由访问nginx都是正常的,如下图

image.png

全部删除Pod

image.png

重启Pod的过程中访问路由会出现503,如下图

image.png

调度重启完成后则恢复正常


配置HTTPS路由

上面的情况都是基于HTTP协议的访问,HTTPS协议的选择在上面配置应用路由时应该有提过,配置HTTPS需要配置证书的保密字典,将证书的crt跟key配置进去

配置保密字典

操作步骤:进入项目->配置->保密字典->创建->下一步

image.png

选择类型为TLS信息,将crt文件的内容填写到证书输入框内,key文件内容填写到私钥输入框内点击创建

image.png

配置HTTPS路由

操作步骤:进入项目->应用负载->应用路由->创建路由

这次的名称使用www

添加路由规则

  • 域名填写https证书签发的域名
  • 协议选择HTTPS
  • 字典就选刚才创建的nginx-ssl
  • 路径还选择nginx的服务

image.png

HTTPSHTTP的网关端口不是一个,别用错了还奇怪怎么不起作用,配置完成后访问https:域名:31869,如下图,带锁证明使用了HTTPS加密

image.png