一、预备环境
- 阿里云ASK集群 k8s版本:1.20.4-aliyun.1
- nacos镜像:nacos/nacos-server:v2.0.3
二、流程图
graph LR A[集群外部SLB] --> B[阿里云 Ingress] --> C[headless-Svc] --> D[statefulSet-Pod] --> E[MySQL] F[集群内部FQDN] --> C D --> G[PVC数据持久化]
说明:
- 集群入口:外部入口是SLB,主要是后台管理;内部入口是headless-svc的FQDN域名,内部服务间通信。
- 集群数据持久化:可以采用NAS,CEPH。如果不太关注落地数据,可以不需要,此篇文档就没有配置PVC。
- 如果不太想用Ingress,可以用LoadBlance类型的Service替代Ingress,只管理界面用途可以这么做。
三、搭建步骤
1、全部所需yaml文件概览
nacos-k8s-cm.yaml
nacos-k8s-headless-svc.yaml
nacos-k8s-stateful.yaml
nacos-k8s-svc.yaml #可不用
nginx_ingress_svc.yaml
nginx_ingress.yaml
2、创建Config-Map数据库信息
新建nacos-k8s-cm.yaml文件,并写入以下内容:
apiVersion: v1
kind: ConfigMap
metadata:
name: nacos-cm
namespace: zhw
data:
mysql.host: "xxxxxxx.mysql.rds.aliyuncs.com"
mysql.db.name: "nacos_cluster"
mysql.port: "3306"
mysql.user: "nacos"
mysql.password: "XN5lqwtnl8jUbWsu"
3、创建Headless Service
新建nacos-k8s-headless-svc.yaml文件,并写入以下内容
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: zhw
labels:
app: nacos-headless
spec:
type: ClusterIP
clusterIP: None
ports:
- port: 8848
name: server
targetPort: 8848
- port: 9848
name: client-rpc
targetPort: 9848
- port: 9849
name: raft-rpc
targetPort: 9849
## 兼容1.4.x版本的选举端口
- port: 7848
name: old-raft-rpc
targetPort: 7848
selector:
app: nacos
4、创建StatefulSet有状态Pod
新建nacos-k8s-stateful.yaml文件,并写入以下内容:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
namespace: zhw
labels:
app: nacos
spec:
# 上一步中headless-svc的名字
serviceName: nacos-headless
# nacos集群必须是三个节点
replicas: 3
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
annotations:
# 阿里云ASK申请ECI的配置,可以忽略
k8s.aliyun.com/eci-use-specs : "2-4Gi"
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- nacos
topologyKey: "kubernetes.io/hostname"
containers:
- name: nacos
imagePullPolicy: Always
image: nacos/nacos-server:v2.0.3
resources:
requests:
memory: "4Gi"
cpu: "2"
ports:
- containerPort: 8848
name: client
- containerPort: 9848
name: client-rpc
- containerPort: 9849
name: raft-rpc
- containerPort: 7848
name: old-raft-rpc
livenessProbe:
tcpSocket:
port: 8848
periodSeconds: 10
initialDelaySeconds: 30
readinessProbe:
tcpSocket:
port: 8848
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 5
env:
- name: MYSQL_SERVICE_DB_PARAM
value: "characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false"
- name: NACOS_REPLICAS
value: "3"
- name: MYSQL_SERVICE_HOST
valueFrom:
configMapKeyRef:
name: nacos-cm
key: mysql.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: MODE
value: "cluster"
- name: NACOS_SERVER_PORT
value: "8848"
- name: PREFER_HOST_MODE
value: "hostname"
- name: NACOS_SERVERS
# 集群的主机配置,这个value必须写对,格式为FQDN形式,pod-编号.headless-svc的名字.命名空间.svc.cluster.local:8848
value: "nacos-0.nacos-headless.zhw.svc.cluster.local:8848 nacos-1.nacos-headless.zhw.svc.cluster.local:8848 nacos-2.nacos-headless.zhw.svc.cluster.local:8848"
以上三步完成后,整个nacos集群基本已经就绪,应用可以使用headless-svc的域名nacos-headless.zhw.svc.cluster.local
和nacos集群通信。如果想访问管理界面,就需要创建Ingress SLB或者LB类型的Service。
5、创建Ingress
安装完ingress组件后,即可创建ingress规则文件nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nacos-ingress
namespace: zhw
spec:
rules:
# 配置七层域名。
- host: test.nacos.com
http:
paths:
# 配置Context Path。
- path: /
backend:
serviceName: nacos-headless
servicePort: 8848
根据具体情况,可继续添加9848、9849等端口。
6、创建 ingress-lb-svc
先手动创建好阿里云内网SLB,然后创建nginx-ingress-svc.yaml文件
#nginx ingress slb service
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-lb
namespace: kube-system
labels:
app: nginx-ingress-lb
annotations:
# 指明SLB实例地址类型为私网类型。
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
# 修改为您的私网SLB实例ID,事先创建好的slb。
service.beta.kubernetes.io/alicloud-loadbalancer-id: lb-2zev3l6hna765zkfi94ru
# 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听。
service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
spec:
type: LoadBalancer
# route traffic to other nodes
externalTrafficPolicy: "Cluster"
ports:
- port: 80
name: http
targetPort: 80
- port: 443
name: https
targetPort: 443
selector:
# select app=ingress-nginx pods
app: ingress-nginx
注意:这里的SLB既作为管理界面的入口,也可以作为Nacos集群的一个入口配置到各个服务的配置文件中,需要加上9848、9849等端口。
7、创建LB类型的Service
创建nacos-k8s-svc.yaml 文件,并写入以下内容:
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-port: '8848'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag: 'on'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: '3'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: tcp
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: '4'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: wlc
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: '4'
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
name: nacos-svc
namespace: zhw
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8848
selector:
app: nacos
type: LoadBalancer
在不想使用Ingress的情况下,可以用LB的类型SVC来创建一个管理入口。但是这个只建议做管理入口,不建议做集群入口。
四、参考信息
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com