携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
前言
在前面的文章中我们安装完成
KubeSphere后测试模拟了一个nginx的访问,但是这种访问方式是通过服务的外部访问设置配置的NodePort访问模式,也就是通过集群节点的端口访问服务
但是在上图的
NodePort访问模式下如果遇到这个节点因为某些原因挂掉了,集群将这个nginx服务调度到了另一节点则无法再通过之前的地址访问,这是我们无法接受的,所以我们需要配置网关跟路由来做到对服务负载的分发
分离空间
如果使用的admin账号需要先配置一个企业空间跟项目和角色用户用来将我们的环境隔离开来,后面建立服务网关跟路由都可以建立在项目上
创建企业空间
第一步:工作台->点击企业空间进入下图页面->创建
第二步:填写信息->创建
创建完成
创建项目
操作步骤:工作台->企业空间页面->进入test-space空间-->项目->创建->填写信息->确定
创建完成
创建nginx服务
先创建一个外部能看到效果的web服务,如果KubeSphere上安装了应用商店可以直接在应用商店安装。
命令安装nginx
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
应用商店安装
第一步:左上角应用商店->找到nginx->点击安装
第二步:同意安装协议->选择企业空间跟项目->下一步
第三步:默认副本数量->默认不开启Ingress->安装
创建后可以在test-project的项目里操作这个nginx了
配置外部访问
应用商店安装的nginx默认没有开启外部访问,在服务中开启nginx的外部访问
访问模式就选择NodePort即可
确定后会给出一个外部访问端口,我这个是30422
再去容器组找到我们当前的nginx在那个节点上
根据节点ip+端口进行访问nginx服务,我的就是10.0.24.14:30422,如果通过公网地址访问就找一下此节点的公网ip+端口即可。如下图即访问成功
配置网关
网关配置可以在项目上也可以在集群上,按小颗粒度我们将网关放到test-project项目上
操作步骤:进入项目->项目设置->网关设置->启用网关->默认NodePort模式->确定
配置路由
操作步骤:进入项目->应用负载->应用路由->创建路由
基本信息
路由名称必填,我们要为test-project项目的nginx服务建立路由就用test-project-nginx名称
路由规则
设置域名:如果有域名可以直接使用,没有就随机写一个在客户端配置hosts文件,我这里随便写一个域名:test.dfa2f1d.io
协议:默认HTTP,如果使用HTTPS需要配置证书字典
路径:选择服务跟路径端口
高级设置
这一步是设置nginx-ingres的注释跟标签,目前不需要设置,直接点击创建
创建完成
验证访问
在项目的网关配置中开放的节点端口为:HTTP: 31184/HTTPS: 31869
再nginx服务的路由配置的域名为test.dfa2f1d.io的HTTP协议
那访问地址就是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
验证可用性
路由配置完成了要验证一下它的可用性,现在nginx的副本只有一个,挂掉后重启的过程肯定是访问不了的,这样无法测试路由的可用性,所以先多创建几个副本
增加副本数量
在应用负载->工作负载中找到nginx应用,可用选择修改yaml文件调整副本数量
将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副本
也可以直接在nginx应用里可视化增加/减少副本
模拟宕机
在应用负载->容器组里找到nginx的三个Pod
这时候随机删除两个`Pod`并刷新刚才的访问地址看看是否能正常访问,在路由的情况下只要不是同一时间内没有可用的`Pod`路由会自动转发到可用的Pod上,也可以全部删除Pod看看会变成什么样子
留下一个Pod
只要有存活的Pod使用路由访问nginx都是正常的,如下图
全部删除Pod
在重启Pod的过程中访问路由会出现503,如下图
调度重启完成后则恢复正常
配置HTTPS路由
上面的情况都是基于HTTP协议的访问,HTTPS协议的选择在上面配置应用路由时应该有提过,配置HTTPS需要配置证书的保密字典,将证书的crt跟key配置进去
配置保密字典
操作步骤:进入项目->配置->保密字典->创建->下一步
选择类型为TLS信息,将crt文件的内容填写到证书输入框内,key文件内容填写到私钥输入框内点击创建
配置HTTPS路由
操作步骤:进入项目->应用负载->应用路由->创建路由
这次的名称使用www
添加路由规则
- 域名填写
https证书签发的域名 - 协议选择
HTTPS - 字典就选刚才创建的
nginx-ssl - 路径还选择
nginx的服务
HTTPS跟HTTP的网关端口不是一个,别用错了还奇怪怎么不起作用,配置完成后访问https:域名:31869,如下图,带锁证明使用了HTTPS加密