Kubernetes 集群部署nacos 1.4(集群版)
Posted zuozewei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes 集群部署nacos 1.4(集群版)相关的知识,希望对你有一定的参考价值。
系统环境:
- Nacos 版本:1.4.1
- mysql 版本:8.0.19
- Kubernetes 版本:1.19.5
什么是 Nacos?
注册中心是微服务架构最核心的组件。它起到新服务节点的注册与状态维护的作用。微服务节点在启动时会将自身的服务名称、IP、端口等信息在注册中心中进行登记,注册中心会定时检查该节点的运行状态。注册中心通常会采用心跳机制最大程度保证其持有的服务节点列表都是可用的。
现在微服务开发的主流技术是基于 Spring Boot 进行的,我们都知道 Spring Boot 默认配置文件为 application.yml 或者 application.properties。它保存了应用的主要配置信息,这些配置文件会随着应用发布被打包放入 Jar 文件,随着应用加载并运行。当我们的应用只有几个微服务时这些配置文件分散的存放在各个 Jar 中还没有问题。但是如果我们开发了大型应用,涉及几十个研发团队、上百台服务器、上千个服务实例时,运维团队就要面对因为数量级增加带来的挑战了,必须额外的引入“配置中心”这一组件。
配置中心的职责就是集中管理微服务架构中每一个服务实例的配置数据。当微服务架构引入配置中心后,微服务应用只需持有应用启动的最小化配置,在应用启动时微服务应用所需的其他配置数据,诸如数据库连接字符串、各种用户名密码、IP 等信息均从配置中心远程下载,不再本地保存。
Nacos 官方地址为:https://nacos.io/zh-cn/index.html
Nacos 阿里开源,官方定义为:
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
关键特性:
一图看懂 Nacos:
因为官网有完整的功能介绍,这里不再赘述。
初始化 MySQL 数据库
Nacos 需要提前部署 Mysql,目前支持 5.7 及 8.0 版本,需要导入 SQL 文件来创建它的表结构和一些基础数据。
部署 Nacos
这里我们部署 Nacos 集群模式,创建一个 Service,该 Service 关联 Nacos 多个 Pod,一个 Pod 就是 Nacos 节点,Pod 之间通过该 Service 进行交互。最后我们会配置一个 NodePort 方式对外访问。当然,你也可以通过创建 Ingress 规则对外提供访问。
整体如下示意图:
创建 RBAC 资源
创建 nacos-rbac.yaml 资源文件:
apiVersion: v1
kind: ServiceAccount
metadata:
name: nacos-admin
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nacos-admin-clusterrole
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nacos-admin-binding
subjects:
- kind: ServiceAccount
name: nacos-admin
namespace: default
roleRef:
kind: ClusterRole
name: nacos-admin-clusterrole
apiGroup: rbac.authorization.k8s.io
创建资源:
$ kubectl apply -f nacos-rbac.yaml
创建配置 ConfigMap
创建 nacos-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-config
data:
SERVICE_NAME: "nacos-headless" # K8S 中的 Service 名称
DOMAIN_NAME: "cluster.local" # 指定 k8s domain 配置,一般默认即可
NACOS_REPLICAS: "3"
PREFER_HOST_MODE: "hostname" # 配置 Nacos 集群节点间服务发现使用的模式,支持 hostname、ip 两种模式
NACOS_APPLICATION_PORT: "8848"
NACOS_SERVER_PORT: "8848"
JVM_XMX: "2g" # 最大堆内存大小
JVM_XMS: "2g" # 最初是堆内存大小
JVM_XMN: "1g" # 堆内新生代的内存大小
MYSQL_SERVICE_HOST: "db-mysql-produce" # 数据库地址(这里使用上面部署的 Mysql,由于部署在 K8S 里面,所以使用 Mysql Service 提供的 K8S 内部地址)
MYSQL_SERVICE_DB_NAME: "nacos_config_cluster" # 指定使用的库名称
MYSQL_SERVICE_PORT: "3306" # 数据库端口
MYSQL_SERVICE_USER: "reader" # 数据库用户名
MYSQL_SERVICE_PASSWORD: "123456" # 数据库密码
创建资源文件:
$ kubectl apply -f nacos-config.yaml
创建 Nacos
创建 nacos-deploy.yaml 资源文件:
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
labels:
app: nacos
spec:
ports:
- name: server
port: 8848
targetPort: 8848
- name: rpc
port: 7848
targetPort: 7848
clusterIP: None
selector:
app: nacos
---
kind: Service
apiVersion: v1
metadata:
name: nacos
labels:
app: nacos
spec:
ports:
- name: server
port: 8848
targetPort: 8848
nodePort: 30848
selector:
app: nacos
type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos-headless
replicas: 3
template:
metadata:
labels:
app: nacos
spec:
terminationGracePeriodSeconds: 10 #配置优雅停机时间
serviceAccountName: nacos-admin #分配服务账户给应用,方便应用能够获取一定的权限
initContainers: #初始化镜像执行初始化操作
- name: peer-finder-plugin-install
image: nacos/nacos-peer-finder-plugin:1.0
volumeMounts:
- mountPath: "/home/nacos/plugins/peer-finder"
name: plugindir
affinity: #配置Pod反亲和性,放置Pod都起在同一节点上(如果都在一个节点,节点宕机将会使全部实例不可用)
podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution: #硬策略,pod一定不能启在同一个节点上
# - topologyKey: "kubernetes.io/hostname"
# labelSelector:
# matchExpressions:
# - key: "app"
# operator: In
# values:
# - nacos
preferredDuringSchedulingIgnoredDuringExecution: #软策略,尽可能pod不启在同一个节点上
- weight: 100
podAffinityTerm:
topologyKey: "kubernetes.io/hostname"
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nacos
containers:
- name: nacos
image: nacos/nacos-server:1.4.1
resources:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 100m
memory: "1Gi"
ports:
- name: client-port
containerPort: 8848
- name: rpc
containerPort: 7848
envFrom:
- configMapRef:
name: nacos-config
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
volumeMounts:
- name: plugindir
mountPath: /home/nacos/plugins/peer-finder
- name: datadir
mountPath: /home/nacos/data
- name: logdir
mountPath: /home/nacos/logs
volumeClaimTemplates:
- metadata:
name: plugindir
spec:
storageClassName: nfs-storage #指定storageclass名称,这里需要根据你的K8S集群进行修改
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
- metadata:
name: datadir
spec:
storageClassName: nfs-storage
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
- metadata:
name: logdir
spec:
storageClassName: nfs-storage
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
selector:
matchLabels:
app: nacos
这里使用的 NFS,并且使用前面 NFS-Subdir-External-Provisioner 插件插件来动态创建 PVC。这里我还创建一个 Service 资源,设置其类型为 NodePort 方式,提供 NodePort 端口为 30848,方便后续我们对 Nacos Dashboard 进行访问。
创建资源文件:
kubectl apply -f nacos-deploy.yaml
访问 Nacos
我们可以输入地址 http://node_ip:30848/nacos 访问 Nacos 页面。
输入用户名/密码: nacos/nacos ,登录 Nacos 后会看到如下页面:
源码地址:
- https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-nacos-v1.4
以上是关于Kubernetes 集群部署nacos 1.4(集群版)的主要内容,如果未能解决你的问题,请参考以下文章