Azure上的外部可见Kubernetes服务

我正在Azure上的Kubernetes(v1.4.5)群集上部署ELK堆栈。 这是创buildKibana ServiceDeployment

 # deployment.yml --- apiVersion: v1 kind: Namespace metadata: name: logging --- # elasticsearch deployment and Service --- # logstash Deployment and Service --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: kibana namespace: logging spec: replicas: 1 template: metadata: labels: component: kibana spec: containers: - name: kibana image: sebp/elk:521 env: - name: "LOGSTASH_START" value: "0" - name: "ELASTICSEARCH_START" value: "0" ports: - containerPort: 5601 name: ui protocol: TCP volumeMounts: - name: config-volume mountPath: '/opt/kibana/config/' volumes: - name: config-volume configMap: name: kibana-config --- apiVersion: v1 kind: Service metadata: name: kibana namespace: logging labels: component: kibana spec: type: LoadBalancer ports: - port: 5601 protocol: TCP targetPort: ui nodePort: 30257 selector: component: kibana 

我通过kubectl apply -f deployment.yml 。 我通过kubectl delete namespace logging清除了整个ELK堆栈。
Azure上有一个负载平衡器,后端池是k8s代理。 当我部署时,公共IP和规则被添加到负载平衡器。 而且我可以通过使用负载平衡器地址的前端池中的IP地址访问我的浏览器中的kibana。

这里的问题1),并希望我想实现2):

  1. 每次使用kubect apply ,都会在负载平衡器的前端池中添加一个新的 IP地址和规则。 奇怪的是,以前的IP地址和规则仍然存在(即使我在部署之前运行kubectl delete namespace logging ,这意味着以前使用的IP地址和规则应该被释放。我在这里检查代码,并尽可能看到有确保没有陈旧的公共IP地址和负载平衡规则的function)。 从以前的部署中添加的IP地址无法访问当前部署的Kibana服务。
  2. 我想有一个DNS名称,ELK栈的客户端(例如我的浏览器< – > kibana,日志发送服务器< – > logstash)可以用来引用ELK服务,而不需要在客户端中对IP地址进行硬编码ELK栈的重新部署对客户来说是透明的)。

我到目前为止所尝试的:我通过Azure的仪表板手动创build了一个带有DNS名称的公有IP地址。 我将负载均衡规则添加到负载平衡器,看起来像在kubectl apply上自动创build的kubectl apply 。 我尝试在externalIPs下的kibana服务规范中使用这个手动创build的公共IP,然后在loadBalancerIP ( k8s文档 )下使用。
当externalIP被设置为公共IP时, kubectl describe service --namespace=logging返回

 Name: kibana Namespace: logging Labels: component=kibana Selector: component=kibana Type: LoadBalancer IP: 10.x.xxx.xx External IPs: 52.xxx.xxx.xxx <- this is the IP I manually created LoadBalancer Ingress: 52.xxx.xxx.xxx Port: <unset> 5601/TCP NodePort: <unset> 30257/TCP Endpoints: 10.xxx.x.xxx:5601 Session Affinity: None Events: FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 15m 15m 1 {service-controller } Normal CreatingLoadBalancer Creating load balancer 14m 14m 1 {service-controller } Normal CreatedLoadBalancer Created load balancer 

但是,请求的DNS名称或直接到外部IP超时。 当我在服务规范中设置loadBalancerIP时, kubectl describe service返回类似的输出,但没有外部IP行,并且在负载均衡器上又创build一个新的公共IP地址+规则。 再次使用我手动创build的公网IP的DNS名称/ IP是不可能的。

任何帮助将超级赞赏:)

啊。 最简单的做法是避免在每次部署之前删除服务。 根据我的经验,服务往往是非常长寿的, 他们提供了一个很好的,固定的方式来引用的东西,而不必担心港口,ips,dns等的dynamic值。

在Kibana服务规范中,从端口configuration中删除nodePort条目,以便服务可以做它自己的事情; 还有一件事要考虑。 不要为loadBalancerIP或externalIPs设置值。 同样的规则适用于其他服务。

对于ELK堆栈configuration文件(我不记得他们看起来像什么),请参考其他组件的服务名称:不需要使用硬编码IP或任何东西。 (不知道你是否这样做,但以防万一)

允许创build服务; 获取loadbalancer外部IP并将其插入到您的DNSconfiguration中。

您可以继续使用名称空间(如果您喜欢这样做),但不要删除整个名称空间来清除ELK组件的部署。

将您的ELK堆栈规格分成部署和服务的单独文件(技术上,我不知道这是否是必需的;您可能可以逃脱),以便您可以使用:

 kubectl delete -f logging-deployments.yaml kubectl apply -f logging-deployments.yaml 

或类似的命令来更新部署,而不会打扰服务。

如果你需要(或者更喜欢)以另一种方式删除ELK栈,然后创build一个新的,你也可以使用:

 kubectl -n logging delete deployments --all 

删除日志logging名称空间内的所有部署。 对我来说,这个选项似乎比它需要的更危险一些。

第二个select是:

 kubectl delete deployments kibana kubectl delete deployments elasticsearch kubectl delete deployments logstash 

如果你不介意额外的打字

另一个select是添加一个新的标签,如:

 role: application 

要么

 stack: ELK 

到每个部署规范。 比你可以使用:

 kubectl delete deployments -l stack=ELK 

限制删除的范围……但这又似乎是危险的。


除非有一些压倒一切的理由,否则我的意愿是将configuration分割成> 2个文件并使用:

 kubectl create -f svc-logging.yaml kubectl create -f deploy-logging.yaml kubectl delete -f deploy-logging.yaml kubectl apply -f deploy-logging.yaml ... etc 

以帮助防止任何令人讨厌的错字导致的事故。

我进一步分解了一些东西,每个组件包含一个单独的文件夹,包含一个部署和服务,嵌套在一起是非常有意义的(更容易保存在一个回购中,如果不止一个人需要更改相关但是单独的组件),而且通常用bash创build/销毁脚本来提供类似文档的东西……但是你明白了。

通过这种方式设置,您应该能够更新任何或所有部署组件,而不会中断DNS /负载平衡configuration。

(当然,这一切都假设一个文件中的所有内容都不是某种硬性要求…在这种情况下,我没有一个很好的答案给你,从我的头顶…)