Kubernetes 生产环境最佳实践

官方链接

配置注意事项

  • 当定义一个配置时,指定最新稳定版本的API
  • 在推送到集群之前,配置文件必须使用版本控制的方式进行管理,这样可以在需要的时候快速回滚配置,也有助于集群的重新创建和恢复。
  • 使用YAML而不是JSON编写配置文件。 虽然这些格式几乎可以在所有场景中互换使用,但YAML往往更加用户友好。
  • 只要有意义,就将相关对象分组到一个文件中。 一个文件通常比几个文件更容易管理。 请参阅guestbook-all-in-one.yaml文件作为此语法的示例。
  • 注意,可以使用指定目录的方式来调用kubectl命令,如使用kubectl create -f DIR_NAME
  • 不要不必要地指定默认值:简单的最小配置会降低错误的可能性
  • 将对象描述放在注释中,以便更好地进行省察。

裸Pod vs ReplicaSets,Deployments,和Jobs

  • 如果可以避免,请不要使用裸Pod(即,Pod未绑定到ReplicaSet或Deployment)。 如果节点发生故障,裸Pod将不会重新调度。

    deployment不仅可以创建ReplicaSet来确保期望Pod可用状态的数量,同时还能指定Pod替换的策略(如RollingUpdate),这些属性都是优于直接创建裸Pod,除了一些特殊的场景如 restartPolicy: Never。Job也可能适用。

Services

在创建Deployment或RS之前创建与之相关的Service,并且需要在所有的Deployment被访问之前创建,当kubernetes启动一个容器,被启动的容器会提供指向所有服务的环境参数。例如,如果一个Service命名为foo退出了,所有的容器将会在他们初始化环境的时候获取到如下参数:

 FOO_SERVICE_HOST=<the host the Service is running on>
 FOO_SERVICE_PORT=<the port the Service is running on>

如果您正在编写与服务对话的代码,请不要使用这些环境变量; 请改用服务的DNS名称。 服务环境变量仅适用于无法修改以使用DNS查找的旧软件,并且是一种不太灵活的访问服务的方式。

  • 除非绝对必要,否则不要为Pod指定hostPort。 将Pod绑定到hostPort时,它会限制Pod可以调度的节点位置数,因为每个<hostIP,hostPort,protocol>组合必须是唯一的。 如果未明确指定hostIP和协议,Kubernetes将使用0.0.0.0作为默认hostIP,并使用TCP作为默认协议。

如果只是希望通过访问端口用于调试目的,可以使用apiserver proxy或者kubectl port-forward

如果确实需要映射出Pod的端口到主机节点上,优先考虑使用NodePort而不是hostPort.

  • 避免使用hostNetwork,这与使用hostPort原因相同。
  • 当不需要使用kube-proxy作为负载均衡的时候,使用Headless service(设置一个空的ClusterIP)可以更利于服务发现。

使用标签Lables

定义和使用标识应用程序或部署的语义属性的标签,例如可以使用类似的标签:{app:myapp,tier:frontend,phase:test,deployment:v3}。 可以使用这些标签为其他资源选择合适的Pod; 例如,选择 tier: frontend 的Pod的服务等。

通过标签选择器(Label Selector)选择特定的Deployment发行版本,可以使服务跨越多个Deployment。使用Deployment可以轻松更新正在运行的服务,而无需停机。

Deployment描述了对象所期望的状态,并且如果更新对应的参数,则部署控制器以受控速率(滚动更新)将实际状态改变为期望状态。

  • 您可以通过操纵标签进行调试。 由于Kubernetes控制器(例如ReplicaSet)和服务使用选择器标签与Pod匹配,因此从Pod中删除相关标签将阻止其被控制器考虑或由服务提供服务流量。 如果删除现有Pod的标签,其控制器将创建一个新的Pod来取代它。 这是在“隔离”环境中调试先前“live”Pod的有用方法。 要以交互方式删除或添加标签,请使用kubectl label命令。

容器镜像

容器的拉取镜像参数(imagePullPolicy)决定了kubelet的拉取镜像操作:

  • imagePullPolicy: IfNotPresent: 当前本地没有此镜像的时候,才拉取镜像
  • imagePullPolicy: Always: 在Pod每次启动时都会拉取镜像
  • imagePullPolicy参数省略,或者使用tag为 lastest,或者省略tag,那么默认为imagePullPolicy: Always
  • imagePullPolicy参数省略,并且使用tag不为lastest,那么默认为imagePullPolicy: IfNotPresent
  • imagePullPolicy: Never:将被认为镜像存在本地,不会尝试拉取镜像。

在生产中部署容器时应避免使用latest标记,因为使用lastest难以跟踪正在运行的镜像版本,并且更难以正确回滚。

镜像的分层缓存机制使得使用imagePullPolicy: Always 参数变得高效,如,在使用docker的环境中,如果镜像已经存在,拉取镜像的尝试将会非常快,因为所有的镜像层都已经缓存在本地,而不需要去下载镜像。

使用kubectl命令

  • 使用kubectl apply -f &lt;directory&gt;kubectl create -f &lt;directory&gt;,将会执行目录中的所有 .yaml , .yml和 .json文件.

  • 使用标签选择器进行 get 和delete 操作代替指定对象名,可参考标签选择器如何高效使用标签

  • 使用kubectl runkubectl expose 可以快速创建单容器 Deployment和服务,参考集群中使用Service访问应用

猜你喜欢

转载自blog.51cto.com/tryingstuff/2331328