Ich habe einen eingebetteten K3s-Multimastercluster wie folgt erstellt:
Hostname: 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 -
Hostname: 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 -
Hostname: 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 -
Ich kann mich von meinem lokalen Rechner aus mit kubectl über die LB-IP verbinden! LB: tcp 6443 -> 6443
Ich kann kubectl auch von jedem der oben genannten Knoten aus verwenden. Ich habe CSI für Hetzner bereitgestellt, das funktioniert auch einwandfrei. Getestet mit ihrer Testbereitstellung!
Nach all dem (was bisher gut funktioniert) habe ich jedoch versucht, ingress-nginx zu installieren. Die Bereitstellung startete ohne Probleme. Ich habe jedoch festgestellt, dass es ein Problem bei der Kommunikation mit dem API-Server innerhalb des Clusters gibt, wie das folgende Protokoll des ingress-nginx-Controllers zeigt:
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
Hm, seltsam! Ok, lass uns ein paar Checks machen:
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: {}
Sieht toll aus.
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: ""
Ok, warum gibt es hier Pub-IPs? Überprüfen wir es von innerhalb eines Pods aus, um eine der IPs direkt aufzurufen:
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
Ok... das ist seltsam!
Manchmal treten auch Fehler auf wie:
Error from server: error dialing backend: dial tcp: lookup k8s02: Try again
erscheint, wenn ich versuche, exex in einen Pod einzubinden oder Protokolle anzuzeigen. Das passiert nur, wenn ich versuche, dies mit einem Ziel-Pod zu tun, der auf einem anderen Host läuft.
Stimmt etwas mit DNS nicht?
cat /etc/resolv.conf
nameserver 127.0.0.53
options edns0 trust-ad
Ich kann meine Hosts nicht anhand ihres Namens auflösen. Allerdings habe ich im K3s-Setup gerade IPs angegeben. Benötige ich funktionierendes DNS zwischen meinen Hosts? Stimmt etwas mit meinen K3s-Installationsparametern nicht?
Antwort1
Ich hatte ein ähnliches Problem, das durch eine falsch konfigurierte DNS-Auflösung verursacht wurde. Überprüfen Sie, ob Sie die Hostnamen der Knoten untereinander auflösen können.