为了账号安全,请及时绑定邮箱和手机立即绑定

Kubernetes+Prometheus+Grafana部署笔记

标签:
Linux


一、基础概念

1.1 基础概念

Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

功能特性:

自动化容器部署与复制

随时扩展或收缩容器规模

组织容器成组,提供容器间的负载均衡

快速更新及回滚容器版本

提供弹性伸缩,如果某个容器失效就进行替换

1.2 架构图

Kubernetes+Prometheus+Grafana部署笔记

1.3 组件

1.3.1 Master

Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd

APIServer:APIServer负责对外提供RESTful的Kubernetes API服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer处理后再提交给etcd。如架构图中所示,kubectl(Kubernetes提供的客户端工具,该工具内部就是对Kubernetes API的调用)是直接和APIServer交互的。

schedule:scheduler的职责很明确,就是负责调度pod到合适的Node上。如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定,即将这个pod部署到这个Node上。Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。

controller manager:如果说APIServer做的是“前台”的工作的话,那controller manager就是负责“后台”的。每个资源一般都对应有一个控制器,而controller manager就是负责管理这些控制器的。比如我们通过APIServer创建一个pod,当这个pod创建成功后,APIServer的任务就算完成了。而后面保证Pod的状态始终和我们预期的一样的重任就由controller manager去保证了。

etcd:etcd是一个高可用的键值存储系统,Kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

1.3.2 Node

每个Node节点主要由三个模块组成:kubelet、kube-proxy、runtime。

runtime。runtime指的是容器运行环境,目前Kubernetes支持docker和rkt两种容器。

kube-proxy:该模块实现了Kubernetes中的服务发现和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP连接转发,默认基于Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制,监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响。另外kube-proxy还支持session affinity。

kubelet:Kubelet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上面的所有容器,但是如果容器不是通过Kubernetes创建的,它并不会管理。本质上,它负责使Pod得运行状态与期望的状态一致。

1.3.3 Pod

Pod是k8s进行资源调度的最小单位,每个Pod中运行着一个或多个密切相关的业务容器,这些业务容器共享这个Pause容器的IP和Volume,我们以这个不易死亡的Pause容器作为Pod的根容器,以它的状态表示整个容器组的状态。一个Pod一旦被创建就会放到Etcd中存储,然后由Master调度到一个Node绑定,由这个Node上的Kubelet进行实例化。

每个Pod会被分配一个单独的Pod IP,Pod IP + ContainerPort 组成了一个Endpoint。

1.3.4 Service

Service其功能使应用暴露,Pods 是有生命周期的,也有独立的 IP 地址,随着 Pods 的创建与销毁,一个必不可少的工作就是保证各个应用能够感知这种变化。这就要提到 Service 了,Service 是 YAML 或 JSON 定义的由 Pods 通过某种策略的逻辑组合。更重要的是,Pods 的独立 IP 需要通过 Service 暴露到网络中。

二、安装部署

2.1 kubernetes安装部署

安装有较多方式,在此使用二进制安装和利用kubadm进行安装部署

2.1.1 二进制安装部署k8s

Kubernetes+Prometheus+Grafana部署笔记

环境介绍

名称  主机名称    IP地址    安装软件包   系统版本

kubernets server    master  172.16.0.67 etcd,kube-apiserver,kube-controller-manager,kube-scheduler  CentOS7.3 64位

kubernets node1 node01  172.16.0.66 kubelet,kube-proxy,docker   CentOS7.3 64位

kubernets node1 node02  172.16.0.68 kubelet,kube-proxy,docker   CentOS7.3 64位

软件版本

kubenets网址

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.8.md#v183

server端二进制文件

https://dl.k8s.io/v1.8.13/kubernetes-server-linux-amd64.tar.gz

node端二进制文件

https://dl.k8s.io/v1.8.13/kubernetes-node-linux-amd64.tar.gz

防火墙配置

systemctl stop firewalld

systemctl disable firewalld

systemctl mask firewalld

主机名修改,添加hosts解析

Kubernetes+Prometheus+Grafana部署笔记

2.1.1.1 服务端安装配置

master服务器安装etcd

yum install etcd -y

配置etcd,并启动服务器配置开机自启动

Kubernetes+Prometheus+Grafana部署笔记

下载软件包,创建目录拷贝文件

cd /tmp && wget  -c https://dl.k8s.io/v1.8.13/kubernetes-server-linux-amd64.tar.gz

tar -zxf kubernetes-server-linux-amd64.tar.gz

mkdir -p /opt/kubernetes/{bin,cfg}

mv kubernetes/server/bin/{kube-apiserver,kube-scheduler,kube-controller-manager,kubectl} /opt/kubernetes/bin

创建apiserver配置文件

cat > /opt/kubernetes/cfg/kube-apiserver<<EOF

KUBE_LOGTOSTDERR='--logtostderr=true'

KUBE_LOG_LEVEL="--v=4"

KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.0.67:2379"

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

KUBE_API_PORT="--insecure-port=8080"

KUBE_ADVERTISE_ADDR="--advertise-address=172.16.0.67"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"

EOF

创建apiserver服务文件

cat >/lib/systemd/system/kube-apiserver.service<<EOF

[Unit]

Description=Kubernetes API Server

Documentation=https://github.com/kubernetes/kubernetes

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver

#ExecStart=/opt/kubernetes/bin/kube-apiserver ${KUBE_APISERVER_OPTS}

ExecStart=/opt/kubernetes/bin/kube-apiserver \

\${KUBE_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${KUBE_ETCD_SERVERS} \

\${KUBE_API_ADDRESS} \

\${KUBE_API_PORT} \

\${KUBE_ADVERTISE_ADDR} \

\${KUBE_ALLOW_PRIV} \

\${KUBE_SERVICE_ADDRESSES}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

启动服务设置开机自启动

systemctl daemon-reload

systemctl enable kube-apiserver

systemctl start kube-apiserver

Kubernetes+Prometheus+Grafana部署笔记

配置scheduler

cat >/opt/kubernetes/cfg/kube-scheduler <<EOF

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.16.0.67:8080"

KUBE_LEADER_ELECT="--leader-elect"

EOF

创建服务器启动文件

cat>/lib/systemd/system/kube-scheduler.service<<EOF

[Unit]

Description=Kubernetes Scheduler

Documentation=https://github.com/kubernetes/kubernetes

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler

ExecStart=/opt/kubernetes/bin/kube-scheduler \

\${KUBE_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${KUBE_MASTER} \

\${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

启动服务

systemctl daemon-reload

systemctl enable kube-scheduler

systemctl restart kube-scheduler

Kubernetes+Prometheus+Grafana部署笔记

创建contorller-manager配置文件

cat > /opt/kubernetes/cfg/kube-controller-manager<<EOF

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=4"

KUBE_MASTER="--master=172.16.0.67:8080"

EOF

创建系统启动文件

cat > /lib/systemd/system/kube-controller-manager.service<<EOF

[Unit]

Description=Kubernetes Controller Manager

Documentation=https://github.com/kubernetes/kubernetes

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager

ExecStart=/opt/kubernetes/bin/kube-controller-manager \

\${KUBE_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${KUBE_MASTER} \

\${KUBE_LEADER_ELECT}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

启动服务

systemctl daemon-reload

systemctl enable kube-controller-manager

systemctl start kube-controller-manager

Kubernetes+Prometheus+Grafana部署笔记

至此master就已经配置完成,如若配置中有错误,可以通过#journalctl -u 服务名称查看报错,

为方便使用添加环境变量

echo "export PATH=\$PATH:/opt/kubernetes/bin" >> /etc/profile

source /etc/profile

2.1.1.2 node节点安装配置

安装配置docker

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum makecache fast

yum install docker-ce -y

下载安装kubenets-node软件包

cd /tmp && wget https://dl.k8s.io/v1.8.13/kubernetes-node-linux-amd64.tar.gz

tar -zxf kubernetes-node-linux-amd64.tar.gz

mkdir -p /opt/kubernetes/{bin,cfg}

mv kubernetes/node/bin/{kubelet,kube-proxy} /opt/kubernetes/bin/

创建kubeconfig配置文件

cat > /opt/kubernetes/cfg/kubelet.kubeconfig <<EOF

apiVersion: v1

kind: Config

clusters:

  - cluster:

      server: http://172.16.0.67:8080

    name: local

contexts:

  - context:

      cluster: local

    name: local

current-context: local

EOF

创建配置文件

    cat> /opt/kubernetes/cfg/kubelet  <<EOF

    # 启用日志标准错误

    KUBE_LOGTOSTDERR="--logtostderr=true"

    # 日志级别

    KUBE_LOG_LEVEL="--v=4"

    # Kubelet服务IP地址

    NODE_ADDRESS="--address=172.16.0.66"

    # Kubelet服务端口

    NODE_PORT="--port=10250"

    # 自定义节点名称

    NODE_HOSTNAME="--hostname-override=172.16.0.66"

    # kubeconfig路径,指定连接API服务器

    KUBELET_KUBECONFIG="--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig"

    # 允许容器请求特权模式,默认false

    KUBE_ALLOW_PRIV="--allow-privileged=false"

    # DNS信息

    KUBELET_DNS_IP="--cluster-dns=10.10.10.2"

    KUBELET_DNS_DOMAIN="--cluster-domain=cluster.local"

    # 禁用使用Swap

    KUBELET_SWAP="--fail-swap-on=false"

    EOF

创建systemd服务文件

cat>/lib/systemd/system/kubelet.service<<EOF

[Unit]

Description=Kubernetes Kubelet

After=docker.service

Requires=docker.service

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kubelet

ExecStart=/opt/kubernetes/bin/kubelet \

\${KUBE_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${NODE_ADDRESS} \

\${NODE_PORT} \

\${NODE_HOSTNAME} \

\${KUBELET_KUBECONFIG} \

\${KUBE_ALLOW_PRIV} \

\${KUBELET_DNS_IP} \

\${KUBELET_DNS_DOMAIN} \

\${KUBELET_SWAP}

Restart=on-failure

KillMode=process

[Install]

WantedBy=multi-user.target

EOF

启动服务

systemctl daemon-reload

systemctl enable kubelet

systemctl start kubelet

Kubernetes+Prometheus+Grafana部署笔记

node节点安装kube-proxy

创建配置文件

cat>/opt/kubernetes/cfg/kube-proxy  <<EOF

# 启用日志标准错误

KUBE_LOGTOSTDERR="--logtostderr=true"

# 日志级别

KUBE_LOG_LEVEL="--v=4"

# 自定义节点名称

NODE_HOSTNAME="--hostname-override=172.16.0.66"

# API服务地址

KUBE_MASTER="--master=http://172.16.0.67:8080"

EOF

创建systemd服务文件

cat > /lib/systemd/system/kube-proxy.service<<EOF

[Unit]

Description=Kubernetes Proxy

After=network.target

[Service]

EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy

ExecStart=/opt/kubernetes/bin/kube-proxy \

\${KUBE_LOGTOSTDERR} \

\${KUBE_LOG_LEVEL} \

\${NODE_HOSTNAME} \

\${KUBE_MASTER}

Restart=on-failure

[Install]

WantedBy=multi-user.target

EOF

启动服务

systemctl daemon-reload

systemctl enable kube-proxy

systemctl restart kube-proxy

Kubernetes+Prometheus+Grafana部署笔记

其他节点加入集群与node01方式相同,但需修改kubelet的--address和--hostname-override选项为本机IP即可。

2.1.2 利用kubeadm安装部署k8s

2.1.2.1 server端配置

安装docker

yum install -y docker

systemctl enable docker && systemctl start docker

配置并安装kubeadm源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

EOF

配置k8s配置文件

cat <<EOF >  /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

sysctl --system

yum安装并启动服务

yum install -y kubelet kubeadm kubectl

systemctl enable kubelet && systemctl start kubelet

systemctl daemon-reload

systemctl restart kubelet

初始化创建集群

kubeadm init --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。

--pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。

命令执行完成会返回提示如何注册其他节点到 Cluster,此处需要记录下token值,或整条命令。

配置kubectl

# 创建用户

useradd xuel

passwd xuel

# 切换到普通用户

su - xuel    

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 配置环境变量

export KUBECONFIG=/etc/kubernetes/admin.conf

echo "source <(kubectl completion bash)" >> ~/.bashrc

建议用普通用户操作kubectl

部署flannel

安装 Pod 网络,要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

2.1.2.2 node端配置

在需要加入集群的node节点也需要安装docker 和 kubeadm ,启动kubelet服务等操作,和master节点一样,在此就省略。

加入集群

此条命令为kubeadm init记录的命令

kubeadm join 172.16.0.64:6443 --token dt5tet.26peoqdwftx7yafv --discovery-token-ca-cert-hash sha256:5b4030d19662122204ff78a4fd0ac496b739a9945517deca67a9384f0bab2b21

2.1.2.3 测试查看

在master 执行

kubectl get nodes

kubectl get pod --all-namespaces

Kubernetes+Prometheus+Grafana部署笔记

2.2 Prometheus+Grafana的监控部署

2.2.1 master/node节点环境部署

在master可以进行安装部署

安装git,并下载相关yaml文件

git clone https://github.com/redhatxl/k8s-prometheus-grafana.git

在node节点下载监控所需镜像

docker pull prom/node-exporter

docker pull prom/prometheus:v2.0.0

docker pull grafana/grafana:4.2.0

2.2.2 采用daemonset方式部署node-exporter组件

kubectl create -f  node-exporter.yaml 

2.2.3 部署prometheus组件

2.2.3.1 rbac文件

kubectl create -f  k8s-prometheus-grafana/prometheus/rbac-setup.yaml

2.2.3.2 以configmap的形式管理prometheus组件的配置文件

kubectl create -f  k8s-prometheus-grafana/prometheus/configmap.yaml 

2.2.3.3 Prometheus deployment 文件

kubectl create -f  k8s-prometheus-grafana/prometheus/prometheus.deploy.yml 

2.2.3.4 Prometheus service文件

kubectl create -f  k8s-prometheus-grafana/prometheus/prometheus.svc.yml 

2.2.4 部署grafana组件

2.2.4.1 grafana deployment配置文件

kubectl create -f   k8s-prometheus-grafana/grafana/grafana-deploy.yaml

2.2.4.2 grafana service配置文件

kubectl create -f   k8s-prometheus-grafana/grafana/grafana-svc.yaml

2.2.4.3 grafana ingress配置文件

kubectl create -f   k8s-prometheus-grafana/grafana/grafana-ing.yaml

2.2.5 WEB界面配置

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

查看node-exporter

http://47.52.166.125:31672/metrics

Kubernetes+Prometheus+Grafana部署笔记

prometheus对应的nodeport端口为30003,通过访问http://47.52.166.125:30003/target 可以看到prometheus已经成功连接上了k8s的apiserver

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

通过端口进行granfa访问,默认用户名密码均为admin

Kubernetes+Prometheus+Grafana部署笔记

添加数据源

Kubernetes+Prometheus+Grafana部署笔记

导入面板,可以直接输入模板编号315在线导入,或者下载好对应的json模板文件本地导入,面板模板下载地址https:///dashboards/315

Kubernetes+Prometheus+Grafana部署笔记

查看展示效果

Kubernetes+Prometheus+Grafana部署笔记

三、测试

3.1 节点状态查看

在master查看nodes节点

Kubernetes+Prometheus+Grafana部署笔记

查看组件状态

Kubernetes+Prometheus+Grafana部署笔记

3.2 部署测试实例

部署实例

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

删除kubectl delete deployment apache

查看具体详细事件

kubectl get pods -o wide

Kubernetes+Prometheus+Grafana部署笔记

创建svc

kubectl expose deployment nginx --port=88 --target-port=80 --type=NodePort

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

集群外单个节点测试

Kubernetes+Prometheus+Grafana部署笔记

3.3 部署web-ui

配置kubernetes-dashboard.yaml

cat >kubernetes-dashboard.yaml<<EOF

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  labels:

    app: kubernetes-dashboard

  name: kubernetes-dashboard

  namespace: kube-system

spec:

  replicas: 1

  selector:

    matchLabels:

      app: kubernetes-dashboard

  template:

    metadata:

      labels:

        app: kubernetes-dashboard

      # Comment the following annotation if Dashboard must not be deployed on master

      annotations:

        scheduler.alpha.kubernetes.io/tolerations: |

          [

            {

              "key": "dedicated",

              "operator": "Equal",

              "value": "master",

              "effect": "NoSchedule"

            }

          ]

    spec:

      containers:

      - name: kubernetes-dashboard

        image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.7.0

        imagePullPolicy: Always

        ports:

        - containerPort: 9090

          protocol: TCP

        args:

           - --apiserver-host=http://172.16.0.67:8080   #配置为apiserver 地址

        livenessProbe:

          httpGet:

            path: /

            port: 9090

          initialDelaySeconds: 30

          timeoutSeconds: 30

---

kind: Service

apiVersion: v1

metadata:

  labels:

    app: kubernetes-dashboard

  name: kubernetes-dashboard

  namespace: kube-system

spec:

  type: NodePort

  ports:

  - port: 80

    targetPort: 9090

  selector:

    app: kubernetes-dashboard

EOF

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes+Prometheus+Grafana部署笔记

查看dashboard运行在那个具体的nodes内

Kubernetes+Prometheus+Grafana部署笔记

查看web界面

Kubernetes+Prometheus+Grafana部署笔记

©著作权归作者所有:来自51CTO博客作者KaliArch的原创作品,如需转载,请注明出处,否则将追究法律责任

k8skubernetesPrometheusLinux


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消