Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3673  7  0

Kubernetes Cookbook 编程指南 中文版教程

监视Master和Node

在前面的学习过程中,您学习了如何构建自己的集群,运行各种资源,享受不同的使用场景,甚至增强集群管理。 现在为您的Kubernetes集群提供了一个全新的视图。 在本文中,我们将讨论监控。 通过监控工具,用户不仅可以了解工作者和节点的资源消耗情况,还可以了解容器。 这将有助于我们在资源利用方面有更好的效率。

准备

在我们在Kubernetes系统中设置监控集群之前,有两个主要先决条件:

  • 一种是更新二进制文件的最新版本,这可确保您的群集具有稳定且功能强大的功能

  • 另一个是设置DNS服务器

Kubernetes DNS服务器可以减少安装类集群(cluster-like)的pod的一些步骤和依赖性。 在这里,使用DNS服务器在Kubernetes中部署监控系统更容易。

在Kubernetes中,DNS服务器如何在大型系统部署中提供帮助?

DNS服务器可以支持为每个容器解析Kubernetes服务的名称。 因此,在运行pod时,我们不必设置特定的服务IP来连接到其他pod。 pod中的容器只需要知道服务名称。

节点kubelet的守护进程通过修改文件/etc/resolv.conf将容器分配给DNS服务器。 安装DNS服务器后,尝试检查文件或使用命令nslookup进行验证:

# kubectl exec <POD_NAME> [-c <CONTAINER_NAME>] -- cat
/etc/resolv.conf
// Check where the service "kubernetes" served
# kubectl exec <POD_NAME> [-c <CONTAINER_NAME>] --
nslookup kubernetes

 

将Kubernetes版本更新到1.2.1

更新正在运行的Kubernetes系统的版本并不麻烦。 您只需按照以下步骤操作即可。 主节点和节点的过程类似:

  • 由于我们要升级每个Kubernetes的二进制文件,因此请在升级之前停止所有Kubernetes服务。 例如,service <KUBERNETES DAEMON> stop

  • 下载最新版本的tar包文件,版本为1.2.1:

# cd /tmp && wget https://storage.googleapis.com/kubernetesrelease/release/v1.2.1/kubernetes.tar.gz
  • 将文件解压缩到持久化的目录中。 我们将使用官方源文件中提供的附加模板。 这些模板可以帮助创建DNS服务器和监控系统:

// Open the tarball under /opt
# tar -xvf /tmp/kubernetes.tar.gz -C /opt/
// Go further decompression for binary files
# cd /opt && tar -xvf /opt/kubernetes/server/kubernetes-serverlinux-amd64.tar.gz
  • 复制新文件并覆盖旧文件:

# cd /opt/kubernetes/server/bin/
// For master, you should copy following files and confirm to
overwrite
# cp kubectl hypercube kube-apiserver kube-controller-manager
kube-scheduler kube-proxy /usr/local/bin
// For nodes, copy the below files
# cp kubelet kube-proxy /usr/local/bin
  • 最后,你可以启动系统服务。最好通过命令行验证版本:
# kubectl version
Client Version: version.Info{Major:"1", Minor:"2",
GitVersion:"v1.2.1", GitCommit:"50809107cd47a1f62da362bccefdd9e
6f7076145", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"2",
GitVersion:"v1.2.1", GitCommit:"50809107cd47a1f62da362bccefdd9e
6f7076145", GitTreeState:"clean"}

提醒一下,您应该同时更新Master和Node。

设置DNS服务器

如上所述,我们将使用官方模板在我们的Kubernetes系统中构建DNS服务器。 只有两个步骤。 首先,修改模板并创建资源。 然后,我们需要使用DNS信息重新启动kubelet守护进程。

使用模板启动服务

Kubernetes的附加组件位于<KUBERNETES_HOME>/cluster/addons/。根据最后一步,我们可以在/opt/kubernetes/cluster/addons/dns中访问DNS的附加组件。 两个模板文件将被修改和执行。 请随意依赖于以下步骤:

  • 将.yaml.in后缀的文件改为YAML文件,我们稍后将编辑这个文件:

# cp skydns-rc.yaml.in skydns-rc.yaml
Input variable Substitute value Example
{{ pillar['dns_ domain'] }} The domain of this cluster k8s.local
{{ pillar['dns_ replicas'] }} The number of replica for this replication controller 1
{{ pillar['dns_ server'] }} The private IP of DNS server. Must also be in the CIDR of cluster 192.168.0.2
# cp skydns-svc.yaml.in skydns-svc.yaml
  • 在这两个模板中,替换pillar变量,这个变量由两个大括号括起来的,项在这张表中。正如你所知道的,黙认的服务kubernetes将占用CIDR中第一个IP。这就是为什么我们在DNS服务器中使用192.168.0.2这个IP。
# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 192.168.0.1 <none> 443/TCP 4d
  • 在副本控制器的模板中,名为skydns-rc.yaml的文件在kube2sky容器中指定了master的URL:
# cat skydns-rc.yaml
(Ignore above lines)
:
- name: kube2sky
image: gcr.io/google_containers/kube2sky:1.14
resources:
    limits:
        cpu: 100m
        memory: 200Mi
    requests:
        cpu: 100m
        memory: 50Mi
livenessProbe:
    httpGet:
        path: /healthz
        port: 8080
        scheme: HTTP
    initialDelaySeconds: 60
    timeoutSeconds: 5
    successThreshold: 1
    failureThreshold: 5
readinessProbe:
    httpGet:
        path: /readiness
        port: 8081
        scheme: HTTP
    initialDelaySeconds: 30
    timeoutSeconds: 5
args:
# command = "/kube2sky"
- --domain=k8s.local
- --kube-master-url=<MASTER_ENDPOINT_URL>:<EXPOSED_PORT>
:
(Ignore below lines)

完成上述修改步骤后,您可以使用子命令create启动它们:

# kubectl create -f skydns-svc.yaml
service "kube-dns" created
# kubectl create -f skydns-rc.yaml
replicationcontroller "kube-dns-v11" created

在kubelet中启用Kubernetes DNS

接下来,我们可以访问每个节点并将DNS信息添加到kubelet守护进程中。 我们用于集群DNS的标签是--cluster-dns,用于分配DNS服务器的IP,以及--cluster-domain,用于定义Kubernetes服务的域:

// For init service daemon
# cat /etc/init.d/kubernetes-node
(Ignore above lines)
:
# Start daemon.
echo $"Starting kubelet: "
    daemon $kubelet_prog \
        --api_servers=<MASTER_ENDPOINT_URL>:<EXPOSED_PORT> \
        --v=2 \
        --cluster-dns=192.168.0.2 \
        --cluster-domain=k8s.local \
        --address=0.0.0.0 \
        --enable_server \
        --hostname_override=${hostname} \
        > ${logfile}-kubelet.log 2>&1 &
:
(Ignore below lines)
// Or, for systemd service
# cat /etc/kubernetes/kubelet
(Ignore above lines)
:
# Add your own!
KUBELET_ARGS="--cluster-dns=192.168.0.2 --cluster-domain=k8s.local"

现在,最好重启kubernetes-node服务或只重户kubelet! 您可以使用DNS服务器享受群集。

如何去做...

本节,我们将安装了一个监视系统并介绍了它的仪表板。这个监视系统是基于Heapster(https://github.com/kubernetes/heapster )的,这是一个资源使用收集与分析工具。Heapster与kubelet之间的通信可以获取机器与容器的资源使用情况。与Heapster一起,我们还有一个用于存储的influxDB(http://grafana.org )和用于前端面板的Grafana(https://influxdata.com ),这个工具可以在与用户友好的几个图表中显示资源的状态。

安装一个监视集群

如果您已经阅读了有关准备DNS服务器的上一节,则必须非常熟悉使用官方附加模板来部署系统。

  1. 让我们检查<KUBERNETES_HOME>/cluster/addons下的cluster-monitoring目录。对于部署监视集群有一些不同的环境。我们选择本节的infulxdb来演示:

# cd /opt/kubernetes/cluster/addons/cluster-monitoring/influxdb &&
ls
grafana-service.yaml heapster-service.yaml
influxdb-service.yaml
heapster-controller.yaml influxdb-grafana-controller.yaml

在这个目录下,你可以看到服务的三个模板和两个服务控制器

  1. 我们将服务模板中的大部分内容保持为原始值。因为这些模板定义了网络配置,最好使用黙认的设置,但要公开Grafana服务:

# cat heapster-service.yaml
apiVersion: v1
kind: Service
metadata:
    name: monitoring-grafana
    namespace: kube-system
    labels:
        kubernetes.io/cluster-service: "true"
        kubernetes.io/name: "Grafana"
spec:
    type: NodePort
    ports:
    - port: 80
        nodePort: 30000
        targetPort: 3000
selector:
	k8s-app: influxGrafana

正如你看到的,我们使用30000端口公开Grafana服务。这个修改将允许我们访问通过浏览器监视的仪表板。

  1. 另一方面,Heapster的副本控制器和influxDB和Grafana中的副本控制器需要更多的额外编辑才能满足我们的Kubernetes系统:

# cat influxdb-grafana-controller.yaml
(Ignored above lines)
:
- image: gcr.io/google_containers/heapster_grafana:v2.6.0-2
    name: grafana
    env:
    resources:
    	# keep request = limit to keep this container in
guaranteed class
    limits:
        cpu: 100m
        memory: 100Mi
    requests:
        cpu: 100m
        memory: 100Mi
    env:
    	# This variable is required to setup templates in
Grafana.
	- name: INFLUXDB_SERVICE_URL
    	value: http://monitoring-influxdb.kube-system:8086
    - name: GF_AUTH_BASIC_ENABLED
    	value: "false"
    - name: GF_AUTH_ANONYMOUS_ENABLED
    	value: "true"
    - name: GF_AUTH_ANONYMOUS_ORG_ROLE
    	value: Admin
    - name: GF_SERVER_ROOT_URL
    value: /
:
(Ignored below lines)

对于Grafana的容器,请更改一些环境变量。 第一个是influxDB服务的URL。 由于我们设置了DNS服务器,因此我们不必指定特定的IP地址。 但是应该添加一个额外的后缀域。 这是因为服务是在名称空间kube-system中创建的。 如果不添加此后缀域,DNS服务器无法解析默认命名空间中的monitoring-influxdb。 此外,Grafana根URL应更改为单个斜杠。 根(/)使Grafana在当前系统中传输正确的网页,而不是默认URL。

  1. 在Heapster模板中,我们在Pod中运行两个Heapster容器。这两个容器使用相同的镜像和相似的设置,但是实际上,它们采用不同的角色。我们仅仅看下其中一个作为一个修改的示例:

# cat heapster-controller.yaml
(Ignore above lines)
:
    containers:
        - image: gcr.io/google_containers/heapster:v1.0.2
          name: heapster
          resources:
            limits:
              cpu: 100m
              memory: 200Mi
            requests:
              cpu: 100m
              memory: 200Mi
            command:
              - /heapster
              - --source=kubernetes:<MASTER_ENDPOINT_URL>:<EXPOSED_PORT>?inClusterConfig=false
              - --sink=influxdb:http://monitoring-influxdb.kubesystem:8086
              - --metric_resolution=60s
:
(Ignore below lines)

开始,删除所有双大括号的行。这些行将会导致镜误,因为它们在YAML格式中不能被解析或被考虑。还有, 有两个变量需要被替换成可能的值。将{{metrics_memory}}和{{eventer_memory}}的值改为200Mi。这个值200MiB能保证容器可以有的内存数量。请更改Kubernetes source的用法。我们指定了完整的URL和端口,并为重新构建认证禁用ClusterConfig。记住heapster和eventer这两个容器都要调整。

  1. 现在,你可以使用简单的命令来创建这些项:

# kubectl create -f influxdb-service.yaml
service "monitoring-influxdb" created
# kubectl create -f grafana-service.yaml
You have exposed your service on an external port on all nodes in
your
cluster. If you want to expose this service to the external
internet, you may
need to set up firewall rules for the service port(s) (tcp:30000)
to serve traffic.

See http://releases.k8s.io/release-1.2/docs/user-guide/servicesfirewalls.md for more details.
service "monitoring-grafana" created
# kubectl create -f heapster-service.yaml
service "heapster" created
# kubectl create -f influxdb-grafana-controller.yaml
replicationcontroller "monitoring-influxdb-grafana-v3" created
// Because heapster requires the DB server and service to be
ready, schedule it as the last one to be created.
# kubectl create -f heapster-controller.yaml
replicationcontroller "heapster-v1.0.2" created
  1. 在kube-system命名空间中检查Kubernetes的资源:
# kubectl get svc --namespace=kube-system
NAME CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
heapster 192.168.135.85 <none> 80/TCP
12m
kube-dns 192.168.0.2 <none> 53/UDP,53/
TCP 15h
monitoring-grafana 192.168.84.223 nodes 80/TCP
12m
monitoring-influxdb 192.168.116.162 <none> 8083/
TCP,8086/TCP 13m
# kubectl get pod --namespace=kube-system
NAME READY STATUS
RESTARTS AGE
heapster-v1.0.2-r6oc8 2/2 Running 0
4m
kube-dns-v11-k81cm 4/4 Running 0
15h
monitoring-influxdb-grafana-v3-d6pcb 2/2 Running 0
12m
    1. 恭喜!一旦你所有的Pod都处于ready状态,查看监视面板。

介绍Grafrana面板

此时,Grafana仪表板可通过Node的端点来访问。 请确保AWS上节点的防火墙或安全组已将端口30000打开到本地子网。 使用浏览器查看仪表板。 在您的网址搜索栏中输入<NODE_ENDPOINT>:30000:

黙认的设置中,我们有两个仪表板,分别是Cluster和Pods。Cluster面板包含了Node的资源使用,如CPU,内存,网络事务和存储。Pods的面板中每个Pod都有相似的图表并且你可以监视Pod中的每个容器。

正如上面图片所显示的,例如,我们可以观察kube-dns-v11 Pod中独立容器的内存使用。它是DNS服务器的集群。中间的紫色行仅仅表示了我们为skydns和kube2sky这两个容器设置的限制。

为监视Pod创建一个新维度

Heapster(https://github.com/kubernetes/heapster/blob/master/docs/storage-schema.md )提供了一些供监视使用的度量。我们将向你展示如何创建一个自定义面板。请参考以下步骤:

  1. 进到Pod面析并单击网页底部的ADD ROW。左侧会显示一个绿色按钮。选择添加一个图形面板。

  1. 首先,为你的面板起个名称。例如,CPU Rate。我们想要创建一个显示CPU使用率的面板:

  1. 设置查询参数,如下截图所示:

 

  • FROM:这个参数输入cpu/usage_rage
  • WHERE:这个参数设置为 type = pod_container

  • AND:将这个参数设为namespace_name=$namespace,pod_name = $podname

  • GROUP BY:为这个参数输入(conatiner_name)

  • ALIAS BY:对于这个参数输入$tag_container_name

  1. 干的不错!你现在可以通过单击顶部的图标来保存Pod:

试着发现Grafana仪表板和Heapster监控工具的更多功能。 您将通过监控系统的信息获得有关系统,服务和容器的更多详细信息。

还可以参考

本节告诉您如何监视Kubernetes系统中的Master节点和Node节点。 但是,研究有关主要组件和守护进程的使用是明智的。 您可以更好地了解工作流程和资源使用情况。 此外,由于我们已经使用多种服务来构建我们的监控系统,因此再次查看有关Kubernetes服务的相关章节将使您清楚了解如何构建此监控系统。

  • 第1章构建你自己的Kubernetes,创建一个层叠网络,配置Master和配置Node这几节

  • 第2章理解Kubernetes相关概念,服务的使用这一节

Kubernetes是一个不断前进不断升级的项目。想要迎头赶上,推荐的方法是在其官方网站(http://kubernetes.io )上查看新功能。同时,你总是可以从GitHub(https://github.com/kubernetes/kubernetes/releases )上获取最新的Kuberntes。保持你的Kubernetes系统持续更新,并实践学习它的新功能,是不断学习Kubernetes技术的最好方法。