هل هذا تقرير خطأ أم طلب ميزة؟ (اختر واحدًا): تقرير خطأ
إصدار Kubernetes (استخدم kubectl version
):
العميل: v1.6.1
الخادم: v1.6.1+coreos.0
البيئة :
1298.7.0
4.9.16-coreos-r1
quay.io/coreos/hyperkube:v1.6.1_coreos.0
image as systemd kubelet.service
+ Manifests in /etc/kubernetes/manifests
للمكونات الأساسيةkubelet.service
هو:
# /etc/systemd/system/kubelet.service
[Unit]
Description=Kubelet service of Kubernetes
[Service]
# Mounting /etc/hosts is required for kubelet to be able to resolve
# nodes via its aliases (which may be not DNS routable).
Environment="RKT_RUN_ARGS= \
--volume=etc-hosts,kind=host,source=/etc/hosts --mount volume=etc-hosts,target=/etc/hosts \
--volume=var-log,kind=host,source=/var/log --mount volume=var-log,target=/var/log \
--volume=dns,kind=host,source=/etc/resolv.conf --mount volume=dns,target=/etc/resolv.conf \
--uuid-file-save=/var/run/kubelet-pod.uuid"
Environment=KUBELET_IMAGE_URL=quay.io/coreos/hyperkube
Environment=KUBELET_IMAGE_TAG=v1.6.1_coreos.0
ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests
ExecStartPre=/usr/bin/mkdir -p /var/log/containers
ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/run/kubelet-pod.uuid
# Specifying all node labels here is required for kubelet
# to let it know its node state for correct recovery/restarts
# before sychronization with kube-apiserver happens.
ExecStart=/usr/lib/coreos/kubelet-wrapper \
--port=10250 \
--tls-cert-file=/etc/kubernetes/ssl/kubelet.crt \
--tls-private-key-file=/etc/kubernetes/ssl/kubelet.key \
--kubeconfig=/etc/kubernetes/kubeconfig-kubelet.yaml \
--require-kubeconfig \
--register-node=true \
--allow-privileged=true \
--pod-manifest-path=/etc/kubernetes/manifests \
--hostname-override=n1.myhost.net \
--cluster-dns=10.3.0.10 \
--cluster-domain=cluster.local \
--node-labels=role/apiserver=true,role/application=true \
--network-plugin= \
--sync-frequency=30s
ExecStop=-/usr/bin/rkt stop --uuid-file=/var/run/kubelet-pod.uuid
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
/etc/kubernetes/manifests/kube-apiserver.yml
هو:
kind: Pod
apiVersion: v1
metadata:
name: kube-apiserver
namespace: kube-system
spec:
hostNetwork: true
containers:
- name: kube-apiserver
image: quay.io/coreos/hyperkube:v1.6.1_coreos.0
command:
- /hyperkube
- apiserver
- --bind-address=0.0.0.0
- --secure-port=8443
- --insecure-port=8081
- --advertise-address=<public ip>
- --external-hostname=n1.myhost.net
- --client-ca-file=/etc/kubernetes/ssl/ca.crt
- --tls-cert-file=/etc/kubernetes/ssl/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/ssl/apiserver.key
- --service-account-key-file=/etc/kubernetes/ssl/apiserver.key
- --service-cluster-ip-range=10.3.0.0/24
- --etcd-servers=http://n1.myhost.net:4001
- --etcd-cafile=/etc/ssl/etcd/ca.crt
- --etcd-certfile=/etc/ssl/etcd/client.crt
- --etcd-keyfile=/etc/ssl/etcd/client.key
- --storage-backend=etcd2
- --storage-media-type=application/json
- --kubelet-https=true
- --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.crt
- --kubelet-client-certificate=/etc/kubernetes/ssl/apiserver.crt
- --kubelet-client-key=/etc/kubernetes/ssl/apiserver.key
- --allow-privileged=true
- --anonymous-auth=false
- --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota
- --runtime-config=extensions/v1beta1=true,extensions/v1beta1/thirdpartyresources=true
ports:
- name: https
containerPort: 8443
hostPort: 8443
- name: local
containerPort: 8081
hostPort: 8081
volumeMounts:
- name: ssl-certs-kubernetes
mountPath: /etc/kubernetes/ssl
readOnly: true
- name: ssl-certs-etcd
mountPath: /etc/ssl/etcd
readOnly: true
- name: ssl-certs-host
mountPath: /etc/ssl/certs
readOnly: true
volumes:
- name: ssl-certs-kubernetes
hostPath:
path: /etc/kubernetes/ssl
- name: ssl-certs-etcd
hostPath:
path: /etc/ssl/etcd
- name: ssl-certs-host
hostPath:
path: /usr/share/ca-certificates
ماذا حدث :
يبدأ kube-apiserver
Pod ويخرج فورًا مع ظهور خطأ (من docker logs
):
F0408 09:01:03.289906 1 controller.go:128] Unable to perform initial IP allocation check: unable to refresh the service IP block: Get https://localhost:8443/api/v1/services: dial tcp: lookup localhost on 8.8.8.8:53: no such host
بطريقة ما يحاول apiserver حل مشكلة localhost
عبر DNS خارجي.
ما توقعت حدوثه :
يجب أن يبدأ kube-apiserver
بشكل طبيعي كما هو الحال في إصدارات 1.5 Kubernetes.
كيفية إعادة إنتاجه (بأقل قدر ممكن من الدقة والدقة):
عن طريق تمهيد مجموعة Kubernetes على CoreOS ولكن لإصدار v1.6.1 Kubernetes.
أي شيء آخر نريد أن نعرفه :
أثناء تقصيتي ، تمت إضافة قيمة ClusterFirstWithHostNet
dnsPolicy
PodSpec
في 1.6 . انها تقول:
لتعيين خيارات DNS جنبًا إلى جنب مع hostNetwork ، يجب عليك تحديد سياسة DNS بشكل صريح إلى "ClusterFirstWithHostNet".
حاولت تحديد dnsPolicy: ClusterFirstWithHostNet
صراحة ، وكان لدي خطأ مختلف:
F0408 08:57:52.675808 1 controller.go:128] Unable to perform initial IP allocation check: unable to refresh the service IP block: Get https://localhost:8443/api/v1/services: dial tcp: lookup localhost on 10.3.0.10:53: write udp <public ip>:37836->10.3.0.10:53: write: operation not permitted
أيضًا ، تم الاطلاع على خيارات CLI kube-apiserver
ولم يتم العثور على شيء متعلق بضبطه.
يتم نشر KubeDNS في التثبيت الخاص بي كالمعتاد النشر في مساحة الاسم kube-system
، وليس كعنصر إضافي في /etc/kubernetes/manifests
dir.
أية اقتراحات لماذا apiserver
يحاول حل localhost
على 8.8.8.8
؟
ألقِ نظرة على /etc/hosts
لمضيفك وتعرّف على ما إذا كان يحتوي على localhost. كانت هذه هي المشكلة في الإعداد الخاص بي بنفس التكوين تمامًا ، احتوى /etc/hosts
الخاص بي فقط على اسم مضيف جهازي وعنوان IP ولكن لا يوجد مضيف محلي. عندما أضفت 127.0.0.1 localhost
وأعدت تشغيل apiserver كان يعمل.
إنجينيوس! 🤦🤦🤦🤦
هذا بالضبط هو الموضوع.
@ lorenz شكرا جزيلا!
التعليق الأكثر فائدة
ألقِ نظرة على
/etc/hosts
لمضيفك وتعرّف على ما إذا كان يحتوي على localhost. كانت هذه هي المشكلة في الإعداد الخاص بي بنفس التكوين تمامًا ، احتوى/etc/hosts
الخاص بي فقط على اسم مضيف جهازي وعنوان IP ولكن لا يوجد مضيف محلي. عندما أضفت127.0.0.1 localhost
وأعدت تشغيل apiserver كان يعمل.