Kubernetes+Prometheus+Grafana部署笔记

栏目: 服务器 · 发布时间: 6年前

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

一、基础概念

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位

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

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

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

查看所有标签

猜你喜欢:

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

Measure What Matters

Measure What Matters

John Doerr / Portfolio / 2018-4-24 / GBP 19.67

In the fall of 1999, John Doerr met with the founders of a start-up he’d just given $11.8 million, the biggest investment of his career. Larry Page and Sergey Brin had amazing technology, entrepreneur......一起来看看 《Measure What Matters》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具