一、中间件容器化¶
1.1 如何部署一个应用至K8s¶
1.了解应用
- 应用的架构
- 应用相关配置
- 应用端口号
- 应用如何启动
2.获取应用镜像
3.获取合适部署方式
- 分为有状态还是无状态
- 是否要配置分离
- 部署文件来源(自己写还是拿别人造好的"轮子")
- 如何进行部署
4.程序如何使用
- 什么协议?TCP还是HTTP
- 访问方式是什么?内部访问还是外部访问?而外部访问是通过NodePort实现还是Ingress来实现?
1.2 部署单实例Rabbitmq至k8s¶
1.2.1 创建deployment¶
1.创建ns
[root@k8s-master01 ~]# kubectl create ns public-service
2.编写Rabbitmq配置文件
$ vim rabbitmq.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: rabbitmq
name: rabbitmq
namespace: public-service
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: rabbitmq
spec:
affinity: {}
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
image: registry.cn-hangzhou.aliyuncs.com/abroad_images/rabbitmq:3.8.17-management
imagePullPolicy: Always
lifecycle: {}
livenessProbe:
failureThreshold: 2
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5672
timeoutSeconds: 2
name: rabbitmq
ports:
- containerPort: 5672
name: web
protocol: TCP
readinessProbe:
failureThreshold: 2
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5672
timeoutSeconds: 2
resources:
limits:
cpu: 1009m
memory: 1004Mi
requests:
cpu: 255m
memory: 510Mi
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
status: {}
3.创建Pod并进行验证
[root@k8s-master01 ~]# kubectl create -f rabbitmq.yaml
[root@k8s-master01 ~]# kubectl get po -n public-service
NAME READY STATUS RESTARTS AGE
rabbitmq-5956d7d44-rlvx2 1/1 Running 0 2m20s
1.2.2 创建Service¶
1.编写Service配置文件
[root@k8s-master01 ~]# vim rabbitmq-svc.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: rabbitmq
name: rabbitmq
namespace: public-service
spec:
ports:
- name: web
port: 5672
protocol: TCP
targetPort: 5672
- name: http
port: 15672
protocol: TCP
targetPort: 15672
selector:
app: rabbitmq
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
2.在k8s-master01上创建上诉服务,并查看刚刚创建的service,查看对外暴露的端口号为30763
[root@k8s-master01 ~]# kubectl create -f rabbitmq-svc.yaml
[root@k8s-master01 ~]# kubectl get svc -n public-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
rabbitmq NodePort 10.0.59.142 <none> 5672:31621/TCP,15672:30763/TCP 26s
1.2.3 访问测试¶
1.打开浏览器输入192.168.1.31:30763打开rabbitmq登录界面,其中用户名和默认为guest。

2.如果想修改默认密码可以设置env变量来修改账号和密码,这里设置账号为user,密码为password
重新修改rabbitmq.yaml文件,主要添加以下内容
- name: RABBITMQ_DEFAULT_USER
value: user
- name: RABBITMQ_DEFAULT_PASS
value: password

修改完成后,yaml文件内容如下:
$ vim rabbitmq.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: rabbitmq
name: rabbitmq
namespace: public-service
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: rabbitmq
spec:
affinity: {}
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
- name: RABBITMQ_DEFAULT_USER
value: user
- name: RABBITMQ_DEFAULT_PASS
value: user
image: rabbitmq:3.8.17-management
imagePullPolicy: Always
lifecycle: {}
livenessProbe:
failureThreshold: 2
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5672
timeoutSeconds: 2
name: rabbitmq
ports:
- containerPort: 5672
name: web
protocol: TCP
readinessProbe:
failureThreshold: 2
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 5672
timeoutSeconds: 2
resources:
limits:
cpu: 1009m
memory: 1004Mi
requests:
cpu: 255m
memory: 510Mi
dnsPolicy: ClusterFirst
restartPolicy: Always
securityContext: {}
status: {}
更新yaml
[root@k8s-master01 ~]# kubectl apply -f rabbitmq-svc.yaml
说明:这块没有配置持久化,Pod重启后之前的数据会丢失
重新使用用户名user,密码password进行登录测试,观察到使用新的用户名和密码可以进行访问

1.3 对比传统架构和k8s管理中间件集群¶
传统架构和使用 Kubernetes(K8s)管理中间件集群之间存在一些关键差异。下面是对比传统架构和 K8s 管理中间件集群的几个方面:
1.部署和扩展性
- 传统架构:在传统架构中,部署和扩展中间件通常需要手动进行,需要配置和管理物理或虚拟服务器,并处理横向扩展和负载均衡等问题。
- K8s:Kubernetes提供了自动化的应用程序部署和扩展机制。通过使用容器化技术,K8s可以方便地管理中间件的生命周期,自动进行扩展和负载均衡,简化了应用程序的部署和管理过程。
2.高可用性和容错性
- 传统架构:在传统架构中,实现高可用性和容错性需要手动设置冗余组件、负载均衡和故障转移等机制。
- K8s:Kubernetes提供内置的高可用性和容错性机制。通过复制和调度容器副本,并使用自动故障检测和自动恢复机制,K8s可以确保中间件集群在节点或容器故障时保持可用
3.弹性伸缩和资源管理
- 传统架构:在传统架构中,实现弹性伸缩和资源管理需要手动调整服务器数量和配置,以满足不同负载下的需求。
- K8s:Kubernetes提供自动弹性伸缩和资源管理功能。通过配置自动伸缩策略,K8s可以根据中间件的负载情况自动调整副本数量,并优化资源分配,以满足中间件集群的需求。
4.服务发现和负载均衡
- 传统架构:在传统架构中,实现服务发现和负载均衡需要使用额外的中间件或配置反向代理服务器。
- K8s:Kubernetes提供内置的服务发现和负载均衡机制。通过使用服务抽象和负载均衡器,K8s可以自动管理中间件集群的网络流量分发,并提供可靠的服务发现机制。
5.配置和版本管理
- 传统架构:在传统架构中,配置和版本管理通常需要手动进行,并且可能存在不一致或遗漏的风险。
- K8s:Kubernetes提供声明性的配置管理和版本控制。通过使用ConfigMap和Secrets资源对象,K8s可以轻松管理中间件的配置和敏感
1.3.1 传统架构管理中间件集群¶
在传统架构中,管理一个中间件集群的流程如下:
1.假设现在需要中间件集群,比如需要一个三主三从的Redis集群
2.如果公司环境目前没有服务器,需要新申请3~6(有可能是复用之前的服务器搭建集群)台服务器用来部署Redis集群
3.从Redis官方网站下载某个版本的Redis安装包,并且安装到每一台服务器上,同时可能每台服务器也需要做相关的优化配置,比如修改提升性能的内核等
4.进行每台服务器的Redis配置,如果是一台服务器部署两个Redis实例,可能还需要配置不同的端口号等
5.启动每台服务器上的Redis实例
6.通过相关命令或者配置文件建立集群
7.如果集群想要添加节点,可能需要重复2-6步骤

1.3.2 k8s管理中间件集群¶
在Kubernetes中,可以使用Kubernetes的包管理工具非常方便地搭建一个中间件集群,最为常用的包管理工具还是以Operator和Helm为主。
Helm特点如下:
- 更倾向于无状态应用的部署,比如公司的服务、某些不需要持久化数据的中间件、不需要实现额外功能的服务, 比如备份、回滚等
- 使用简单,不需要自己编写代码
Operator特点如下:
- 管理更为复杂的有状态服务,比如MySQL集群、 Redis集群、Rook等。
- 可以利用Operator实现扩容、备份、 回滚等功能
- 相对helm使用复杂,需要有一定的代码能力
其中使用Helm管理中间件集群的流程如下:
1.集群中需要有一个Helm的客户端,用来执行增删改查命令,和Kubectl类似
2.需要找到对应的Chart(可以在中间件的官网或者GitHub中查找),比如安装Redis、Zookeeper集群的包。这个包和镜像类似,都是放在一个仓库中,镜像放在镜像仓库,Chart放在Chart仓库。
3.新建集群,只需要执行helm install命令即可一键式创建该集群;更新配置,直接使用helm upgrade即可。
其中使用Operator管理中间件集群的流程如下:
1.找到对应的Operator(可以在GitHub或者其官方网站上查找)
2.创建对应的控制器,用来解析一些自定义资源逻辑的程序
3.创建自定义资源即可,对应的控制器会解析自定义资源实现相关功能,比如创建集群、扩容、备份等
说明:相对于Helm需要安装单独的客户端工具,Operator不需要单独的客户端工具,使用kubectl即可
