K8S搭建NACOS集群踩坑问题

一、NACOS容器启动成功无法访问

  1. 现象描述:通过K8S的statefulset启动,通过NodePort暴露不能在外网访问,只能在MASTER主节点访问。

  1. yaml配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: 'nacos-${parameters.nameSpace}-dm'
  namespace: '${parameters.nameSpace}'
spec:
  replicas: 1
  selector:
    matchLabels:
      app: 'nacos-${parameters.nameSpace}'
  serviceName: 'nacos-${parameters.nameSpace}'
  template:
    metadata:
      annotations:
        pod.alpha.kubernetes.io/initialized: 'true'
      labels:
        app: 'nacos-${parameters.nameSpace}'
    spec:
      containers:
        - env:
            - name: NACOS_REPLICAS
              value: '1'
            - name: MYSQL_SERVICE_HOST
              valueFrom:
                configMapKeyRef:
                  key: mysql.host
                  name: 'nacos-${parameters.nameSpace}-cm'
            - name: MYSQL_SERVICE_DB_NAME
              valueFrom:
                configMapKeyRef:
                  key: mysql.db.name
                  name: 'nacos-${parameters.nameSpace}-cm'
            - name: MYSQL_SERVICE_PORT
              valueFrom:
                configMapKeyRef:
                  key: mysql.port
                  name: 'nacos-${parameters.nameSpace}-cm'
            - name: MYSQL_SERVICE_USER
              valueFrom:
                configMapKeyRef:
                  key: mysql.user
                  name: 'nacos-${parameters.nameSpace}-cm'
            - name: MYSQL_SERVICE_PASSWORD
              valueFrom:
                configMapKeyRef:
                  key: mysql.password
                  name: 'nacos-${parameters.nameSpace}-cm'
            - name: MODE
              value: cluster
            - name: NACOS_SERVER_PORT
              value: '8848'
            - name: NACOS_APPLICATION_PORT
              value: '8848'
            - name: NACOS_SERVERS
              value: >-
                nacos-${parameters.nameSpace}-dm-0.nacos-${parameters.nameSpace}.${parameters.nameSpace}.svc.cluster.local:8848
            - name: PREFER_HOST_MODE
              value: hostname
            - name: nacos.naming.data.warmup
              value: 'false'
          image: 'nacos/nacos-server:2.0.3'
          imagePullPolicy: Always
          name: k8snacos
          ports:
            - containerPort: 8848
              name: client
            - containerPort: 9848
              name: client-rpc
            - containerPort: 9849
              name: raft-rpc
          resources:
            requests:
              cpu: 500m
              memory: 2Gi
      imagePullSecrets:
        - name: '${parameters.imagePullSecrets}'
      nodeName: host-52
      hostNetwork: true


apiVersion: v1
kind: Service
metadata:
  labels:
    app: 'nacos-${parameters.nameSpace}'
  name: 'nacos-${parameters.nameSpace}'
  namespace: '${parameters.nameSpace}'
spec:
  ports:
    - name: server
      nodePort: 28855
      port: 8848
      targetPort: 8848
  selector:
    app: 'nacos-${parameters.nameSpace}'
  type: NodePort

  1. 原因分析: 因为我们要将POD固定运行在NODE52这台节点上,所以加上了

nodeName: host-52,但是同时也加上了hostNetwork: true,导致POD已经启动,但是只能在主节点通过28855端口访问,其它局域网机构加上28855端口无法访问。

在k8s中,若pod使用主机网络,也就是hostNetwork=true。则该pod会使用主机的dns以及所有网络配置,默认情况下是无法使用k8s自带的dns解析服务

但是可以修改DNS策略或者修改主机上的 域名 解析(/etc/resolv.conf),使主机可以用k8s自身的dns服务。一般通过DNS策略(ClusterFirstWithHostNet)来使用k8s DNS内部域名解析,k8s DNS策略如下:

Default: 继承Pod所在宿主机的DNS设置,hostNetwork的默认策略。

ClusterFirst(默认DNS策略):优先使用kubernetes环境的dns服务,将无法解析的域名转发到从宿主机继承的dns服务器。

ClusterFirstWithHostNet:和ClusterFirst类似,对于以hostNetwork模式运行的Pod应明确知道使用该策略。也是可以同时解析内部和外部的域名。

None: 忽略kubernetes环境的dns配置,通过spec.dnsConfig自定义DNS配置。

  1. 修改方案

4.1 一般使用主机网络就增加如下几行即可:

hostNetwork:true dnsPolicy:"ClusterFirstWithHostNet"

4.2 第二种方案 去除 hostNetwork:true

二、无法拉取私有仓库镜像

  1. 现象描述

kubectl describe pod nacos-itest-dm-0 -n itest

Events:
  Type     Reason          Age                    From               Message
  ----     ------          ----                   ----               -------
  Normal   Scheduled       6m25s                  default-scheduler  Successfully assigned gov-itest/nacos-gov-itest-dm-0 to host-112
  Normal   SandboxChanged  6m23s                  kubelet            Pod sandbox changed, it will be killed and re-created.
  Warning  Failed          5m41s (x3 over 6m24s)  kubelet            Failed to pull image "public-repository/prdsl/nacos-server:2.0.2": rpc error: code = Unknown desc = Get  unauthorized: Invalid credential. 请确认输入了正确的用户名和密码。
  Warning  Failed          5m41s (x3 over 6m24s)  kubelet            Error: ErrImagePull
  Normal   BackOff         5m7s (x7 over 6m22s)   kubelet            Back-off pulling image "public-repository/prdsl/nacos-server:2.0.2"
  Normal   Pulling         4m53s (x4 over 6m24s)  kubelet            Pulling image "public-repository/prdsl/nacos-server:2.0.2"
  Warning  Failed          75s (x23 over 6m22s)   kubelet            Error: ImagePullBackOff

  1. 原因分析 没有配置私有镜像仓库的拉取密钥

imagePullSecrets:

- name: '${parameters.imagePullSecrets}'

加上这个即可。

查看密钥

kubectl get secret

magePullSecret资源将Secret提供的密码传递给kubelet从而在拉取镜像前完成必要的认证过程,简单说就是你的镜像仓库是私有的,每次拉取是需要认证的。

配置说明

创建docker-registry类型的Secret对象,并在定义pod资源时明确通过"imagePullSecrets"字段来申明使用哪个私钥去认证;

创建docker-registry类型的Secret对象,然后把它添加到某个ServiceAccount对象中,使用了这个ServiceAccount对象创建出来的pod就自然而然通过认证获取到镜像;

你可能感兴趣的:(踩坑记录,kubernetes)