【发布时间】:2019-01-19 13:07:06
【问题描述】:
在 Kubernetes v1.11 documentation 之后,我设法使用 kubeadm、堆叠控制平面节点设置 Kubernetes 高可用性,其中 3 个主服务器在 CentOS7 虚拟机上运行。但由于没有可用的负载均衡器,我使用 Keepalived 为 apiserver 设置故障转移虚拟 IP (10.171.4.12),如 Kubernetes v1.10 documentation 中所述。结果,我用于引导控制平面的“kubeadm-config.yaml”具有以下标头:
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.0
apiServerCertSANs:
- "10.171.4.12"
api:
controlPlaneEndpoint: "10.171.4.12:6443"
etcd:
...
配置顺利,在提升所有 3 个 Master 时出现以下警告:
[endpoint] 警告:在 api.controlPlaneEndpoint 中指定的端口 覆盖控制平面地址中的 api.bindPort
加入工人时的这个警告:
[WARNING RequiredIPVSKernelModulesAvailable]:IPVS 代理将 不使用,因为以下需要的内核模块没有 已加载:[ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh] 或没有内置内核 ipvs 支持:map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}] 您可以通过以下方式解决此问题 方法:
1. 运行“modprobe --”加载缺失的内核模块;
2.提供缺少的内置内核ipvs支持
之后,基本测试成功:
- 当停止时,Keepalived 故障转移到另一个 Master 并且 apiserver 始终可以访问(所有 kubectl 命令都成功)。
- 停止主 Master 时(具有最高 Keepalived 首选项),应用程序部署成功(通过 Kubernetes 训练营测试),并且当主 Master 重新联机时,一切都与主 Master 正确同步。
- Kubernetes bootcamp 应用程序运行成功,当使用 NodePort 暴露 bootcamp 的服务 curl 时,所有 master 和 worker 节点都能正常响应。
- 按照https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/docker-registry成功部署docker-registry
但随之而来的是这些问题:
- Nginx Ingress Controller pod 无法运行并进入状态 CrashLoopBackOff(请参阅下面的事件)
- 在任何 Master 上安装 helm 和 tiller 后,所有使用“helm install”或“helm list”的命令都无法执行(请参阅下面的命令输出)
我正在运行 Kubernetes v1.11.1,但 kubeadm-config.yaml 提到 1.11.0,这是我应该担心的吗?
我是否应该不遵循官方文档并寻求其他替代方案,例如:https://medium.com/@bambash/ha-kubernetes-cluster-via-kubeadm-b2133360b198
注意:使用最新版本 1.11.2(三个 master + 一个 worker)安装新的 Kubernetes HA 并部署 nginx 最新的入口控制器版本 0.18.0 时同样的问题。
-- Nginx 控制器 pod 事件和日志:
Normal Pulled 28m (x38 over 2h) kubelet, node3.local Container image "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.17.1" already present on machine
Warning Unhealthy 7m (x137 over 2h) kubelet, node3.local Liveness probe failed: Get http://10.240.3.14:10254/healthz: dial tcp 10.240.3.14:10254: connect: connection refused
Warning BackOff 2m (x502 over 2h) kubelet, node3.local Back-off restarting failed container
nginx version: nginx/1.13.12
W0809 14:05:46.171066 5 client_config.go:552] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
I0809 14:05:46.171748 5 main.go:191] Creating API client for https://10.250.0.1:443
-- helm 命令输出:
'# helm install ...
Error: no available release name found
'# helm list
Error: Get https://10.250.0.1:443/api/v1/namespaces/kube-system/configmaps?labelSelector=OWNER%!D(MISSING)TILLER: dial tcp 10.250.0.1:443: i/o timeout
-- Kubernetes 服务和端点:
# kubectl describe svc kubernetes
Name: kubernetes
Namespace: default
Labels: component=apiserver
provider=kubernetes
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP: 10.250.0.1
Port: https 443/TCP
TargetPort: 6443/TCP
Endpoints: 10.171.4.10:6443,10.171.4.8:6443,10.171.4.9:6443
Session Affinity: None
Events: <none>
# kubectl get endpoints --all-namespaces
NAMESPACE NAME ENDPOINTS AGE
default bc-svc 10.240.3.27:8080 6d
default kubernetes 10.171.4.10:6443,10.171.4.8:6443,10.171.4.9:6443 7d
ingress-nginx default-http-backend 10.240.3.24:8080 4d
kube-system kube-controller-manager <none> 7d
kube-system kube-dns 10.240.2.4:53,10.240.2.5:53,10.240.2.4:53 + 1 more... 7d
kube-system kube-scheduler <none> 7d
kube-system tiller-deploy 10.240.3.25:44134 5d
【问题讨论】:
标签: docker nginx kubernetes high-availability