Kubernetes+Prometheus+Grafana部署笔记

栏目: 数据库 · 发布时间: 7年前

内容简介:Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。 ** 功能特性:**Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd

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位

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部署笔记

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ANSI Common Lisp

ANSI Common Lisp

Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40

For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具