從零搭建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:全球大搜羅 |