Kubernetes+Prometheus+Grafana部署筆記

redhatxl發表於2019-01-09

一、基礎概念

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部署筆記

檢視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部署筆記

相關文章