Kubernetes / 运维笔记

k8s-HA涉及到ip填写坑

Einic Yeo · 3月22日 · 2019年 ·

etcd就不说了,奇数个副本,可以坏(n-1)/2个,但是不可能同时坏那么多,这里不讨论etcd单独不单独跑。推荐文档

ha_pic1

     先说说k8s组件,kubelet和kube-proxy啥的肯定写LB或者VIP:HA_port,如官方的图scheduler和controller连接的apiserver地址我看网上有写127的也有写LB或者VIP:HA_port的,刚看到官方文档说两种都行 。

      官方文档这说得基本有疑问的都写清楚了,前期scheduler和controller不支持ha,后来增加了选举功能,他俩连apiserver的ip写版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!127.0.0.1和负载均衡器都可以
apiserver这块介绍比较少,但是可以根据kubeadm部署的推理一些猜测。

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
apiServer:
  certSANs:
  - "LOAD_BALANCER_DNS"
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"

controlPlaneEndpoint:应匹配负载均衡器的地址或DNS和端口
      而这个controlPlaneEndpoint实际上最终会取ip(注意不带端口)写到kube-apiserver的选项--advertise-address作为值。
      默认情况下--advertise-address不配置将会和--bind-address一样。它的作用就是宣告,在etcd启动后kube-apiserver初次起来后会创建一个svc名叫kubernetes,而这个svc的endpoints就是选项--advertise-address的ip,port则是apiserver的--secure-port。假设用户配置的--secure-port为6443,所以一般云上SLB的话那这个宣告可以填写LB的ip,然后默认的kubernetes的endpoints是<SLB_IP>:6443。
      截止到现在似乎都没有啥坑,但是这几天写生产环境的部署方案的时候,因为考虑到多网卡,而kubeadm部署的默认很多组件是bind 0.0.0.0的会导致所有网卡的ip的请求都会监听。于是我--bind-address写网卡ip例如三台分别是172.16.1.2、3、4,HA用的keepalived+haproxy,vip是5。因为master上6443被apiserver监听了,所以haproxy是另一个端口我是用的8443。

      而坑就是宣告,我仿照官方意见--ad版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!vertis版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!e-address写了VIP(带不了端口,否则报错)。启动了apiserver后默认宣告kubernetes的ep是VIP:6443,发现后面例如flannel的pod要请求apiserver的时候走它根本不通。因为apiserver是bind的网卡ip,而haproxy是bind 0.0.0.0:8443,没有任何进程是bind vip:6443,所以请求走vip:6443是版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!不通的。于是我patch了ep改为了8443。但是后面发现只要一重启kube-apiserver就宣告的ep的port就成了6443。之前apiserver是bind 0.0.0.0是没问题的,所以如果是多网卡还用的VIP这种ha下,宣告还是写node自己的网卡ip或者不写,虽然集群内pod访问apiserver走的是svc的负载均衡,但是你要是不想负载在svc那就花钱上LB宣告LB的ip呗。
写node的网卡ip后,apis版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!erver存活期间会去更新ep的ttl,只要apiserver 宕了它的ep会因为没有刷新ttl而被自动剔除。这个想法是issue里看到别人提到的想法,也就是现在的工作原理。

[root@k8s-m3 ~]# systemctl stop kube-apiserver
[root@k8s-m3 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   172.16.1.3:6443,172.16.1.4:6443   24h
[root@k8s-m3 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   172.16.1.3:6443,172.16.1.4:6443   24h
[root@k8s-m3 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   172.16.1.3:6443,172.16.1.4:6443   24h
[root@k8s-m3 ~]# systemctl restart kube-apiserver
[root@k8s-m3 ~]# kubectl get ep
NAME         ENDPOINTS                                          AGE
kubernetes   172.16.1.10:6443,172.16.1.3:6443,172.16.1.4:6443   24h

参考文献

https://github.com/etcd-io/etcd/tree/master/Documentation/op-guide
https://kubernetes.io/zh/docs/admin/high-availability/#%E8%BF%9B%E8%A1%8Cmaster%E9%80%89%E4%B8%BE%E7%9A%84%E7%BB%84%E4%BB%B6
https://kubernetes.io/docs/setup/independent/high-availability/

1 条回应
  1. VVD2019-3-22 · 15:14

    正看得欢 , 发现看到末尾戛然而止