轉載:http://blog.51cto.com/kaliarch/2160569

1、基礎概念

1.1 基礎概念

Kubernetes(一般寫成「k8s」)Kubernetes是Google開源的容器集羣管理系統。其設計目標是在主機集羣之間提供一個可以自動化部署、可拓展、應用容器可運營的平臺。Kubernetes一般結合docker容器工具工做,而且整合多個運行着docker容器的主機集羣,Kubernetes不只僅支持Docker,還支持Rocket,這是另外一種容器技術。
功能特性:javascript

  • 自動化容器部署與複製
  • 隨時擴展或收縮容器規模
  • 組織容器成組,提供容器間的負載均衡
  • 快速更新及回滾容器版本
  • 提供彈性伸縮,若是某個容器失效就進行替換

1.2 架構圖

Kubernetes+Prometheus+Grafana部署筆記

1.3 組件

1.3.1 Master

Master節點上面主要由四個模塊組成:APIServer、scheduler、controller manager、etcdphp

  • 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兩種容器。css

  • 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。java

1.3.4 Service

Service其功能使應用暴露,Pods 是有生命週期的,也有獨立的 IP 地址,隨着 Pods 的建立與銷燬,一個必不可少的工做就是保證各個應用可以感知這種變化。這就要提到 Service 了,Service 是 YAML 或 JSON 定義的由 Pods 經過某種策略的邏輯組合。更重要的是,Pods 的獨立 IP 須要經過 Service 暴露到網絡中。node

2、安裝部署

2.1 kubernetes安裝部署

安裝有較多方式,在此使用二進制安裝和利用kubadm進行安裝部署linux

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服務器安裝etcdgithub

    yum install etcd -y

    配置etcd,並啓動服務器配置開機自啓動
    Kubernetes+Prometheus+Grafana部署筆記web

  • 下載軟件包,建立目錄拷貝文件

    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、測試

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