我想做什么:
我使用Kubernetes网站上提供的文档设置了kubernete集群(http_kubernetes.io/v1.1/docs/getting-started-guides/aws.html)。使用kube-up.sh,我能够将kubernete群集带上1个主人和3个爪子(如下图中的蓝色矩形所示)。据我所知,从文档中我们可以根据需要添加minions,所以从我的观点来看,k8s master实例在高可用性方面是单点故障。
所以我试图用三个主节点设置HA k8s主层,如图所示。为了实现这一点,我遵循kubernetes高可用性集群指南,http_kubernetes.io/v1.1/docs/admin/high-availability.html#establishing-a-redundant-reliable-data-storage-layer 我做了什么:
使用kube-up.sh和provider aws(master1和minion1,minion2和minion3)设置k8s集群 设置两个新的主实例(master2和master3) 然后我开始通过以下提到的链接在master1,master 2和master 3上配置etcd cluster: http_kubernetes.io/v1.1/docs/admin/high-availability.html#establishing-a-redundant-reliable-data-storage-layer 所以简而言之,我已经从kubernetes网站(http_kubernetes.io/v1.1/docs/admin/high-availability/etcd.yaml)复制了etcd.yaml,并在所有三个节点上更新了Node_IP,Node_Name和Discovery Token,如下所示。
NODE_NAME NODE_IP DISCOVERY_TOKEN
Master1 172.20.3.150 https_discovery.etcd.io/5d84f4e97f6e47b07bf81be243805bed
Master2 172.20.3.200 https_discovery.etcd.io/5d84f4e97f6e47b07bf81be243805bed
为主设备 172.20.3.250 https_discovery.etcd.io/5d84f4e97f6e47b07bf81be243805bed
在所有三个节点上运行etcdctl成员列表时,我得到了:
$ docker exec <container-id> etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http_localhost:2380,http_localhost:7001 clientURLs=http_127.0.0.1:4001
根据我们需要在/ etc / kubernete / manifest中保存etcd.yaml的文档,此目录已包含etcd.manifest和etcd-event.manifest文件。为了测试我用etcd参数修改了etcd.manifest文件。
进行上述更改后,我强行终止了docker容器,几秒钟后容器就存在了,并且在运行kubectl get节点时遇到了下面提到的错误: 错误:无法从服务器读取版本:获取httplocalhost:8080 / api:拨打tcp 127.0.0.1:8080:连接被拒绝
所以请建议如何在AWS上设置k8s master高可用性设置。
答案 0 :(得分:1)
要配置HA主服务器,您应该遵循High Availability Kubernetes Cluster文档,特别是确保跨越故障域的复制存储以及复制的apiservers前面的负载均衡器。
答案 1 :(得分:1)
为kubernetes设置HA控制器并非易事,我不能在此提供所有细节,但我将概述对我来说成功的原因。
$ kube-aws up --export
生成云形式堆栈文件。将您的云配置插入CloudFormation堆栈配置。首先压缩并编码您的云配置:
$ gzip -k cloud-config-controller-0
$ cat cloud-config-controller-0.gz | base64 > cloud-config-controller-0.enc
现在将内容复制到您的编码cloud-config到CloudFormation配置中。查找适当InstanceController的UserData键。 (我为其他控制器添加了额外的InstanceController对象。)
使用新创建的CloudFormation配置在AWS CloudFormation Management Console上更新堆栈。
您还需要生成TLS分配:https://coreos.com/kubernetes/docs/latest/openssl.html。这些资产必须进行压缩和编码(与上面相同的gzip和base64),然后插入到用户数据云配置中。
在服务器上调试时,journalctl是你的朋友:
$ journalctl -u oem-cloudinit # to debug problems with your cloud-config
$ journalctl -u etcd2
$ journalctl -u kubelet
希望有所帮助。
答案 2 :(得分:1)
还有kops项目
从项目自述文件:
以Kubernetes方式运营HA Kubernetes
也:
我们希望将其视为群集的
kubectl
下载the latest release,例如:
cd ~/opt
wget https://github.com/kubernetes/kops/releases/download/v1.4.1/kops-linux-amd64
mv kops-linux-amd64 kops
chmod +x kops
ln -s ~/opt/kops ~/bin/kops
请参阅kops usage,尤其是:
假设您已经有s3://my-kops
个存储区和kops.example.com
托管区域。
创建配置:
kops create cluster --state=s3://my-kops --cloud=aws \
--name=kops.example.com \
--dns-zone=kops.example.com \
--ssh-public-key=~/.ssh/my_rsa.pub \
--master-size=t2.medium \
--master-zones=eu-west-1a,eu-west-1b,eu-west-1c \
--network-cidr=10.0.0.0/22 \
--node-count=3 \
--node-size=t2.micro \
--zones=eu-west-1a,eu-west-1b,eu-west-1c
编辑配置:
kops edit cluster --state=s3://my-kops
导出terraform脚本:
kops update cluster --state=s3://my-kops --name=kops.example.com --target=terraform
直接应用更改:
kops update cluster --state=s3://my-kops --name=kops.example.com --yes
列表群集:
kops get cluster --state s3://my-kops
删除群集:
kops delete cluster --state s3://my-kops --name=kops.identityservice.co.uk --yes