在K8S中部署Nacos配置中心
服务注册和配置中心是运维工作中经常遇见的字眼,配置中心要实现的一个基本理念是配置修改的时效性、动态性、一致性;服务注册和发现是为了解耦服务之间的依赖关系和便于服务管理。
为什么需要配置中心
安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏。
时效性:修改配置,需要重启服务才能生效。
局限性:无法支持动态调整:例如日志开关、功能开关。
因此,分布式配置中心应运而生!
工作中常用的配置中心:
1. Spring Cloud Config:2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。
2. Apollo:2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性,很多知名公司在用。
3. Nacos:2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。
对于Spring Cloud Config,在此不再多说,运维工作中主流的配置中心还是apollo和nacos
我们为什么选择nacos
1. 在权限管理这块apollo有其独特优势,nacos在权限管理这块尚需优化中;
2. Nacos部署简化,Nacos整合了注册中心、配置中心功能,且部署相比apollo简单,方便管理和监控;
3. apollo容器化较困难,Nacos有官网的镜像可以直接部署,总体来说,Nacos比apollo更符合KISS原则;
4. 性能方面,Nacos读写tps比apollo稍强一些
k8s集群信息
worker01 Ready controlplane,etcd,master,worker 50d v1.18.3
worker02 Ready controlplane,etcd,worker 50d v1.18.3
worker03 Ready controlplane,etcd,worker 50d v1.18.3
worker04 Ready worker 50d v1.18.3
worker05 Ready worker 50d v1.18.3
worker06 Ready worker 50d v1.18.3
worker07 Ready worker 37d v1.18.3
worker08 Ready worker 37d v1.18.3
worker09 Ready worker 37d v1.18.3
# 其中worker07--09作为此次nacos集群的部署节点,设有label标签app=true
部署mysql数据库
代码克隆
git clone https://github.com/nacos-group/nacos-k8s.git
数据库pvc创建 (使用已有ceph)
[root@worker01 deploy]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
xsky-rbd (default) iscsi.csi.xsky.com Delete Immediate true 50d
[root@worker01 deploy]# cat ceph/pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-nacos-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: xsky-rbd
resources:
requests:
storage: 10Gi
[root@worker01 deploy]# kubectl create ns test1
[root@worker01 deploy]# kubectl apply -f ceph/pvc.yaml -n test1
mysql副本(单节点)和服务创建,数据库部署目录nacos-k8s/deploy/mysql
[root@worker01 mysql]# cat mysql-ceph.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: nacos-mysql
labels:
name: nacos-mysql
spec:
replicas: 1
selector:
name: nacos-mysql
template:
metadata:
labels:
name: nacos-mysql
spec:
containers:
- name: nacos-mysql
image: nacos/nacos-mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "root"
- name: MYSQL_DATABASE
value: "nacos"
- name: MYSQL_USER
value: "nacos"
- name: MYSQL_PASSWORD
value: "nacos"
volumeMounts:
- name: mysql-nacos
mountPath: /var/lib/mysql
readOnly: false
volumes:
- name: mysql-nacos
persistentVolumeClaim:
claimName: mysql-nacos-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mysql-nacos
labels:
name: mysql-nacos
spec:
ports:
- port: 3306
targetPort: 3306
selector:
name: nacos-mysql
部署nacos
目录nacos-k8s/deploy/nacos,修改nacos-pvc-ceph.yaml,主要修改configmap和sts的NACOS_SERVERS和数据持久化(新增application.properties配置文件的持久化)
[root@worker01 nacos]# cat application.properties
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
[root@worker01 nacos]# kubectl create -n test1 cm nacos-config --from-file=application.properties
[root@worker01 nacos]# cat nacos-pvc-ceph.yaml
---
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
labels:
app: nacos
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
clusterIP: None
ports:
- port: 8848
name: server
targetPort: 8848
protocol: TCP
selector:
app: nacos
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
data:
mysql.db.name: "nacos"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "nacos"
mysql.service.host: "mysql-nacos.test1.svc.cluster.local" #test1为我的namespace
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos-headless
replicas: 3
template:
metadata:
labels:
app: nacos
annotations:
pod.alpha.kubernetes.io/initialized: "true"
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- 'true'
topologyKey: "kubernetes.io/hostname"
# serviceAccountName: block-csi-provisioner
initContainers:
- name: peer-finder-plugin-install
image: nacos/nacos-peer-finder-plugin:1.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /home/nacos/plugins/peer-finder
name: plugindir
containers:
- name: nacos
imagePullPolicy: IfNotPresent
image: nacos/nacos-server:1.3.2
resources:
requests:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 8848
name: client-port
env:
- name: NACOS_REPLICAS
value: "2"
- name: SERVICE_NAME
value: "nacos-headless"
- name: DOMAIN_NAME
value: "cluster.local"
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.service.host
- name: MYSQL_SERVICE_DB_NAME
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.db.name
- name: MYSQL_SERVICE_PORT
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.port
- name: MYSQL_SERVICE_USER
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.user
- name: MYSQL_SERVICE_PASSWORD
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.password
- name: NACOS_SERVER_PORT
value: "8848"
- name: NACOS_APPLICATION_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_SERVERS
value: "nacos-0.nacos-headless.test1.svc.cluster.local:8848 nacos-1.nacos-headless.test1.svc.cluster.local:8848 nacos-2.nacos-headless.test1.svc.cluster.local:8848"
volumeMounts:
- name: plugindir
mountPath: /home/nacos/plugins/peer-finder
- name: datadir
mountPath: /home/nacos/data
- name: logdir
mountPath: /home/nacos/logs
- name: nacos-config
mountPath: /home/nacos/conf/application.properties
subPath: application.properties
volumes:
- name: nacos-config
configMap:
name: nacos-config
volumeClaimTemplates:
- metadata:
name: plugindir
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "xsky-rbd"
resources:
requests:
storage: 1Gi
- metadata:
name: datadir
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "xsky-rbd"
resources:
requests:
storage: 6Gi
- metadata:
name: logdir
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "xsky-rbd"
resources:
requests:
storage: 5Gi
selector:
matchLabels:
app: nacos
[root@worker01 nacos]# kubectl apply -f nacos-pvc-ceph.yaml -n test1
service/nacos-headless created
configmap/nacos-cm created
statefulset.apps/nacos created
Ingress服务暴露
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nacos-ingress
namespace: test1
spec:
rules:
- host: nacos.domain.test
http:
paths:
- backend:
serviceName: nacos-headless
servicePort: 8848
path: /nacos
浏览器访问http://nacos.domain.test/nacos
出其东门
出其东门,有女如云。
虽则如云。匪我思存。
缟衣綦巾,聊乐我员。
出其闉阇,有女如荼。
虽则如荼,匪我思且。
缟衣茹藘,聊可与娱。
求关注
求转发