需要一个kubernetes集群,集群各节点中提前准备好consul镜像【版本:1.6.0】
创建k8s-consul-service.yaml服务,注意我们使用的是statefulset类型,所以service中clusterip选择为none【headless service】,这样statefulset中所有pod都可以通过dns映射相互找到
statefulset是为了解决有状态服务的问题(对应deployments和replicasets是为无状态服务而设计),其应用场景包括 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于pvc来实现 稳定的网络标志,即pod重新调度后其podname和hostname不变,基于headless service(即没有cluster ip的service)来实现 有序部署,有序扩展,即pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到n-1,在下一个pod运行之前所有之前的pod必须都是running和ready状态),基于init containers来实现 有序收缩,有序删除(即从n-1到0) 从上面的应用场景可以发现,statefulset由以下几个部分组成: 用于定义网络标志(dns domain)的headless service 用于创建persistentvolumes的volumeclaimtemplates 定义具体应用的statefulset statefulset中每个pod的dns格式为<code>statefulsetname-{0..n-1}.servicename.namespace.svc.cluster.local</code>,其中 <code>servicename</code>为headless service的名字 <code>0..n-1</code>为pod所在的序号,从0开始到n-1 <code>statefulsetname</code>为statefulset的名字 <code>namespace</code>为服务所在的namespace,headless servic和statefulset必须在相同的namespace <code>.cluster.local</code>为cluster domain
创建k8s-consul-statefulset.yaml
注意其中-retry-join=consul-0.consul.$(namespace).svc.cluster.local就是基于statefulset特性
*************测试一下******************: 第一步:使用命令代创建主机端口映射
第二步:注意这个8500地址只能本机访问,使用curl命令继续测试
不用担心,以上结果是正确的,因为通过浏览器访问的话,127.0.0.1:8500会自动跳转到<code>http://127.0.0.1:8500/ui/dc1/services</code>默认ui展示界面,由于curl无法模拟浏览器交互跳转行为,因此显示以上内容永久重定向.
创建nginx-ingress代理,供外部访问,创建k8s-consul-nginx-ingress.yaml
注意其中的域名consul.deri.com,访问的机器hosts中需要加入ip 域名 之后才能访问!
遇到的问题
问题一: [warn] memberlist: failed to resolve consul-2.consul.default.svc.cluster.local: lookup consul-2.consul.default.svc.cluster.local on 10.96.0.10:53: no such host 这是dns解析出现问题,排除coredns状态,通过nslookup命令测试,发现并无问题。 解决办法: 使用命令kubectl delete pod consul-0 consul-1 consul-2删除创建statefulset时自动创建的pod,让k8s自动再创建新的consul-0 consul-1 consul-2 pod,发现问题不见了,猜测原因可能是部署k8s的宿主机性能太差,dns服务处理太慢导致。