K8S 部署 Nacos2.1.2 单服务

介绍

拉取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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值