1. 程式人生 > >國內使用 kubeadm 在 Centos 7 搭建 Kubernetes 叢集

國內使用 kubeadm 在 Centos 7 搭建 Kubernetes 叢集

目錄

  • Kubeadm 介紹
  • 環境、軟體準備
  • 軟體安裝配置
    • 映象準備
    • 安裝 Docker
    • 安裝並配置 Kubernetes 元件
  • 初始化 Master
  • 安裝 Flannel 網路元件
  • 部署 Node 節點
  • 安裝 Kubernetes Dashboard
  • Dashboard 整合 Heapster
  • 安裝過程問題總結

1、kubeadm 介紹

Kubernetes 是 Google 開源的基於 Docker 的容器叢集管理系統,通過 yaml 語言寫的配置檔案,簡單快速的就能自動部署好應用環境,支援應用橫向擴充套件,並且可以組織、編排、管理和遷移這些容器化的應用。Kubeadm 是一個可以快速幫助我們建立穩定叢集服務的工具,通過它,我們可以在虛擬機器、實體機或者雲端快速部署一個高可用的叢集服務。

2、環境、軟體準備

安裝之前,先介紹下 Kubeadm 安裝 kubernetes 需要的一些基本硬體要求。

  • 系統要求,支援的系統 Ubuntu 16.04+、 CentOS 7 、HypriotOS v1.0.1+
  • 記憶體要求,每臺機器至少要有 1GB 記憶體,否則叢集啟動後,留給執行的應用可用記憶體就很少了。
  • 網路要求,保證叢集內所有機器之前的網路是可以互相連通的。

本次演示我準備了兩臺系統為 CentOS Linux 7 (Core) 的虛擬機器,一臺作為 Master,一臺作為 Node,預設 Master 機器不參與 Pod 排程。叢集機器資訊如下:

HostName IP CPU MEM DES
master.localdomain 10.236.65.125 2 Core 2G k8s master 節點
node0.localdomain 10.236.65.135 2 Core 2G 應用節點

此外,我們還需要做一些初始化工作,下邊安裝過程中遇到坑的時候也會提到。

1、安裝 ebtables ethtool,否則後邊執行 kubeadm init 的時候會報錯。

$ yum install ebtables ethtool

2、修改網路開啟橋接網路支援,只針對(RHEL/CentOS 7)系統。

$ cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

或者
$ vim /usr/lib/sysctl.d/00-system.conf  # 將 net.bridge.bridge-nf-call-iptables 值改成 1

# 然後修改當前核心狀態
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

3、關閉 SELinux,目的為了允許容器能夠與本機檔案系統互動。

$ setenforce 0
$ systemctl daemon-reload

4、修改節點的 hostname,因為 kubernetes 是根據 hostname 來標示各節點的。

# Master 節點
$ echo "master.localdomain" > /etc/hostname 
$ echo "10.236.65.125   master.localdomain" >> /etc/hosts
$ sysctl kernel.hostname=master.localdomain # 不重啟情況下使核心修改生效

3、軟體安裝配置

我們知道 kubernetes 環境底層是依賴 Docker 的,所以這裡軟體安裝包括了 Docker 安裝, kubelet、kubeadm、kubectl 元件安裝,以及一些初始化配置工作。

Master 和 Node 節點由於分工不一樣,所以安裝的服務不同,最終安裝完畢,Master 和 Node 啟動的核心服務分別如下:

Master 節點 Node 節點
etcd-master kube-flannel
kube-apiserver kube-proxy
kube-controller-manager other apps
kube-dns
kube-flannel
kube-proxy
kube-scheduler

3.1 映象準備

kubernetes 服務啟動依賴很多映象,但是這些映象要是在國內沒有翻牆的話,是下載不下來的。這裡我們可以去 Docker Hub 下載指定版本的映象替代,下載完成後,通過 docker tag ... 命令修改成指定名稱的映象即可。

本次演示 kubernetes 所依賴的各個映象列表如下:

Image Name Version Des ( * 必需)
gcr.io/google_containers/kube-scheduler-amd64 v1.6.2 *
gcr.io/google_containers/kube-proxy-amd64 v1.6.2 *
gcr.io/google_containers/kube-controller-manager-amd64 v1.6.2 *
gcr.io/google_containers/kube-apiserver-amd64 v1.6.2 *
gcr.io/google_containers/etcd-amd64 3.0.17 *
gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64 1.14.1 *
gcr.io/google_containers/k8s-dns-kube-dns-amd64 1.14.1 *
gcr.io/google_containers/k8s-dns-sidecar-amd64 1.14.1 *
gcr.io/google_containers/pause-amd64 3.0 *
gcr.io/google_containers/flannel v0.7.1-amd64 *
gcr.io/google_containers/kubernetes-dashboard-amd64 v1.6.0
gcr.io/google_containers/heapster-influxdb-amd64 v1.3.3
gcr.io/google_containers/heapster-grafana-amd64 v4.4.3
gcr.io/google_containers/heapster-amd64 v1.4.0

可使用下邊指令碼,分別替換以上映象。

#!/bin/bash

images=(
    flannel:v0.7.1-amd64 
    kube-scheduler-amd64:v1.6.2 
    kube-proxy-amd64:v1.6.2  
    kube-controller-manager-amd64:v1.6.2 
    etcd-amd64:3.0.17 
    kubernetes-dashboard-amd64:v1.6.0  
    k8s-dns-dnsmasq-nanny-amd64:1.14.1  
    k8s-dns-kube-dns-amd64:1.14.1
    k8s-dns-sidecar-amd64:1.14.1 
    pause-amd64:3.0)

for imageName in ${images[@]} ; do
    docker pull docker.io/lvanneo/$imageName
    docker tag docker.io/lvanneo/$imageName gcr.io/google_containers/$imageName 
    docker rmi docker.io/lvanneo/$imageName
done


docker pull docker.io/bjb2010/kube-apiserver-amd64:v1.6.2 
docker tag docker.io/bjb2010/kube-apiserver-amd64:v1.6.2  gcr.io/google_containers/kube-apiserver-amd64:v1.6.2
docker rmi docker.io/bjb2010/kube-apiserver-amd64:v1.6.2

images=(
    heapster-grafana-amd64-v4.4.3:v4.4.3
    heapster-influxdb-amd64-v1.3.3:v1.3.3
    heapster-amd64-v1.4.0:v1.4.0)

for imageName in ${images[@]} ; do
    docker pull docker.io/wanghkkk/$imageName
    docker tag docker.io/wanghkkk/$imageName gcr.io/google_containers/$imageName 
    docker rmi docker.io/wanghkkk/$imageName
done    

3.2 安裝 Docker

每臺機器都需要安裝 Docker,官方文件建議版本為 Version v1.12,其他版本 v1.11、v1.13、 17.03 也都測試沒問題,最新版還沒有測試驗證,這裡我們選擇 v1.12 版本。

$ yum install -y docker

# 設定開啟啟動並啟動服務
$ systemctl enable docker && systemctl start docker

3.3 安裝並配置 kubernetes 元件

需要安裝的 kubernetes 元件主要有 kubelet、kubeadm、kubectl 這幾個。針對可以翻牆的使用者可以 yum 配置 kubernetes 官方源:

# 配置 yum 源
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

#設定完成後,安裝kubelet、kubeadm、kubectl 元件
$ yum install -y kubelet kubeadm kubectl

# 設定開機啟動,以及啟動各元件
$ systemctl enable kubelet && systemctl start kubelet

對於國內不能翻牆的使用者,可以下載指定版本的 rpm 包安裝,也可以去 github 下載 kubernetes release 這個專案原始碼,本地編譯生成 rpm 包。

$ git clone https://github.com/kubernetes/release.git
$ cd rpm
$ ./docker-build.sh
...

最終執行完畢的結果,會在專案 release/rpm/output/ 下生成特定版本的 rpm 包。

這裡寫圖片描述

這裡附上熱心網友已經上傳到網盤的 RPM 包地址:https://pan.baidu.com/s/1clIpjC cp6h,可以下載下來上傳到虛擬機器中。然後執行如下命令,完成元件的安裝。

# yum 安裝 rpm 包
$ yum install -y *.rpm

# 設定開機啟動
$ systemctl enable kubelet

安裝完畢後,我們還需要配置一下 kubelet,主要修改配置檔案 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 中的 KUBELET_CGROUP_ARGS 配置。

vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CGROUP_ARGS  $KUBELET_EXTRA_ARGS

這裡說明一下,kubelet 預設的 cgroup 的驅動為 cgroupfs,而 Docker 預設的 cgroup 的驅動為 systemd,所有這裡可以將 kubectl 的預設驅動改為同 Docker 的一樣,否則下邊執行 kubeadm init 的時候會報錯。當然也可以修改 Docker 的驅動為 cgroupfs。

修改完成之後,需要重新 reload 一下 kubelet 服務。

$ systemctl daemon-reload

好了,通過以上安裝配置就完成了 Master 節點環境的初始化工作了,Node 節點機器初始化就簡單了,因為我使用的是虛擬機器,那麼只需要將配置好的主機環境複製一份就好了。當然如果你是實體機的話,那就按照上邊初始化的操作步驟來一遍就可以了。最後不要忘記修改 Node 節點的 hostname 哈。

# Node 節點
$ echo "node0.localdomain" > /etc/hostname 
$ echo "10.236.65.135   node0.localdomain" >> /etc/hosts
$ sysctl kernel.hostname=node0.localdomain # 不重啟情況下使核心修改生效

4、初始化啟動 Master

配置完主機後,我們可以啟動 Master 節點了。在執行初始化 init 時,kubernetes 並沒有選擇預設的 Pod Network,它支援很多種,這裡我們選擇 Flannel 作為 Pod Network,按照文件說明,執行 init 時,需要帶上引數 --pod-network-cidr,即指定網路區間,同時我們也可以通過 --kubernetes-version 指定選擇 kubernetes 的版本號,因為我們映象以及 rpm 包都是指定 1.6.2 的版本,所以最終執行命令如下:

$ kubeadm init --kubernetes-version=v1.6.2 --pod-network-cidr=10.96.0.0/12
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.6.2
[init] Using Authorization mode: RBAC
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [master.localdomain kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.236.65.125]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[apiclient] Created API client, waiting for the control plane to become ready
[apiclient] All control plane components are healthy after 16.577867 seconds
[apiclient] Waiting for at least one node to register
[apiclient] First node has registered after 4.004669 seconds
[token] Using token: 3aaf19.8e758a48f2050bd1
[apiconfig] Created RBAC rules
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run (as a regular user):

  sudo cp /etc/kubernetes/admin.conf $HOME/
  sudo chown $(id -u):$(id -g) $HOME/admin.conf
  export KUBECONFIG=$HOME/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  http://kubernetes.io/docs/admin/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join --token 3aaf19.8e758a48f2050bd1 10.236.65.125:6443

如果一切順利的話,就會出現上邊的執行結果輸出。此時我們需要好好儲存一下 kubeadm join --token 3aaf19.8e758a48f2050bd1 10.236.65.125:6443,這是後邊其他 Node 節點加入叢集的通關文牒。。。 不過要提一下的是,如果初始化時卡在某一步不能繼續下去的時候,可以通過 journalctl -xeu kubelet 檢視初始化日誌,找到錯誤原因。

好了初始化 Master 完成後,我們使用命令 kubectl get node 檢視叢集節點資訊,但是你會發現並沒有出現 Node 資訊,反而報錯如下:

$ kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?

What?上邊不都顯示安裝完成了嗎?其實是已經初始化完成了,只不過想使用叢集的話,少了上邊日誌輸出的那一步。

$ sudo cp /etc/kubernetes/admin.conf $HOME/
$ sudo chown $(id -u):$(id -g) $HOME/admin.conf
$ export KUBECONFIG=$HOME/admin.conf

現在我們在使用命令 kubectl get node 檢視叢集節點資訊,就符合預期結果了。

$ kubectl get node
NAME                 STATUS    AGE       VERSION
master.localdomain   Ready     1d        v1.6.2

我們在使用命令 kubectl get pod --all-namespaces 檢視當前節點所有的 pod。

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                         READY     STATUS         RESTARTS   AGE
kube-system   etcd-master.localdomain                      1/1       Running        0          23h
kube-system   kube-apiserver-master.localdomain            1/1       Running        0          1d
kube-system   kube-controller-manager-master.localdomain   1/1       Running        0          1d
kube-system   kube-dns-3913472980-37b6d                    0/3       Pending        0          14m
kube-system   kube-proxy-czzg9                             1/1       Running        0          1d
kube-system   kube-scheduler-master.localdomain            1/1       Running        0          1d

注意這裡 kube-dns 顯示狀態為 Pending,沒有關係,這是因為還沒有安裝 Pod Network 元件導致的,接下來我們安裝 Flannel 網路元件後,它就會自動跑起來了。

5、安裝 Flannel 網路元件

kubernetes 提供了很多種網路元件選擇,有 Calia、Canal、Flannel、Kube-router、Romana、Weave Net 可以使用,具體使用可以參考 官方文件 (3/4) Installing a pod network 來操作,這裡我們選擇 Flannel 作為網路元件。

# 安裝最新版,注意提前下載好要替代的 image
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml

這裡我使用 v0.7.1 版本,需要使用兩個檔案,可在 Github Flannel上獲取。

$ kubectl apply -f https://github.com/coreos/flannel/blob/v0.7.1/Documentation/kube-flannel-rbac.yml
$ kubectl apply -f https://github.com/coreos/flannel/blob/v0.7.1/Documentation/kube-flannel.yml

安裝完畢後,我們稍等一會再來檢視下 pod 列表。

$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                         READY     STATUS             RESTARTS   AGE
kube-system   etcd-master.localdomain                      1/1       Running            0          23h
kube-system   kube-apiserver-master.localdomain            1/1       Running            0          1d
kube-system   kube-controller-manager-master.localdomain   1/1       Running            0          1d
kube-system   kube-dns-3913472980-37b6d                    3/3       Running            0          14m
kube-system   kube-flannel-ds-vkdzw                        2/2       Running            5          4m
kube-system   kube-proxy-czzg9                             1/1       Running            0          1d
kube-system   kube-scheduler-master.localdomain            1/1       Running            0          1d

現在是不是都是 Running 狀態啦!

6、部署 Node 節點

Master 已經正常啟動完畢了,現在我們將 Node 加入 cluster 叢集中,使用 kubeadm join ... 命令。在 Node 節點上執行(上邊執行 init 時日誌列印的命令)

$ kubeadm join --token 3aaf19.8e758a48f2050bd1 10.236.65.125:6443
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[discovery] Trying to connect to API Server "10.236.65.125:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://10.236.65.125:6443"
[discovery] Cluster info signature and contents are valid, will use API Server "https://10.236.65.125:6443"
[discovery] Successfully established connection with API Server "10.236.65.125:6443"
[bootstrap] Detected server version: v1.6.2
[bootstrap] The server supports the Certificates API (certificates.k8s.io/v1beta1)
[csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request
[csr] Received signed certificate from the API server, generating KubeConfig...
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"

Node join complete:
* Certificate signing request sent to master and response
  received.
* Kubelet informed of new secure connection details.

Run 'kubectl get nodes' on the master to see this machine join.

現在我們在 Master 節點檢視下叢集節點資訊,就會發現已經包含該 Node 節點了。

$ kubectl get node -o wide
NAME                 STATUS    AGE       VERSION   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION
master.localdomain   Ready     1d        v1.6.2    <none>        CentOS Linux 7 (Core)   3.10.0-514.26.2.el7.x86_64
node0.localdomain    Ready     1d        v1.6.2    <none>        CentOS Linux 7 (Core)   3.10.0-514.26.2.el7.x86_64

檢視下叢集所有 pod 列表,發現符合預期 Master、Node 啟動服務列表。

$ kubectl get pods --all-namespaces -o wide
NAMESPACE     NAME                                         READY     STATUS    RESTARTS   AGE       IP             NODE
kube-system   etcd-master.localdomain                      1/1       Running   0          1d        10.236.65.125   master.localdomain
kube-system   kube-apiserver-master.localdomain            1/1       Running   0          1d        10.236.65.125   master.localdomain
kube-system   kube-controller-manager-master.localdomain   1/1       Running   0          1d        10.236.65.125   master.localdomain
kube-system   kube-dns-3913472980-2v5l8                    3/3       Running   0          1d        10.96.0.3       master.localdomain
kube-system   kube-flannel-ds-lm1hn                        2/2       Running   0          1d        10.236.65.135   node0.localdomain
kube-system   kube-flannel-ds-v37gs                        2/2       Running   0          1d        10.236.65.125   master.localdomain
kube-system   kube-proxy-2t7k1                             1/1       Running   0          1d        10.236.65.135   node0.localdomain
kube-system   kube-proxy-pvw73                             1/1       Running   0          1d        10.236.65.125   master.localdomain
kube-system   kube-scheduler-master.localdomain            1/1       Running   0          1d        10.236.65.125   master.localdomain

7、安裝 Kubernetes Dashboard

接下來我們來安裝一下 Kubernetes Dashboard 監控,版本選擇,因為我們 kubernetes 版本為 v1.6.2 所以我們選擇對應的 Dashboard 版本為 v1.6.+ 即可,版本也不要太新,否則可能會出現相容性問題。不過可以使用 v1.6.0+ 的版本,它開始支援中文了,更直觀一些哈。

$ kubectl create -f https://github.com/kubernetes/dashboard/blob/v1.6.0/src/deploy/kubernetes-dashboard.yaml

安裝完成之後,可以通過命令獲取服務埠號,方式有兩種:

方式一,通過獲取 service 列表中 PORT,例如下邊 80:30438/TCP ,那麼 NodePort 就是 30438

$ kubectl get service --all-namespaces
NAMESPACE     NAME                   CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
default       kubernetes             10.96.0.1        <none>        443/TCP         1d
kube-system   kube-dns               10.96.0.10       <none>        53/UDP,53/TCP   1d
kube-system   kubernetes-dashboard   10.106.212.217   <nodes>       80:30438/TCP    1d

方式二,通過獲取 service kubernetes-dashboard 的描述資訊,找到 NodePort: 顯示即為埠號。

$ kubectl describe service kubernetes-dashboard -n kube-system
Name:           kubernetes-dashboard
Namespace:      kube-system
Labels:         app=kubernetes-dashboard
Annotations:        kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kub...
Selector:       app=kubernetes-dashboard
Type:           NodePort
IP:         10.106.212.217
Port:           <unset> 80/TCP
NodePort:       <unset> 30438/TCP
Endpoints:      10.96.0.4:9090
Session Affinity:   None
Events:         <none>

從上可以看出 NodePort 為 30438,所以我們可以通過 http://<NodeIP>:<NodePort> 方式既可以訪問 Dashboard UI 頁面了。注意這裡的 NodeIP 可以為 Master 或者 Node 節點的 IP 都可以。我這兩臺虛擬機器,可以通過 http://10.236.65.125:30438http://10.236.65.135:30438 訪問 Dashboard。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

8、Dashboard 整合 Heapster

Kubernetes Dashboard 監控安裝完畢後,其實整個 Kubernetes 服務體系已經可以正常執行起來了,我們需要做的就是將我們的服務部署到叢集中。這裡在補充一下如何使 Kubernetes Dashboard 整合 Heapster 外掛,來圖形化展現叢集度量指標資訊。大體安裝過程如我上一篇文章 初始 minikube 安裝 Kubernetes Dashboard 並整合 Heapster,這裡就在簡單的說一下。

首先我們去 GitHub 下載 GitHub Heapster 最新穩定版程式碼到本地指定目錄,然後通過 yaml 檔案建立並啟動各個服務。這裡我們選擇 InfluxDB 作為後端資料儲存,Grafana 作為圖形化展示。

$ cd /Users/wanyang3/docker/kubernetes/
$ git clone https://github.com/kubernetes/heapster.git
$ ls -l deploy/kube-config/influxdb/
total 24
-rw-r--r--  1 wanyang3  staff  2291 10 19 14:49 grafana.yaml
-rw-r--r--  1 wanyang3  staff  1162 10 20 15:01 heapster.yaml
-rw-r--r--  1 wanyang3  staff   974 10 19 14:49 influxdb.yaml

在執行 create 之前請保證能夠翻牆或者已經替換好了所需要的 images。

$ kubectl create -f deploy/kube-config/influxdb/
delpoyment "heapster" created
service "heapster" created
deployment "monitoring-influxdb" created
service "monitoring-influxdb" created
deployment "monitoring-grafana" created
service "monitoring-grafana" created

$ kubectl get pods -n kube-system
NAME                                   READY     STATUS    RESTARTS   AGE
heapster-3848557544-1548b              1/1       Running   0          1d
monitoring-grafana-2175968514-7tl3w    1/1       Running   0          1d
monitoring-influxdb-1957622127-x28mz   1/1       Running   0          1d
...

Heapster 外掛已經啟動完畢了,如果一切正常的話,稍等幾分鐘(採集資料需要些時間),再次重新整理 dashboard,就能看到叢集度量指標資訊將以圖形化方式展現出來。

這裡寫圖片描述

這裡寫圖片描述

這裡值的一提的是,如果重新整理沒有出來圖形化的話,可以通過檢視日誌查詢原因。

$kubectl logs -f pod/heapster-3848557544-1548b -n kube-system

通過日誌可以發現,在 heapster-3848557544-1548b 這個 pod 的日誌中,發現有錯誤:

...
Failed to list *api.Node: Get https://kubernetes.default/api/v1/nodes?resourceVersion=0: 
x509: certificate is valid for server, not kubernetes.default
...

解決方法有兩種:

1、通過參考 Github Heapster 配置資料來源文件 Heapster source-configuration,修改配置資料來源為 --source=kubernetes:http://<address-of-kubernetes-master>:<http-port>?inClusterConfig=false,採用 insecure-port 的方式連線,因為 kube-apiserver 針對 insecure-port 接入的請求沒有任何限制機制。
2、通過命令獲取 kubernetes ClusterIP,直接使用 ClusterIP 也是可以的。

$ kubectl get service
NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.0.0.1     <none>        443/TCP        1d
...

修改 heapster.yaml 

command:
    - /heapster
    #- --source=kubernetes:https://kubernetes.default
    - --source=kubernetes:https://10.0.0.1
    - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086

修改配置完成後,使用 kubectl apply -f deploy/kube-config/influxdb/heapster.yaml 重新 apply 一下該 pod。再次稍等幾分鐘,再次重新整理 dashboard,就能看到了。

9、安裝過程問題總結

  1. 執行 kubeadm init ... 時,報錯如下:

    ebtables not found in system path ...

    原因是沒有安裝 ebtables 導致,執行 yum install -y ebtables 安裝即可。

  2. 執行 kubeadm init ... 時,卡在了 [apiclient] Created API client, waiting for the control plane to become ready 不繼續執行了,通過 journalctl -xeu kubelet 檢視日誌得到報錯資訊:

    ...
    error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    原因是 kubelet 的 cgroup 驅動跟 docker 不一致,解決方案是選擇一種驅動,將二者改成一致。

    方式一:

    $ vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
    
    $ systemctl daemon-reload 
    $ systemctl restart kubelet

    方式二:

    $ vim /lib/systemd/system/docker.service
    將 --exec-opt native.cgroupdriver=systemd  修改為:--exec-opt native.cgroupdriver=cgroupfs
    
    $ systemctl daemon-reload 
    $ systemctl restart docker.service
  3. 執行 kubeadm init ... 完成之後,使用 kubectl ... 命令時,提示如下資訊:

    The connection to the server localhost:8080 was refused - did you specify the right host or port?

    原因是沒有設定 KUBECONFIG,執行如下兩種方式均可:

    方式一:
    sudo cp /etc/kubernetes/admin.conf $HOME/
    sudo chown $(id -u):$(id -g) $HOME/admin.conf
    export KUBECONFIG=$HOME/admin.conf
    
    方式二:
    export KUBECONFIG=/etc/kubernetes/admin.conf 
    source ~/.bash_profile  
  4. 安裝完 Flannel 網路元件之後,發現 pod kube-flannel 的狀態為 CrashLoopBackOff,執行命令檢視日誌,提示如下資訊:

    Error from server (BadRequest): a container name must be specified for pod kube-flannel-ds-hl9xd, choose one of: [kube-flannel install-cni]

    出現這個是因為 pod kube-flannel 啟動了兩個容器 kube-flannel 和 install-cni,檢視日誌時需要指定檢視那個容器,可通過命令 -c <container_name> 指定,例如: kubectl logs -f pods/kube-flannel-ds-vkdzw -c install-cni -n kube-system。通過命令可以看到報錯資訊如下:

    + cp -f /etc/kube-flannel/cni-conf.json /etc/cni/net.d/10-flannel.conf
    cp: can't create '/etc/cni/net.d/10-flannel.conf': Permission denied

    這個是因為容器跟主機檔案系統有互動操作,需要關閉 SELinux,執行如下命令即可:

    $ setenforce 0
    $ systemctl daemon-reload
  5. Dashboard 整合 Heapster 外掛時,執行完 $ kubectl create -f deploy/kube-config/influxdb/ 操作後,發現 pod heapster 狀態非 Running,通過日誌可以看到如下報錯資訊:

    ...
    E1027 07:36:16.951175       1 reflector.go:190] k8s.io/heapster/metrics/heapster.go:322: Failed to list *v1.Pod: User "system:serviceaccount:kube-system:heapster" cannot list pods at the cluster scope. (get pods)
    E1027 07:39:18.383356       1 reflector.go:190] k8s.io/heapster/metrics/processors/namespace_based_enricher.go:84: Failed to list *v1.Namespace: User "system:serviceaccount:kube-system:heapster" cannot list namespaces at the cluster scope. (get namespaces)
    ...

    解決這個方案是增加了一個 heapster-rbac.yaml 檔案,定義一個名為 heapster 的 ServiceAccount,然後將它和 Cluster Role view 繫結。該檔案在下載的原始碼中 deploy/kube-config/rbac 目錄中存在,執行如下命令即可:

    $ kubectl apply -f deploy/kube-config/rbac/heapster-rbac.yaml
  6. 執行 kubeadm init ... 或者 kubeadm join ... 操作失敗後,如果想重新操作,不可以直接重複執行,需要執行 kubeadm reset 還原後在次執行。

  7. 如果我們需要重新部署並刪除 Node 節點的話,可以在 Master 節點上執行如下命令:

    $ kubectl drain <node_name> --delete-local-data --force --ignore-daemonsets
    $ kubectl delete node <node_name>

    node 節點上執行刪除 flannel 網段操作

    $ kubeadm reset
    $ ifconfig cni0 down
    $ ip link delete cni0
    $ ifconfig flannel.1 down
    $ ip link delete flannel.1
    $ rm -rf /var/lib/cni/
  8. kubeadm 預設安裝時,Master 節點不參與 Pod 排程,即不會有非核心元件的 Pod 在 Master 節點上被創建出來,可以通過如下命名,將 Master 參與 Pod 排程。

    $ kubectl taint nodes <node_name> dedicated-
    
  9. 配置其他節點管理整個叢集,可以通過如下命令:

    $ scp [email protected]<master_ip>:/etc/kubernetes/admin.conf .
    $ kubectl --kubeconfig ./admin.conf get nodes
  10. 配置本地代理 API Server,可以通過如下命令:

    $ scp [email protected]<master_ip>:/etc/kubernetes/admin.conf .
    $ kubectl --kubeconfig ./admin.conf proxy

參考資料

相關推薦

國內使用 kubeadmCentos 7 搭建 Kubernetes 叢集

目錄 Kubeadm 介紹 環境、軟體準備 軟體安裝配置 映象準備 安裝 Docker 安裝並配置 Kubernetes 元件 初始化 Master 安裝 Flannel 網路元件 部署 Node 節點 安裝 Kubernetes Dashboard Da

基於 CentOS 7 搭建kubernetes集群

kubernetes docker 基於Centos7構建Kubernetes平臺一、實驗環境3臺centos7的主機:master 192.168.111.131部署etcd,kube-apiserver,kube-controller-manager,kube-scheduler 4個應用。no

CentOS 7 搭建 Redis 叢集

1 準備 2 搭建叢集 2.1 建立目錄 # 建立一個獨立目錄 mkdir /home/software/redis-cluster # 進入目錄 cd /home/software/redis-cluste # 在 redi

CentOS 7 搭建hadoop叢集(提供各種安裝包 超值免費)

軟體VMware 點選下載 提取碼:arqc   虛擬機器安裝教程 點選 Xftp 5 提取碼:qqeb   hadoop安裝教程 人家寫的挺好 我也就不重複了,安裝測試遇到的什麼問題都可以在下面留言,基本隨時回。 ---------------------

CentOS 7 搭建zookeeper 3.4.13叢集

一、伺服器叢集 伺服器 安裝內容 node-i(192.168.0.111) jdk1.8.0_181 zookeeper 3.4.13 node-ii(192.168.0.133) jdk1.8.0_181 zookeeper 3.4

CentOS 7 搭建kafka_2.12-2.0.0叢集

一、伺服器叢集     kafka叢集把狀態儲存在zookeeper中,在搭建kafka叢集前先搭建zookeeper叢集。     kafka叢集節點:192.168.0.24,192.168.0.48,192.168.0.60 二、搭建kafka叢集  

VirtualBox 搭建 CentOS 7 虛擬機器叢集

課題需要研究分散式計算,為此我學習在 Linux 叢集上執行 MPI 程式。為了先熟悉一下過程,我在 VirtualBox 搭建的 4 臺 CentOS 7 虛擬機器上構建了一個叢集。 這裡涉及的知識有: 虛擬機器靜態 ip 分配和網路互聯的設定 SSH 免密登陸

linux CentOS 7下zookeeper叢集環境搭建

zookeeper說明 ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重

CentOS 7 搭建redis 4.0.11叢集

一、單節點部署redis叢集 1、建立redis叢集目錄         在同一個主機中部署三主三從的redis叢集,redis節點為7001-7006。     新建redis叢集目錄:mkdir -p /usr/local/redis-cluster,在該目錄下建立

Hadoop2.6.0在CentOS 7中的叢集搭建

我這邊給出我的叢集環境是由一臺主節點master和三臺從節點slave組成: master     192.168.1.2 slave1       192.168.1.3 slave2       192.168.1.4 slave3       192.168.1.5 申明:我搭建的這個叢集不是

使用Kubeadm(1.13+)快速搭建Kubernetes叢集

原文: 使用Kubeadm(1.13+)快速搭建Kubernetes叢集 Kubeadm是管理叢集生命週期的重要工具,從建立到配置再到升級,Kubeadm處理現有硬體上的生產叢集的引導,並以最佳實踐方式配置核心Kubernetes元件,以便為新節點提供安全而簡單的連線流程並支援輕鬆升級。隨著Kubernet

CentOS 7搭建Spark 2.3.2叢集

一、伺服器叢集 伺服器 安裝內容 node-i scala-2.12.7; spark-2.3.2 node-ii scala-2.12.7; spark-2.3.2 node-iii scala-2.12.7; spark-2.3.2

CentOS7 使用 kubeadm 搭建 kubernetes 叢集(極速篇)

序言本人在安裝 k8s 的過程中曲折不斷,故寫下此文,讓後人可以少走彎路。這篇文章只描述如何從0開始快速搭建 k8s 叢集,想更詳細瞭解具體遇到問題的分析過程和解決方案,可閱讀另一篇文章 —— CentOS7 使用 kubeadm 啟動 kubernetes 叢集(踩坑篇)本

CentOS 7搭建Zookeeper和Kafka叢集

# 環境 * CentOS 7.4 * Zookeeper-3.6.1 * Kafka_2.13-2.4.1 * Kafka-manager-2.0.0.2 本次安裝的軟體全部在 `/home/javateam` 目錄下。 # Zookeeper 叢集搭建 1. 新增三臺機器的 `hosts`,使用

centos 7搭建內網yum源

ice 報錯 測試 路徑 package sta dir httpd服務 mage 搭建環境:各節點關閉防火墻,因情況而定. yum節點:172.16.169.136 測試節點:172.16.169.137 安裝httpd服務,可視化 1.創建yum倉庫 創建存放rpm的

CentOS 7搭建Linux GPU服務器

系統 查詢 x86 smi bin run 服務器 版本沖突 anaconda 1. CUDA Toolkit的安裝 到https://developer.nvidia.com/cuda-gpus查詢GPU支持的CUDA版本: 到https://developer.

CentOS 7 搭建 VPN 服務

rect 寫入 服務器 ets 添加 cto ubuntu 成功 工作區 檢查是否支持 若你使用XEN架構的VPS,下面的步驟不用執行 檢測PPP是否開啟: cat /dev/ppp 開啟成功的標誌:cat: /dev/ppp: No such file or direct

centos 7 搭建svn

add netstat group 查詢 one gre 等號 refused 連接 安裝SVN # yum -y install svn 創建文件夾 # mkdir -p /home/svn/project1 生成svn倉庫 # svn

CentOS 7 搭建Jenkins+JDK+Git+Maven+Gradle持續集成系統

baseurl mpi https fail inf sco uil *** 編譯 一、Jenkinx 官網:https://jenkins.io/ Jenkins是一個開源軟件項目,是基於Java開發的一種持續集成工具,用於監控持續重復的工作,旨在提供一個開放

CentOS 7 搭建基於攜程Apollo(阿波羅)配置中心單機模式

管理平臺 9.png ron 密碼修改 art onf ice spring pos Apollo(阿波羅)是攜程框架部門研發的配置管理平臺,能夠集中化管理應用不同環境、不同集群的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性。服務端基於Sprin