當前位置:
首頁 > 最新 > 從零搭建kubernetes多節點cluster

從零搭建kubernetes多節點cluster

最近幾天我司很多kubernetes的cluster環境出了問題,而且很多控制許可權都只有少數人有,只好在自己筆記本上從零搭建Kubernetes的cluster環境。本文詳細總結了搭建多節點cluster的步驟,讓更多的人少走彎路,也算是我對雲時代的一點微薄貢獻:)。

閱讀本文之前,讀者最好對kubernetes的總體架構以及一些基本概念有一個基本的了解。即便不了解也沒有關係,現在網上的資料很多,隨便花個10~30分鐘就能了解個大概了。如果實在懶得去了解,直接閱讀本文也無妨:)。

廢話就不多說了,下面直接進入正題。

步驟一: 準備多台Linux環境

如果你已經有了幾台現成的Linux機器或者VM(虛擬機),那可以直接跳過這一步。下面介紹如果在本地安裝多台虛擬機。

1.1: 安裝VirtualBox

VirtualBox是一款開源的虛擬機管理軟體,之前是由Sun出品,後來被Oracle收購。這個就不多說了,自行下載一個安裝就是了。我安裝的版本是5.1.8。如果你用VMWare也應該沒問題。

1.2:安裝多台虛擬機

這裡介紹如何用vagrant來安裝虛擬機(關於vagrant,可以登錄 https://www.vagrantup.com/ 了解)。先從https://www.vagrantup.com/downloads.html下載 一個適合本地環境的安裝包。安裝之後,將可執行文件路徑加入path既可。

要保證你本地的環境可以訪問互聯網,一般情況下,需要設置代理(你懂的),否則無法從國外下載image。可以用下列命令設置代理,

export http_proxy="http://:80"

export https_proxy="http://:80"

然後打開記事本,直接將下面的內容粘貼上,然後保存成Vagrantfile(必須是這個文件名)。假設保存到了 D:k8sVagrantfile(我本地環境是Windows 7)。這個配置文件中配置了三台虛擬機,IP分別是192.168.77.10/11/12,每台虛擬機上安裝的是Oracle Linux 7.4。

# -*- mode: ruby -*-

# vi: set ft=ruby :

hosts = {

"n1" => "192.168.77.10",

"n2" => "192.168.77.11",

"n3" => "192.168.77.12"

}

Vagrant.configure("2") do config

# always use Vagrants insecure key

# forward ssh agent to easily ssh into the different machines

check_guest_additions = false

functional_vboxsf = false

hosts.each do name, ip

v.name = name

end

end

end

end

進入D:k8s目錄後,執行下面的命令:

vagrant up --provider=virtualbox

上面的命令執行時間可能比較長,因為會下載Oracle Linux的image文件。如果執行過程中遇到「Failed to attached the network LUN(VERR_INTNET_FLT_IF_NOT_FOUND」錯誤,那是NDIS6的一個已知問題,這時就需要卸載VirtualBox,然後用下面的命令重新安裝,

VirtualBox-5.0.11-104101-Win.exe -msiparams NETWORKTYPE=NDIS5

執行成功後,就會自動在VirtualBox創建3台Oracle Linux的虛擬機。 然後就可以用命令"vagrant ssh n1"登錄第一台虛擬機,同理"vagrant ssh n2"登錄第二台虛擬機,「vagrant ssh n3」登錄第三台虛擬機。

第二步:配置Linux環境

需要對三台虛擬機都執行下面的配置。注意用root用戶執行下面的命令。

2.1 關閉防火牆

因為kubernetes cluster會用到一些埠,一個個開放比較麻煩,所以乾脆直接關閉防火牆省事,畢竟這只是一個本地的測試環境。

systemctl stop firewalld

systemctl disable firewalld

2.2 禁用SELINUX

首先執行 "setenforce 0",然後打開/etc/selinux/config,將其中的配置項SELINUX的值設置成disabled。

2.3 配置iptables

iptables -P FORWARD ACCEPT

2.4 安裝常用工具

我這次用的Oracle Linux的image中,沒有ifconfig,netstat等命令,可以通過下面的命令安裝。

yum install -y net-tools

2.5 設置 Proxy

因為需要訪問網路,所以需要設置代理。建議寫一個簡單的腳本setProxy.sh,將上面的export命令寫入腳本中。然後每次登錄系統的時候執行一遍(或者加入到profile中),

export http_proxy="http://:80"

export https_proxy="http://:80"

export no_proxy="localhost,127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

export NO_PROXY="localhost,127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

2.6 修改hostname

直接修改/etc/hostname,然後對每台虛擬機設置不同的名字,比如vm1, vm2, vm3。

然後在每一台虛擬機的/etc/hosts中加入下面的內容,

192.168.77.10 vm1

192.168.77.11 vm2

192.168.77.12 vm3

最後重啟三台虛擬機。注意啟動時,直接 Headless模式啟動既可,也就是無界面模式。

第三步:安裝Docker

需要在每台虛擬機上都安裝Docker,所以在每台虛擬機上都要執行下列步驟。注意用root用戶執行下面的命令。

3.1 Enable ol7_latest, ul7_uekr4 and ol7_addons。具體方法就是將/etc/yum.repos.d/public-yum-ol7.repo中這三個標籤對應的enabled設置成1。更詳細的信息可以參考下面鏈接:

https://blogs.oracle.com/hlsu/install-docker-on-oracle-linux-7

3.2 安裝docker

執行下面的命令安裝即可。注意執行之前需要設置好代理。kubernetes的官方文檔推薦安裝docker 1.12,並說明1.11,1.13以及17.03都驗證過可以工作,對於17.06沒有驗證過。但我今天就驗證了17.06可以和kubernetes1.9.2一起正常工作。

yum install docker-engine

systemctl start docker

systemctl enable docker

3.3 給docker設置代理

因為docker需要訪問網路,所以也需要設置代理。設置在/etc/systemd/system/docker.service.d/http-proxy.conf裡面即可,參考下例,

[Service]

Environment="HTTP_PROXY=http://:80/" "NO_PROXY=localhost,

127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

Environment="HTTPS_PROXY=http://:80/" "NO_PROXY=localhost,

127.0.0.1,192.168.77.10,192.168.77.11,192.168.77.12"

3.4 設置docker的cgroup driver

$ cat /etc/docker/daemon.json{"exec-opts": ["native.cgroupdriver=cgroupfs"]}

最後執行下面的命令,

systemctl daemon-reload

systemctl restart docker

第四步:安裝kubelet,kubeadm和kubectl

同樣,需要在三台虛擬機上執行的步驟。注意用root用戶執行下面的命令。

4.1 配置kubernetes.repo,直接執行下面的命令,

cat

[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

4.2 安裝kubelet/kubeadm/kubectl

同樣執行下面的命令之前,需要保證代理已經配置好了。

yum install -y kubelet kubeadm kubectl

systemctl enable kubelet

4.3 配置 kubelet

對/etc/systemd/system/kubelet.service.d/10-kubeadm.conf做如下修改:

a) 將「--cgroup-driver=systemd」修改成"--cgroup-driver=cgroupfs";

b) 插入下面的一行到文件中,

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

c) 執行命令:

swapoff -a

systemctl daemon-reload

d) 繼續執行下面的命令:

cat

vm.swappiness=0

EOF

sysctl --system

第五步:安裝kubernetes cluster

終於到了最關鍵的步驟了,注意這一步只在master節點上操作。我選擇了vm1作為master。

5.1 首先切換到root用戶,然後設置好代理,然後執行下面的命令,

kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.77.10

"--pod-network-cidr=10.244.0.0/16"表示使用flannel pod network。這條命令可能會執行比較長時間,因為會下載apiserver,scheduler和controller的images。執行過程中,會輸出很多信息,如果執行成功,最後會輸出下面的關鍵信息:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

https://kubernetes.io/docs/concepts/cluster-administration/addons/

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

as root:

kubeadm join --token fd6a7c.cfb7a7a6044be2e0 192.168.77.10:6443 --discovery-token-ca-cert-hash sha256:7c3caf17275f77669f9140d5f0924038d705303e2d4584fd176d7315c509bae1

如果執行失敗,則執行"kubeadm reset",然後根據提示修改之後,重新執行"kubeadm init ..."。

5.2 配置kubectl

切換到普通用戶(vagrant),然後執行下面的命令,

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

這時在master上就可以查看所有的pod了,

kubectl get pods --all-namespaces

5.3 安裝POD Network

只要支持CNI(Container Network Interface)的Network都可以,但由於之前執行"kubeadm init..."的時候,指定了flannel,所以這裡直接安裝Flannel POD Network即可,

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

5.4 默認情況下,POD不會調度到master節點上。如果想在master上調度POD, 則執行下面的命令,

第六步:將其他節點加入cluster中

將vm2和vm3加入節點中,所以這一步的操作在vm2和vm3上執行。分別在vm2和vm3上執行下面的命令即可,也就是"kubeadm init ..."最後輸出的命令,

kubeadm join --token fd6a7c.cfb7a7a6044be2e0 192.168.77.10:6443 --discovery-token-ca-cert-hash sha256:7c3caf17275f77669f9140d5f0924038d705303e2d4584fd176d7315c509bae1

如果執行失敗,則執行下面的命令reset,注意下面的前兩條命令在master(vm1)上執行,第三條命令"kubeadm reset"在vm2/vm3上執行。根據錯誤提示修改之後,再重新執行上面的"kubeadm join..."命令.

kubectl drain vm2 --delete-local-data --force --ignore-daemonsets

kubectl delete node vm2

kubeadm reset

如果執行成功,那麼會在該節點上成功啟動一個kubelet進程以及一個kube-proxy的pod。到master節點上執行下面命令可以查看到新加入的節點:

kubectl get nodes

正常情況下,可以看到下面的輸出:

[vagrant@vm1 ~]$kubectl get nodes

NAME STATUS ROLES AGE VERSION

vm1 Ready master 14h v1.9.2

vm2 Ready 13h v1.9.2

vm3 Ready 13h v1.9.2

在master節點上也可以查看到目前所有的pod運行情況:

kubectl get pod --all-namespaces -o wide

可以看到下面的輸出,

[vagrant@vm1 ~]$ kubectl get pod --all-namespaces -o wide

NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE

kube-system etcd-vm1 1/1 Running 2 14h 192.168.77.10 vm1

kube-system kube-apiserver-vm1 1/1 Running 2 14h 192.168.77.10 vm1

kube-system kube-controller-manager-vm1 1/1 Running 2 14h 192.168.77.10 vm1

kube-system kube-flannel-ds-66nqv 1/1 Running 1 13h 192.168.77.11 vm2

kube-system kube-flannel-ds-n9bnf 1/1 Running 1 14h 192.168.77.10 vm1

kube-system kube-flannel-ds-r2tnr 1/1 Running 2 13h 192.168.77.12 vm3

kube-system kube-proxy-tjrcs 1/1 Running 2 13h 192.168.77.11 vm2

kube-system kube-proxy-ts6cf 1/1 Running 1 13h 192.168.77.12 vm3

kube-system kube-proxy-zg6mx 1/1 Running 2 14h 192.168.77.10 vm1

kube-system kube-scheduler-vm1 1/1 Running 2 14h 192.168.77.10 vm1

大功告成!然後就可以在kubernetes cluster中部署自己的應用了。如果有疑問,歡迎留言討論。

--END--


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

棉服也能穿得時尚又保暖?當!然!
詩欣瘋在運動 「拳」力以赴

TAG:全球大搜羅 |