介绍
拉取docker私有镜像
1、拉取镜像;2、运行两次第一次生成目录;3、打标签上传私有仓库
docker pull nacos/nacos-server:v2.1.2 #拉取镜像
docker run -d \
-e MODE=standalone \
--privileged=true \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=10.15.5.1 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=nacos123 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e TIME_ZONE='Asia/Shanghai' \
-e NACOS_AUTH_ENABLE=true \
-v /home/nacos/logs:/home/nacos/logs \
-v /home/nacos/data:/home/nacos/data \
-v /home/nacos/conf:/home/nacos/conf \
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
--name nacos --restart=always nacos/nacos-server:v2.1.2
#docker tag nacos/nacos-server:v2.1.2 registry.cn-hangzhou.aliyuncs.com/lyndon1107/nacos-server:v2.1.2
docker push registry.cn-hangzhou.aliyuncs.com/lyndon1107/nacos-server:v2.1.2
创建 Nacos-StatefulSet.yml
创建 Nacos-StatefulSet.yml,设置亲和性为固定模式配置,部署到master 和 node1节点。
只部署node1
[root@node1 ~]# vi nacos-statefulset.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nacos
spec:
serviceName: nacos-headless
replicas: 2
selector:
matchLabels:
app: nacos
template:
metadata:
labels:
app: nacos
spec:
#nodeName: node1 #指定节点运行
hostNetwork: true # 使用主机网络
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: app
operator: In
values: ["master1234","node1"]
containers:
- name: nacos
image: nacos/nacos-server:v2.1.2
imagePullPolicy: IfNotPresent
env:
- name: PREFER_HOST_MODE
value: hostname
- name: MODE
value: "cluster" # standalone cluster
- name: NACOS_SERVER_PORT
value: "8848"
- name: SPRING_DATASOURCE_PLATFORM
value: "mysql"
- name: MYSQL_SERVICE_HOST
value: 82.157.175.31
- name: MYSQL_SERVICE_PORT
value: "3306"
- name: MYSQL_SERVICE_DB_NAME
value: nacos_config
- name: MYSQL_SERVICE_USER
value: "root"
- name: MYSQL_SERVICE_PASSWORD
value: "root123456"
- name: NACOS_AUTH_ENABLE
value: "false"
- name: NACOS_SERVERS
#value: "nacos-0.nacos-headless.default.svc.cluster.local:8848 nacos-1.nacos-headless.default.svc.cluster.local:8848"
value: 10.0.0.153:8848,10.0.0.58:8848 # server ip
#value: "nacos-0 nacos-1"
volumeMounts:
- mountPath: /home/nacos/logs
name: log-volume
- mountPath: /home/nacos/data
name: data-volume
- mountPath: /home/nacos/conf
name: conf-volume
ports:
- containerPort: 8848 #容器对外开放端口
- containerPort: 9848
- containerPort: 9849
volumes:
- name: log-volume
hostPath:
path: /home/nacos/logs
#type: DirectoryOrCreate
- name: data-volume
hostPath:
path: /home/nacos/data
- name: conf-volume
hostPath:
path: /home/nacos/conf
Nacos Service
Nacos Service无头服务
apiVersion: v1
kind: Service
metadata:
name: nacos-headless
namespace: default
labels:
app: nacos
spec:
type: ClusterIP
clusterIP: None
ports:
- name: server
port: 8848 #service暴漏在cluster ip 上的端口
targetPort: 8848 #pod上的端口
- name: client-rpc
port: 9848
targetPort: 9848
- name: server-rpc
port: 9849
targetPort: 9849
selector:
app: nacos #容器的标签
创建 Ingress
发布外网(使用 ingress-nginx)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nacos
spec:
ingressClassName: nginx #指定了Ingress类为nginx
#本地测试可以不用这一段
# tls: #用于HTTPS连接的TLS(传输层安全)设置
# - hosts: #TLS配置适用的主机名列表
# - api.yourdomain.cn #只有该域名会使用这个TLS配置
# secretName: www-tls-secret #TLS证书和私钥的Kubernetes Secret的名称,包含用于HTTPS连接的证书和私钥
rules:
- host: api.yourdomain.cn
http:
paths:
- path: "/nacos"
pathType: Prefix
backend:
service:
name: nacos
port:
number: 8848 #后端微服务的端口
SpringBoot服务访问Nacos配置
略
其他
k8s有状态服务StatefulSet详解
https://blog.youkuaiyun.com/hguisu/article/details/124228252
K8S五种类型资源控制器
https://blog.youkuaiyun.com/weixin_55972781/article/details/119430449
使用kubectl scale 对Nacos动态扩容
kubectl scale sts nacos --replicas=3 -n nacos
环境变量配置
在nacos官方提供的镜像,可以看到环境变量配置:
说明
StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为:
$(pod.name).$(headless server.name).${namespace}.svc.cluster.local
也即是说,对于有状态服务,我们最好使用固定的网络标识(如域名信息)来标记节点,当然这也需要应用程序的支持(如Zookeeper就支持在配置文件中写入主机域名)。
StatefulSet基于Headless Service(即没有Cluster IP的Service)为Pod实现了稳定的网络标志(包括Pod的hostname和DNS Records),在Pod重新调度后也保持不变。
以下为使用StatefulSet部署Nacos的架构,每一个pod节点,都作为StatefulSet的一个副本,对外暴露为一个Service,接受客户端请求。
链接:https://blog.youkuaiyun.com/weixin_74412978/article/details/144696781
nacos-0.nacos-headless.default.svc.cluster.local:8848 是一个 Kubernetes 集群内的 DNS 名称,它指向一个正在运行的 Nacos 实例。
下面是对这个 DNS 名称的详细解释:
nacos-0 是 StatefulSet 管理的第一个 Pod 的名称。StatefulSet 为每个 Pod 分配一个唯一的名称,该名称包括了一个索引号,以此类推。
nacos-headless 是一个 Headless Service 的名称。Headless Service 是一种没有 ClusterIP 的服务,它通过 DNS 解析为多个 Pod 的地址。
通过 Headless Service,Kubernetes 可以为每个 Pod 提供独立的 DNS 名称,而不是通过一个负载均衡器来代理流量。对于 nacos-0,DNS 名称 nacos-0.nacos-headless.default.svc.cluster.local 会解析到该 Pod 的 IP 地址。
default 是 Kubernetes 中的命名空间(Namespace)。命名空间用来分隔集群中的资源,避免不同项目之间发生冲突。在这个例子中,nacos-0 这个 Pod 和 nacos-headless 服务都属于 hgjg-common 命名空间。
svc.cluster.local 是 Kubernetes 集群的默认 DNS 域名后缀。所有服务都会被自动解析为 svc.cluster.local 后缀的 DNS 名称。
这意味着 nacos-headless 服务的 DNS 名称会是 nacos-headless.default.svc.cluster.local,并且 Pod 的名称(如 nacos-0)会作为服务的子域名来访问。
创建 Service NodePort 未使用
这里需要两个service服务,一个给nacos提供无头服务,一个给nacos提供对外访问。
nacos-service-nodeport.yml 未使用
[root@node1 nacos]# cat nacos-service-nodeport.yml
apiVersion: v1
kind: Service
metadata:
name: nacos
namespace: default
labels:
app: nacos
spec:
type: NodePort
ports:
- name: server
port: 8848 #service暴漏在cluster ip 上的端口
targetPort: 8848 #pod上的端口
#nodePort: 28848 #Service对外开放的端口
- name: client-rpc
port: 9848
targetPort: 9848
- name: server-rpc
port: 9849
targetPort: 9849
selector:
app: nacos #容器的标签
参考
关于如何在这些生态中使用 Nacos,请参考以下文档:
Nacos与Kubernetes一起使用 (https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html)
Kubernetes部署nacos配置中心
https://www.cnblogs.com/skymyyang/p/13386301.html
基于Kubernetes(k8s)部署Dubbo+Nacos服务
https://www.cnblogs.com/zlt2000/p/17210084.html