官方安裝文檔可以參考 https://kubernetes.io/docs/setup/independent/install-kubeadm/.
使用Kubespray在ubuntu上自動部署K8s1.9.0集群:http://www.cnblogs.com/DaweiJ/p/8462848.html
CloudMan的blog:http://www.cnblogs.com/CloudMan6/p/8269620.html
使用kubespary自動部署概要步驟:
若可FQ翻牆,可直接下載gcr.io/google_containers/相關鏡像25個。
不翻牆部署步驟詳見:http://www.cnblogs.com/DaweiJ/p/8462848.html
概要如下
1、安裝最新ansible
2、下載kubespary
3、安裝docker及其他依賴包
4、下載鏡像
5、修改ansible相關配置,inventory文件
6、安裝
ansible-playbook -i inventory/inventory.cfg cluster.yml
7、troubles shooting
8、集群擴展
一般部署概要步驟:
一、Master安裝
1、安裝 Docker
所有節點都需要安裝 Docker。
apt-get update && apt-get install docker.io
2、安裝 kubelet、kubeadm 和 kubectl
在所有節點上安裝 kubelet、kubeadm 和 kubectl。
kubelet 運行在 Cluster 所有節點上,負責啟動 Pod 和容器。
kubeadm 用於初始化 Cluster。
kubectl 是 Kubernetes 命令行工具。通過 kubectl 可以部署和管理應用,查看各種資源,創建、刪除和更新各種組件。
apt-get update && apt-get install -y apt-transport-httpscurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -cat <<EOF >/etc/apt/sources.list.d/kubernetes.listdeb http://apt.kubernetes.io/ kubernetes-xenial mainEOFapt-get updateapt-get install -y kubelet kubeadm kubectl
用 kubeadm 創建 Cluster
完整的官方文檔可以參考 https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
初始化 Master
在 Master 上執行如下命令:
kubeadm init --apiserver-advertise-address 192.168.56.105 --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。在后面的實踐中我們會切換到其他網絡方案,比如 Canal。
初始化過程簡要如下:
① kubeadm 執行初始化前的檢查。
② 生成 token 和證書。
③ 生成 KubeConfig 文件,kubelet 需要這個文件與 Master 通信。
④ 安裝 Master 組件,會從 goolge 的 Registry 下載組件的 Docker 鏡像,這一步可能會花一些時間,主要取決於網絡質量。
⑤ 安裝附加組件 kube-proxy 和 kube-dns。
⑥ Kubernetes Master 初始化成功。
⑦ 提示如何配置 kubectl,后面會實踐。
⑧ 提示如何安裝 Pod 網絡,后面會實踐。
⑨ 提示如何注冊其他節點到 Cluster,后面會實踐。
配置 kubectl
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我們已經在所有的節點安裝了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
依照 kubeadm init
輸出的第 ⑦ 步提示,推薦用 Linux 普通用戶執行 kubectl(root 會有一些問題)。
我們為 daweij 用戶配置 kubectl: ubuntu用戶默認不創建HOME,參考:http://www.cnblogs.com/DaweiJ/p/8522092.html
useradd -r -m -s /bin/bash daweij
passwd daweij
chmod 770 /etc/sudoers
vim /etc/sudoers
然后添加:
daweij ALL=(ALL:ALL) ALL
chmod 440 /etc/sudoers
su - daweij mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
為了使用更便捷,啟用 kubectl 命令的自動補全功能。
echo "source <(kubectl completion bash)" >> ~/.bashrc
這樣 ubuntu 用戶就可以使用 kubectl 了。
安裝 Pod 網絡
要讓 Kubernetes Cluster 能夠工作,必須安裝 Pod 網絡,否則 Pod 之間無法通信。
Kubernetes 支持多種網絡方案,這里我們先使用 flannel,后面還會討論 Canal。
執行如下命令部署 flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
二、Node安裝
添加 k8s-node1 和 k8s-node2
在 k8s-node1 和 k8s-node2 上分別執行如下命令,將其注冊到 Cluster 中:
kubeadm join --token d38a01.13653e584ccc1980 192.168.56.105:6443
這里的 --token
來自前面 kubeadm init
輸出的第 ⑨ 步提示,如果當時沒有記錄下來可以通過 kubeadm token list
查看。
根據提示,我們可以通過 kubectl get nodes
查看節點的狀態。
kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 33d v1.9.0+coreos.0 node1 Ready node 33d v1.9.0+coreos.0 node2 Ready node 33d v1.9.0+coreos.0 node3 Ready node 33d v1.9.0+coreos.0 node4 Ready master,node 33d v1.9.0+coreos.0
目前所有節點都是 NotReady
,這是因為每個節點都需要啟動若干組件,這些組件都是在 Pod 中運行,需要首先從 google 下載鏡像,我們可以通過如下命令查看 Pod 的狀態:
kubectl get pod --all-namespaces
root@master:~/kubespray# kubectl get pod --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE default kubernetes-bootcamp-5d7f968ccb-c57nw 1/1 Running 0 2h default kubernetes-bootcamp-5d7f968ccb-lv24f 1/1 Running 0 2h kube-system calico-node-4gm72 1/1 Running 52 33d kube-system calico-node-8fkfk 1/1 Running 0 33d kube-system calico-node-fqdwj 1/1 Running 53 33d kube-system calico-node-lpdtx 1/1 Running 47 33d kube-system calico-node-nq8l2 1/1 Running 42 33d kube-system kube-apiserver-master 1/1 Running 0 33d kube-system kube-apiserver-node4 1/1 Running 224 18d kube-system kube-controller-manager-master 1/1 Running 0 33d kube-system kube-controller-manager-node4 1/1 Running 5 18d kube-system kube-dns-79d99cdcd5-6vvrw 3/3 Running 0 18d kube-system kube-dns-79d99cdcd5-rkpf2 3/3 Running 0 18d kube-system kube-proxy-master 1/1 Running 0 33d kube-system kube-proxy-node1 1/1 Running 0 32d kube-system kube-proxy-node2 1/1 Running 0 18d kube-system kube-proxy-node3 1/1 Running 0 32d kube-system kube-proxy-node4 1/1 Running 0 18d kube-system kube-scheduler-master 1/1 Running 0 33d kube-system kube-scheduler-node4 1/1 Running 3 18d kube-system kubedns-autoscaler-5564b5585f-7z62x 1/1 Running 0 18d kube-system kubernetes-dashboard-6bbb86ffc4-zmmc2 1/1 Running 0 18d kube-system nginx-proxy-node1 1/1 Running 0 32d kube-system nginx-proxy-node2 1/1 Running 0 18d kube-system nginx-proxy-node3 1/1 Running 0 32d
Pending
、ContainerCreating
、ImagePullBackOff
都表明 Pod 沒有就緒,Running
才是就緒狀態。我們可以通過 kubectl describe pod <Pod Name>
查看 Pod 具體情況,比如:
kubectl describe pod calico-node-4gm72 --namespace=kube-system
所有的節點都已經 Ready后
,Kubernetes Cluster 創建成功,一切准備就緒。