Kubernetes 生产环境最佳实践

官方连接git

配置注意事项

  • 当定义一个配置时,指定最新稳定版本的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也可能适用。github

Services

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

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

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

  • 除非绝对必要,不然不要为Pod指定hostPort。 将Pod绑定到hostPort时,它会限制Pod能够调度的节点位置数,由于每一个<hostIP,hostPort,protocol>组合必须是惟一的。 若是未明确指定hostIP和协议,Kubernetes将使用0.0.0.0做为默认hostIP,并使用TCP做为默认协议。

若是只是但愿经过访问端口用于调试目的,可使用apiserver proxy或者kubectl port-forwardapi

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

  • 避免使用hostNetwork,这与使用hostPort缘由相同。
  • 当不须要使用kube-proxy做为负载均衡的时候,使用Headless service(设置一个空的ClusterIP)能够更利于服务发现。

使用标签Lables

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

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

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

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

容器镜像

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

  • 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访问应用
相关文章
相关标签/搜索