2015-06-30 15 views
11

tôi triển khai apiserver trên nút chính (core01) với conf sau:Làm cách nào để cho phép kubelet liên lạc với apiserver bằng HTTPS? v0.19

core01> /opt/bin/kube-apiserver \ 
    --insecure_bind_address=127.0.0.1 \ 
    --insecure_port=8080 \ 
    --kubelet_port=10250 \ 
    --etcd_servers=http://core01:2379,http://core02:2379,http://core03:2379 \ 
    --service-cluster-ip-range=10.1.0.0/16 \ 
    --allow_privileged=false \ 
    --logtostderr=true \ 
    --v=5 \ 
    --tls-cert-file="/var/run/kubernetes/apiserver_36kr.pem" \ 
    --tls-private-key-file="/var/run/kubernetes/apiserver_36kr.key" \ 
    --client-ca-file="/var/run/kubernetes/cacert.pem" \ 
    --kubelet-certificate-authority="/var/run/kubernetes/cacert.pem" \ 
    --kubelet-client-certificate="/var/run/kubernetes/kubelet_36kr.pem" \ 
    --kubelet-client-key="/var/run/kubernetes/kubelet_36kr.key" 

Mở nút minion (core02), tôi có thể gọi api từ HTTPS:

core02> curl https://core01:6443/api/v1/nodes --cert /var/run/kubernetes/kubelet_36kr.pem --key /var/run/kubernetes/kubelet_36kr.key 
> GET /api/v1/nodes HTTP/1.1 
> Host: core01:6443 
> User-Agent: curl/7.42.1 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Content-Type: application/json 
< Date: Sat, 27 Jun 2015 15:33:50 GMT 
< Content-Length: 1577 
< 
{ 
    "kind": "NodeList", 
    "apiVersion": "v1", 
    "metadata": { 
    "selfLink": "/api/v1/nodes", 
    "resourceVersion": "510078" 
    }, .... 

Tuy nhiên, tôi có thể không bắt đầu kubelet trên minion này. Nó luôn luôn khiếu nại không có thông tin.

Tôi làm cách nào để nó hoạt động? Có tài liệu nào trên master < -> xác thực truyền thông minion không? Bạn có thể vui lòng cho tôi thực hành tốt nhất không?


FYI, Lệnh là như sau:

core02> /opt/bin/kubelet \ 
    --logtostderr=true \ 
    --v=0 \ 
    --api_servers=https://core01:6443 \ 
    --address=127.0.0.1 \ 
    --port=10250 \ 
    --allow-privileged=false \ 
    --tls-cert-file="/var/run/kubernetes/kubelet_36kr.pem" \ 
    --tls-private-key-file="/var/run/kubernetes/kubelet_36kr.key" 

kubelet log được như sau:

W0627 23:34:03.646311 3004 server.go:460] Could not load kubeconfig file /var/lib/kubelet/kubeconfig: stat /var/lib/kubelet/kubeconfig: no such file or directory. Trying auth path instead. 
W0627 23:34:03.646520 3004 server.go:422] Could not load kubernetes auth path /var/lib/kubelet/kubernetes_auth: stat /var/lib/kubelet/kubernetes_auth: no such file or directory. Continuing with defaults. 
I0627 23:34:03.646710 3004 manager.go:127] cAdvisor running in container: "/system.slice/sshd.service" 
I0627 23:34:03.647292 3004 fs.go:93] Filesystem partitions: map[/dev/sda9:{mountpoint:/ major:0 minor:30} /dev/sda4:{mountpoint:/usr major:8 minor:4} /dev/sda6:{mountpoint:/usr/share/oem major:8 minor:6}] 
I0627 23:34:03.648234 3004 manager.go:156] Machine: {NumCores:1 CpuFrequency:2399996 MemoryCapacity:1046294528 MachineID:29f94a4fad8b31668bd219ca511bdeb0 SystemUUID:4F4AF929-8BAD-6631-8BD2-19CA511BDEB0 BootID:fa1bea28-675e-4989-ad86-00797721a794 Filesystems:[{Device:/dev/sda9 Capacity:18987593728} {Device:/dev/sda4 Capacity:1031946240} {Device:/dev/sda6 Capacity:113229824}] DiskMap:map[8:0:{Name:sda Major:8 Minor:0 Size:21474836480 Scheduler:cfq} 8:16:{Name:sdb Major:8 Minor:16 Size:1073741824 Scheduler:cfq}] NetworkDevices:[{Name:eth0 MacAddress:52:54:71:f6:fc:b8 Speed:0 Mtu:1500} {Name:flannel0 MacAddress: Speed:10 Mtu:1472}] Topology:[{Id:0 Memory:1046294528 Cores:[{Id:0 Threads:[0] Caches:[{Size:32768 Type:Data Level:1} {Size:32768 Type:Instruction Level:1} {Size:4194304 Type:Unified Level:2}]}] Caches:[]}]} 
I0627 23:34:03.649934 3004 manager.go:163] Version: {KernelVersion:4.0.5 ContainerOsVersion:CoreOS 695.2.0 DockerVersion:1.6.2 CadvisorVersion:0.15.1} 
I0627 23:34:03.651758 3004 plugins.go:69] No cloud provider specified. 
I0627 23:34:03.651855 3004 docker.go:289] Connecting to docker on unix:///var/run/docker.sock 
I0627 23:34:03.652877 3004 server.go:659] Watching apiserver 
E0627 23:34:03.748954 3004 reflector.go:136] Failed to list *api.Pod: the server has asked for the client to provide credentials (get pods) 
E0627 23:34:03.750157 3004 reflector.go:136] Failed to list *api.Node: the server has asked for the client to provide credentials (get nodes) 
E0627 23:34:03.751666 3004 reflector.go:136] Failed to list *api.Service: the server has asked for the client to provide credentials (get services) 
I0627 23:34:03.758158 3004 plugins.go:56] Registering credential provider: .dockercfg 
I0627 23:34:03.856215 3004 server.go:621] Started kubelet 
E0627 23:34:03.858346 3004 kubelet.go:662] Image garbage collection failed: unable to find data for container/
I0627 23:34:03.869739 3004 kubelet.go:682] Running in container "/kubelet" 
I0627 23:34:03.869755 3004 server.go:63] Starting to listen on 127.0.0.1:10250 
E0627 23:34:03.899877 3004 event.go:185] Server rejected event '&api.Event{TypeMeta:api.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:api.ObjectMeta{Name:"core02.13eba23275ceda25", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:util.Time{Time:time.Time{sec:0, nsec:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*util.Time)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil)}, InvolvedObject:api.ObjectReference{Kind:"Node", Namespace:"", Name:"core02", UID:"core02", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"starting", Message:"Starting kubelet.", Source:api.EventSource{Component:"kubelet", Host:"core02"}, FirstTimestamp:util.Time{Time:time.Time{sec:63571016043, nsec:856189989, loc:(*time.Location)(0x1ba6120)}}, LastTimestamp:util.Time{Time:time.Time{sec:63571016043, nsec:856189989, loc:(*time.Location)(0x1ba6120)}}, Count:1}': 'the server has asked for the client to provide credentials (post events)' (will not retry!) 
I0627 23:34:04.021297 3004 factory.go:226] System is using systemd 
I0627 23:34:04.021790 3004 factory.go:234] Registering Docker factory 
I0627 23:34:04.022241 3004 factory.go:89] Registering Raw factory 
I0627 23:34:04.144065 3004 manager.go:946] Started watching for new ooms in manager 
I0627 23:34:04.144655 3004 oomparser.go:183] oomparser using systemd 
I0627 23:34:04.145379 3004 manager.go:243] Starting recovery of all containers 
I0627 23:34:04.293020 3004 manager.go:248] Recovery completed 
I0627 23:34:04.343829 3004 status_manager.go:56] Starting to sync pod status with apiserver 
I0627 23:34:04.343928 3004 kubelet.go:1683] Starting kubelet main sync loop. 
E0627 23:34:04.457765 3004 event.go:185] Server rejected event '&api.Event{TypeMeta:api.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:api.ObjectMeta{Name:"core02.13eba232995c8213", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:util.Time{Time:time.Time{sec:0, nsec:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*util.Time)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil)}, InvolvedObject:api.ObjectReference{Kind:"Node", Namespace:"", Name:"core02", UID:"core02", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"NodeReady", Message:"Node core02 status is now: NodeReady", Source:api.EventSource{Component:"kubelet", Host:"core02"}, FirstTimestamp:util.Time{Time:time.Time{sec:63571016044, nsec:452676115, loc:(*time.Location)(0x1ba6120)}}, LastTimestamp:util.Time{Time:time.Time{sec:63571016044, nsec:452676115, loc:(*time.Location)(0x1ba6120)}}, Count:1}': 'the server has asked for the client to provide credentials (post events)' (will not retry!) 
E0627 23:34:04.659874 3004 event.go:185] Server rejected event '&api.Event{TypeMeta:api.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:api.ObjectMeta{Name:"core02.13eba232a599cf8c", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:util.Time{Time:time.Time{sec:0, nsec:0, loc:(*time.Location)(nil)}}, DeletionTimestamp:(*util.Time)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil)}, InvolvedObject:api.ObjectReference{Kind:"Node", Namespace:"", Name:"core02", UID:"core02", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"NodeReady", Message:"Node core02 status is now: NodeReady", Source:api.EventSource{Component:"kubelet", Host:"core02"}, FirstTimestamp:util.Time{Time:time.Time{sec:63571016044, nsec:658020236, loc:(*time.Location)(0x1ba6120)}}, LastTimestamp:util.Time{Time:time.Time{sec:63571016044, nsec:658020236, loc:(*time.Location)(0x1ba6120)}}, Count:1}': 'the server has asked for the client to provide credentials (post events)' (will not retry!) 

Trả lời

20

Hai dòng đầu tiên của file bản ghi kubelet thực trỏ đến vấn đề cơ bản - bạn không chỉ định bất kỳ thông tin đăng nhập nào của khách hàng cho kubelet để kết nối với máy chủ.

Các đối số --tls-cert-file--tls-private-key-file cho kubelet được sử dụng để định cấu hình máy chủ http trên kubelet (nếu không được chỉ định, kubelet will generate a self-signed certificate for its https endpoint). Cặp chứng chỉ/khóa này không được sử dụng làm chứng chỉ ứng dụng khách được hiển thị cho trình chủ để xác thực.

Để chỉ định bằng chứng xác thực, có hai tùy chọn: tệp kubeconfig và tệp kubernetes_auth. Sau này không được chấp nhận, vì vậy tôi khuyên bạn nên sử dụng tệp kubeconfig.

Bên trong tệp kubeconfig bạn cần phải chỉ định mã thông báo người gửi hoặc chứng chỉ ứng dụng khách mà kubelet sẽ hiển thị cho trình xác nhận. Bạn cũng có thể chỉ định chứng chỉ CA cho apiserver (nếu bạn muốn kết nối được bảo mật) hoặc yêu cầu kubelet bỏ qua việc kiểm tra chứng chỉ được trình apiserver trình bày. Vì bạn có các chứng chỉ cho trình apiserver, tôi khuyên bạn nên thêm chứng chỉ CA vào tệp kubeconfig.

tập tin Các kubeconfig nên hình như:

apiVersion: v1 
kind: Config 
users: 
- name: kubelet 
    user: 
    client-certificate-data: <base64-encoded-cert> 
    client-key-data: <base64-encoded-key> 
clusters: 
- name: local 
    cluster: 
    certificate-authority-data: <base64-encoded-ca-cert> 
contexts: 
- context: 
    cluster: local 
    user: kubelet 
    name: service-account-context 
current-context: service-account-context 

Để tạo ra mã hóa base64 khách hàng cert, bạn sẽ có thể để chạy một cái gì đó giống như cat /var/run/kubernetes/kubelet_36kr.pem | base64. Nếu bạn không có chứng chỉ CA, bạn có thể thay thế certificate-authority-data: <base64-encoded-ca-cert> bằng insecure-skip-tls-verify: true.

Nếu bạn đặt tệp này tại /var/lib/kubelet/kubeconfig, nó sẽ được chọn tự động. Nếu không, bạn có thể sử dụng đối số --kubeconfig để chỉ định vị trí tùy chỉnh.

+0

Cảm ơn bạn rất nhiều! Nó hoạt động. – ShenLei

+0

Nếu một trong những hàng thủ công một kubeconfig theo đề nghị của bạn, Robert, có vẻ như để nói chuyện để sử dụng bởi các kubelet. Nhưng kube-proxy có cùng tùy chọn dòng lệnh để sử dụng --kubeconfig. Nếu một điểm kube-proxy đến cùng một điểm kubeconfig kubelet, được tạo theo đề xuất của bạn, proxy có thể sử dụng nó không? Mặc dù người dùng là "kubelet" trong kubeconfig? – ae6rt

+0

@ ae6rt: Có, nó cũng hoạt động với kube-proxy (ngay bây giờ không có sự phân biệt nào giữa các "vai trò" khác nhau trong apiserver và tất cả các thông tin có cùng quyền truy cập vào cụm). –

1

Khi Robert Bailey cho biết, vấn đề chính phải thực hiện với thông tin đăng nhập của khách hàng để kết nối chính ("Không thể tải tệp kubeconfig/var/lib/kubelet/kubeconfig ..."). Thay vì tạo tệp kubeconfig theo cách thủ công, tôi đã chọn tạo tệp bằng công cụ kubectl.

Ví dụ từ docs:

$ kubectl config set-credentials myuser --username=myusername --password=mypassword 
$ kubectl config set-cluster local-server --server=http://localhost:8080 
$ kubectl config set-context default-context --cluster=local-server --user=myuser 
$ kubectl config use-context default-context 
$ kubectl config set contexts.default-context.namespace mynamespace 

Những lệnh này sẽ tạo ra một file config trong ~/.kube/config

Kiểm tra kết quả với:

$ kubectl config view 

Sau đó, tôi chỉ tạo một liên kết tượng trưng bên trong/var/lib/kubelet (vị trí mặc định) vào tệp cấu hình của tôi:

$ cd /var/lib/kubelet 
$ sudo ln -s ~/.kube/config kubeconfig 

Điều này phù hợp với tôi. Hy vọng nó cũng làm việc cho bạn.

2

Tất cả tín dụng cho jnoller khi ông chỉ định các lệnh bên dưới trên issue này.
Ông chỉ cần thực hiện một lỗi đánh máy vì ông chạy kubectl config set-credentials hai lần

này tương tự như Robert Bailey 's chấp nhận câu trả lời ngoại trừ bạn không cần phải base64 bất cứ điều gì và nó làm cho nó dễ dàng để kịch bản.

kubectl config set-cluster default-cluster --server=https://${MASTER} \ 
    --certificate-authority=/path/to/ca.pem 

kubectl config set-credentials default-admin \ 
    --certificate-authority=/path/to/ca.pem \ 
    --client-key=/path/to/admin-key.pem \ 
    --client-certificate=/path/to/admin.pem  

kubectl config set-context default-system --cluster=default-cluster --user=default-admin 
kubectl config use-context default-system 

Kết quả là cấu hình được tạo ra trong ~/.kube/config trông như thế này:

apiVersion: v1 
clusters: 
- cluster: 
    certificate-authority: /etc/kubernetes/certs/ca.crt 
    server: https://kubernetesmaster 
    name: default-cluster 
contexts: 
- context: 
    cluster: default-cluster 
    user: default-admin 
    name: default-system 
current-context: default-system 
kind: Config 
preferences: {} 
users: 
- name: default-admin 
    user: 
    client-certificate: /etc/kubernetes/certs/server.crt 
    client-key: /etc/kubernetes/certs/server.key 
Các vấn đề liên quan