k8s学习4 - 运维指南

一, kubernetes 运维指南

1. kubernetes 集群管理指南

1.1 Node 的管理

1.1.1 Node的隔离与恢复

# 创建 unschedulable.yaml
cat > unschedulable.yaml <<EOF
apiVersion: v1
kind: Node
metadata:
  name: k8s-node-1
  labels:
    kubernetes.io/hostname: k8s-node-1
spec:
  unschedulable: true
EOF

# 然后
kubectl replace -f unschedulable.yaml
kubectl get nodes

# 或者直接 kubectl patch
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# 或者
kubectl cordon k8s-node-1
# 去掉隔离
kubectl uncordon k8s-node-1

注意, 将某个 Node 脱离调度范围时, 在其上运行的 pod 并不会停止

要想将node重新纳入集群调度范围, 只需要将 unschedulable 设置为false即可.

1.1.2 Node 的扩容

在新节点安装 Docker, kubelet, kube-proxy 服务, 然后配置 kubelet和kube-proxy的启动参数, 将 master url 指定为 kubernetes集群的master地址,最后启动这些服务. 通过kubelet默认的自动注册机制,新的Node将会自动加入现有的kubernetes集群.

1.2 更新资源对象的Label

# 增加标签
kubectl label pod somePod role=backend
# 去掉标签
kubectl label pod somePod role-
# 更新标签
kubectl label pod somePod role=frontend --overwrite

1.3 Namespace: 集群环境共享与隔离

kubernetes通过Namespace和Context的设置来对不同的工作组进行区分,使得他们既可以共享同一个kubernetes集群的服务,也能够互不干扰.

# 创建 namespace-development.yaml
cat > namespace-development.yaml <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: development
EOF

# 然后
kubectl create -f namespace-development.yaml
kubectl get ns

# 定义Context
kubectl config set-cluster kubernetes-cluster --server=https://192.168.1.128:8080
kubectl config set-context ctx-dev --namespace=development --cluster=kubernetes-cluster --user=dev
kubectl config view

# 设置工作组在特定context环境中工作
kubectl config use-context <context_name>

注意, 通过 kubectl config 命令在 ${HOME}/.kube 目录下生成一个名为 config 的文件, 文件内容就是 kubectl config view 命令查看到的内容. 所以也可以手工编辑该文件的内容来设置 Context

1.4 kubernetes 资源管理

计算资源管理(Compute Resources)

  • spec.container[].resources.requests.cpu

  • spec.container[].resources.limits.cpu

  • spec.container[].resources.requests.memory

  • spec.container[].resources.limits.memory

资源的配置范围管理(LimitRange)

资源的服务质量管理(Resource QoS)

1.5 资源紧缺时的 Pod 驱逐机制

1.6 Pod Disruption Budget(主动驱逐保护)

1.7 kubernetes集群的高可用部署方案

1.8 kubernetes 集群监控

1.8.1 通过cAdvisor页面查看容器的运行状态

在kubernetes系统中, cAdvisor 已被默认集成到了kubelet组件内,当kubelet服务启动时, 它会自动启动cAdvisor服务,然后cAdvisor会实时采集所在节点的性能指标及在节点上运行的容器的性能指标. kubelet的启动参数 --cadvisor-port 可自定义对外提供服务的端口号,默认为4194.

1.8.2 Heapster+Influxdb+Grafana 集群性能监控平台搭建

cAdvisor只能监控自己所在的主机.

在大规模容器集群中, 需要对所有Node和全部容器进行性能监控, kubernetes建议使用一套工具来实现集群性能数据的采集,存储和展示: Heapster,InfluxDB和Grafana.

1.9 集群统一日志管理

容器中输出到控制台的日志, 都会以 *-json.log 的命名方式保存在 /var/lib/docker/containers/ 目录下, 这样就给了我们进行日志采集和后续处理的基础.

kubernetes 推荐采用 Fluentd + ElasticSearch + Kibina 完成对系统和容器日志的采集,查询和展现工作.

1.10 kubernetes 审计日志(Audit log)

记录包括 "什么时候? 谁? 进行了什么操作?" , "由哪个模块产生?" "发生了什么事件?" "在哪里观察到?" "将引起什么结果?" 等内容, 便于系统管理员对集群中的各种事件进行追溯.

目前审计日志存在于 kube-apiserver 中,记录了所有发往apiserver的请求.

每个审计日志包括请求和应答两条记录.

审计日志的相关配置参数都在kube-apiserver的启动参数中:

  • --audit-log-maxage : 审计日志文件保留的最长天数
  • --audit-log-maxbackup : 审计日志文件的个数
  • --audit-log-maxsize : 审计日志文件的单个大小限制,单位为MB,默认为100MB
  • --audit-log-path : 审计日志文件的全路径.

1.11 使用WEB UI( dashboard ) 管理集群

为了在页面上显示系统资源的使用情况, 需要部署 Heapster.

部署 kubernetes-dashboard 的 yaml 配置文件可通过 https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml 页面下载

配置文件 kubernetes-dashboard.yaml 的内容包括 deployment和service的定义.

1.12 Helm: kubernetes应用包管理工具

简单的应用在kubernetes上已经能够便捷部署.

但对于复杂的应用中间件,在kubernetes上进行容器化部署并非易事, 通常需要先研究Docker镜像的运行需求,环境变量等内容, 并能为这些容器定制存储,网络等设置, 最后设计和编写deployment,configMap,Service以及Ingress等相关的yaml文件, 再提交给kubernetes进行部署.

这些复杂的过程将逐步被Helm应用包管理工具实现.

Helm是一个由CNCF孵化和管理的项目, 用于对需要在kubernetes上部署的复杂应用进行定义,安装和更新.

Helm以Chart的方式对应用软件进行描述,可以方便地创建,版本化,共享和发布复杂的应用软件.

Helm中的主要概念:

  • Chart: 一个Helm包,其中包含了运行一个应用所需要的工具和资源定义, 还可能包含kubernetes集群中的服务定义,类似于 homebrew 中的 formula, APT中的dpkg, yum中的RPM文件
  • Release: 在kubernetes集群上运行的一个Chart实例. 在同一个集群上, 一个Chart可以被安装多次, 例如有一个Mysql Chart,如果想在服务器上运行两个MySQL 数据库,就可以基于这个Chart安装两次 . 每次安装都会生成一个新的 Release,会有独立的Release名称.
  • Repository: 用于存放和共享 Chart 的仓库

2. Trouble Shooting

2.1 查看系统的Event事件

使用 kubectl describe 命令查看各种资源对象, 都会显示其关联的事件.

2.2 查看容器日志

使用 kubectl logs <pod_name>kubectl logs <pod_name> -c <container_name> 查看容器日志 , 这和在宿主机上运行 docker logs <container_id> 的效果是一样的

2.3 查看kubernetes服务日志

2.4 常见问题

由于无法下载pause镜像导致Pod一直处于Pending状态

解决办法:

  • 可以给docker Daemon 加上 --insecure-registry gcr.io 匿名下载镜像
  • 如果无法访问 gcr.io 网站,可以将镜像导入到 Docker私服中 , 然后配置kubelet的启动参数 --pod_infra_container_image=<docker_registry_ip>:<port>/google_containers/pause-amd64:3.1

pod创建成果,但状态始终不是Ready,且RESTARTS数量持续增加

应为 容器的启动命令不能保持在前台运行, 或许是命令执行出错, 此时可以看日志

3. kubernetes开发中的新功能

3.1 Pod Preset(运行时参数注入策略)

为了使Pod的定义和运行时参数更加解耦, kubernetes从 v1.6版本开始引入了新的资源对象 PodPreset, 来定义那些Pod启动时所需要的必要信息, 在Pod启动时进行注入, 从而使得 Pod 在定义时尽量减少这些参数的上设置.

支持的注入参数类型包括 环境变量, secret, volume 和 volume mount.

3.2 Cluster Federation (集群联邦)

3.3 容器运行时接口(Container Runtime Interface-CRI)

3.4 对GPU的支持

猜你喜欢

转载自blog.csdn.net/weixin_34361881/article/details/87213290