K3s - tcp 10.43.0.1:443 다이얼: 연결: 연결이 거부되었습니다.

K3s - tcp 10.43.0.1:443 다이얼: 연결: 연결이 거부되었습니다.

다음과 같이 K3s 다중 마스터 임베디드 클러스터를 만들었습니다.

호스트 이름: k3s01

curl -sfL https://get.k3s.io | K3S_TOKEN=xxx INSTALL_K3S_EXEC="server --disable servicelb --disable traefik --bind-address=10.0.0.4 --tls-san 10.0.0.4 --node-external-ip=168.119.x.x --node-ip=10.0.0.4 --flannel-iface=enp7s0 --advertise-address=PUBIP-OF-LB --cluster-init" sh -

호스트 이름: k8s02

curl -sfL https://get.k3s.io | K3S_TOKEN=xxx INSTALL_K3S_EXEC="server --disable servicelb --disable traefik --bind-address=10.0.0.2 --tls-san 10.0.0.2 --node-ip 10.0.0.2 --node-external-ip=168.119.x.x  --flannel-iface=enp7s0 --server=https://10.0.0.4:6443" sh -

호스트 이름: k8s03

curl -sfL https://get.k3s.io | K3S_TOKEN=xxx INSTALL_K3S_EXEC="server --disable servicelb --disable traefik --bind-address=10.0.0.3 --tls-san 10.0.0.3 --node-ip 10.0.0.3 --node-external-ip=168.119.x.x  --flannel-iface=enp7s0 --server=https://10.0.0.4:6443" sh -

LB-IP를 통해 kubectl을 사용하여 로컬 컴퓨터에서 연결할 수 있습니다! LB: TCP 6443 -> 6443

위의 모든 노드 내에서 kubectl을 사용할 수도 있습니다. Hetzner용 CSI를 배포했는데 그것도 잘 작동합니다. 테스트 배포를 통해 테스트되었습니다!

그러나 그 모든 것(지금까지는 잘 작동함) 후에 ingress-nginx를 설치하려고 했습니다. 아무런 문제 없이 배포가 시작되었습니다. 하지만 ingress-nginx-controller의 다음 로그에 표시된 것처럼 클러스터 내에서 apiserver와 통신하는 데 문제가 있음을 발견했습니다.

E1204 11:42:25.216392       8 leaderelection.go:321] error retrieving resource lock ingress-nginx/ingress-controller-leader-nginx: Get "https://10.43.0.1:443/api/v1/namespaces/ingress-nginx/configmaps/ingress-controller-leader-nginx": dial tcp 10.43.0.1:443: connect: connection refused

흠, 이상해요! 좋습니다. 몇 가지 사항을 확인해 보겠습니다.

kubectl get svc kubernetes -o yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2020-12-04T11:22:25Z"
  labels:
    component: apiserver
    provider: kubernetes
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:component: {}
          f:provider: {}
      f:spec:
        f:clusterIP: {}
        f:ports:
          .: {}
          k:{"port":443,"protocol":"TCP"}:
            .: {}
            f:name: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: k3s
    operation: Update
    time: "2020-12-04T11:22:25Z"
  name: kubernetes
  namespace: default
  resourceVersion: "10434"
  selfLink: /api/v1/namespaces/default/services/kubernetes
  uid: f0993556-3b7f-40aa-a293-45170cb03002
spec:
  clusterIP: 10.43.0.1
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: 6443
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

gtm인 것 같습니다.

kubectl get endpoints -o yaml

apiVersion: v1
items:
- apiVersion: v1
  kind: Endpoints
  metadata:
    creationTimestamp: "2020-12-04T11:22:25Z"
    labels:
      endpointslice.kubernetes.io/skip-mirror: "true"
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:labels:
            .: {}
            f:endpointslice.kubernetes.io/skip-mirror: {}
        f:subsets: {}
      manager: k3s
      operation: Update
      time: "2020-12-04T11:23:39Z"
    name: kubernetes
    namespace: default
    resourceVersion: "808"
    selfLink: /api/v1/namespaces/default/endpoints/kubernetes
    uid: cb450392-b4c9-4c2f-bfde-1a3b20ac4b5d
  subsets:
  - addresses:
    - ip: 167.233.x.x
    - ip: 168.119.x.x
    - ip: 168.119.x.x
    ports:
    - name: https
      port: 6443
      protocol: TCP
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

좋습니다. Pub IP가 여기에 있는 이유는 무엇인가요? IP 중 하나를 직접 호출하려면 하나의 Pod 내에서 확인하세요.

kubectl exec -it ingress-controler-pod-xxxx -- bash

bash-5.0$ curl https://167.233.x.x:6443 --insecure
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "Unauthorized",
  "reason": "Unauthorized",
  "code": 401
}bash-5.0$ curl https://10.43.0.1:443
curl: (7) Failed to connect to 10.43.0.1 port 443: Connection refused

알았어.. 이상해!

또한 때로는 다음과 같은 오류가 발생합니다.

Error from server: error dialing backend: dial tcp: lookup k8s02: Try again

포드에 상위 exex를 시도하거나 로그를 표시할 때 나타납니다. 이는 다른 호스트에서 실행 중인 대상 포드에 대해 이 작업을 수행하려고 할 때만 발생합니다.

DNS에 문제가 있는 걸까요?

cat /etc/resolv.conf
nameserver 127.0.0.53
options edns0 trust-ad

내 호스트를 이름으로 확인할 수 없습니다. 그러나 저는 방금 K3s 설정에서 IP를 지정했습니다. 내 호스트 간에 DNS를 작동해야 합니까? K3s 설치 매개변수에 문제가 있나요?

답변1

잘못 구성된 DNS 확인으로 인해 비슷한 문제가 발생했습니다. 노드 호스트 이름을 서로 확인할 수 있는지 확인하세요.

관련 정보