keepalived-vipKubernetes 使用 keepalived 来产生虚拟 IP address + 我们将探讨如何利用 IPVS - The Linux Virtual Server Project' 来 kubernetes 配置 VIP + 前言kubernetes v1.6 版提供了三种方式去暴露 Service: +
有了这些方式, 为何我们还需要 keepalived ? + ___________________ | | |-----| Host IP: 10.4.0.3 | | |___________________| | | ___________________ | | |Public ----(example.com = 10.4.0.3/4/5)----|-----| Host IP: 10.4.0.4 | | |___________________| | | ___________________ | | | |-----| Host IP: 10.4.0.5 | |___________________| 我们假设 Ingress 运行在 3 个 kubernetes 节点上, 并对外暴露 + DNS Round Robin (RR) 将对应到 + 严格来说, 这并没有真正的做到 High Availability (HA) + 这边 IPVS 可以帮助我们解决这件事, 这个想法是虚拟 IP(VIP) 对应到每个 service 上, 并将 VIP 暴露到 kubernetes 群集之外 + 与 service-loadbalancer 或 ingress-nginx 的区别我们看到以下的图 +
我们可以看到只有一个 node 被选为 Master(透过 VRRP 选择的), 而我们的 VIP 是 + 环境需求只需要确认要运行 keepalived-vip 的 kubernetes 群集 DaemonSets 功能是正常的就行了 + RBAC由于 kubernetes 在 1.6 后引进了 RBAC 的概念, 所以我们要先去设定 rule, 至於有关 RBAC 的详情请至 说明。 + vip-rbac.yaml + apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: kube-keepalived-viprules:- apiGroups: [''] resources: - pods - nodes - endpoints - services - configmaps verbs: ['get', 'list', 'watch']---apiVersion: v1kind: ServiceAccountmetadata: name: kube-keepalived-vip namespace: default---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: kube-keepalived-viproleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-keepalived-vipsubjects:- kind: ServiceAccount name: kube-keepalived-vip namespace: default clusterrolebinding.yaml +
$ kubectl create -f vip-rbac.yaml$ kubectl create -f clusterrolebinding.yaml 示例先建立一个简单的 service + nginx-deployment.yaml +
主要功能就是 pod 去监听听 80 port, 再开启 service NodePort 监听 30320 + $ kubecrl create -f nginx-deployment.yaml 接下来我们要做的是 config map +
注意, 这边的 + 接着确认一下 + $kubectl get configmapNAME DATA AGEvip-configmap 1 23h 再来就是设置 keepalived-vip +
建立 daemonset + $ kubectl get daemonset kube-keepalived-vipNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE-SELECTOR AGEkube-keepalived-vip 5 5 5 5 5 检查一下配置状态 +
可以随机挑一个 pod, 去看里面的配置 + $ kubectl exec kube-keepalived-vip-c4sxw cat /etc/keepalived/keepalived.confglobal_defs { vrrp_version 3 vrrp_iptables KUBE-KEEPALIVED-VIP}vrrp_instance vips { state BACKUP interface eno1 virtual_router_id 50 priority 103 nopreempt advert_int 1 track_interface { eno1 } virtual_ipaddress { 10.87.2.50 }}# Service: default/nginxvirtual_server 10.87.2.50 80 { // 此为 service 开的口 delay_loop 5 lvs_sched wlc lvs_method NAT persistence_timeout 1800 protocol TCP real_server 10.2.49.30 8080 { // 这里说明 pod 的真实状况 weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 } }} 最后我们去测试这功能 +
10.87.2.50:80(我们假设的 VIP, 实际上其实没有 node 是用这 IP) 即可帮我们导向这个 service + 以上的程式代码都在 github 上可以找到。 + 参考文档 |
|