今天來通過kubeadm在虛擬機環境部署一套kubernetes,1臺master節點,3臺node節點。本文的部署步驟是根據kubernetes官網的Using kubeadm to Create a Cluster來進行的,有興趣的讀者可以參考,鏈接爲:
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
好了,廢話不多說,開始部署:
一.通過 VirtualBox 準備四臺虛擬機,一臺master節點和三臺node節點,都安裝centos7的操作系統,並且這次部署k8s 1.10.3版本,列表如下:master 192.168.58.3
node1 192.168.58.4
node2 192.168.58.5
node3 192.168.58.6
首先咱們要做的是一些準備工作,包括如下工作:
1.4臺節點的時鐘同步(如果節點之間時鐘不一致,會導致節點在加入集羣的時候失敗),這裏就不詳細介紹如何配置時鐘同步了,需要了解的朋友自己百度啊。
2.更換默認的yum源(你肯定不想一直等待在電腦面前看着慢吞吞的下載安裝進度條吧),這裏使用阿里雲的yum源,kubernetes也同樣使用阿里雲的yum安裝源,這裏貼一下kubernetes的安裝源:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
3.修改hostname,配置host文件,設置master節點hostname爲master,其餘節點分別爲:node1-node3
4.關閉selinux,防火牆,設置不使用swap 分區
[root@localhost ~]# setenforce 0
[root@localhost ~]# swapoff -a
5.在每臺節點上安裝docker,本文安裝的是1.13.1,同時不要忘了還要做一個鏡像加速,我這裏使用的是阿里雲的鏡像加速,具體設置方法這裏不詳細介紹,可以百度。
[root@master yum.repos.d]# docker -v
Docker version 1.13.1, build 94f4240/1.13.1
如果上面你的準備工作你都做好了,咱們就繼續吧
二.在每個節點上安裝kubelet,kubeadm和kubectl,kubectl會在安裝kubeadm的時候被安裝上
yum install kubelet
yum install kubeadm
安裝完成kubelet後,記得通過systemctl enable kubelet,不然後面kubeadm init的時候,不能過通過check
此時如果通過 systemctl start kubelet的話,會發現kubelet無法啓動,那是因爲目前還沒有初始化kubernetes集羣以及安裝網絡插件。
爲什麼master節點也需要安裝kubelet呢?因爲kubeadm會以容器的方式安裝master節點需要的服務,如apiserver,etcd
三.接下來就是執行kubeadm init了,但是這裏因爲國內網絡的原因,我們無法到kubeadm制定的鏡像源獲取到啓動服務需要的鏡像,那麼怎麼跨過這個坑呢,有兩個辦法,第一個是VPN,第二個是國內的鏡像倉庫找到需要的鏡像,通過docker pull的方式拉到本地,然後通過docker tag的方式修改鏡像的標籤,來符合kubeadm要求的鏡像,所需要哪些鏡像呢,我們通過官網可以茶看到:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
Image Name v1.8 release branch version v1.9 release branch version
k8s.gcr.io/kube-apiserver-${ARCH} v1.8.x v1.9.x
k8s.gcr.io/kube-controller-manager-${ARCH} v1.8.x v1.9.x
k8s.gcr.io/kube-scheduler-${ARCH} v1.8.x v1.9.x
k8s.gcr.io/kube-proxy-${ARCH} v1.8.x v1.9.x
k8s.gcr.io/etcd-${ARCH} 3.0.17 3.1.10
k8s.gcr.io/pause-${ARCH} 3.0 3.0
k8s.gcr.io/k8s-dns-sidecar-${ARCH} 1.14.5 1.14.7
k8s.gcr.io/k8s-dns-kube-dns-${ARCH} 1.14.5 1.14.7
k8s.gcr.io/k8s-dns-dnsmasq-nanny-${ARCH} 1.14.5 1.14.7
registry.cn-hangzhou.aliyuncs.com
拉完鏡像後,別忘了將node節點需要的鏡像(proxy,pause)也tar到node節點上,並通過docker load加載到本地鏡像倉庫。
四.通過kubeadm init命令初始化master
在啓動下面之前先要設置sysctl net.bridge.bridge-nf-call-iptables=1,不然check也會報錯
kubeadm init --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.58.3 --kubernetes-version v1.10.3
這裏--pod-network-cidr表示k8s中pod使用的網絡段,--apiserver-advertise-address表示k8s apiserver的地址使用master的192.168.58.3,最後的參數自然是版本,這裏筆者建議將版本參數帶上,因爲k8s版本變化頻繁。
如果你準備了上面的鏡像的話,很快就會看到master已經初始化成功,同時會得到以下信息:
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 192.168.58.3:6443 --token uqvgpg.c3nnv8zqykj8eiii --discovery-token-ca-cert-hash sha256:342c9fc86f7b2fd4f90b4e0bca9857d44c2c0a3848238d662084dab8f288b68b
好了,這代表master已經初始化成功了,並提示你通過在node節點上執行最後一條命令能夠把node節點加入到集羣當中。接下來需要在master節點執行命令:
export KUBECONFIG=/etc/kubernetes/admin.conf
如果沒有執行,接下來使用kubectl的時候都會得到錯誤的信息,如下所示:
[root@master-calico xkx]# kubectl get pods --all-namespaces
The connection to the server localhost:8080 was refused - did you specify the right host or port?
好了,我們執行完了以後,就可以通過如下命令來驗證是否初始化成功:
[root@master-calico xkx]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-master-calico 1/1 Running 0 8m
kube-system kube-apiserver-master-calico 1/1 Running 0 8m
kube-system kube-controller-manager-master-calico 1/1 Running 0 8m
kube-system kube-dns-86f4d74b45-bzxw2 0/3 Pending 0 9m
kube-system kube-proxy-csxb7 1/1 Running 0 9m
kube-system kube-scheduler-master-calico 1/1 Running 0 8m
可以看到所有的容器都處於Running狀態,除了kube-dns-86f4d74b45-bzxw2處於Pending,不用擔心,那是因爲還沒有安裝k8s的網絡插件。
五.k8s網絡插件安裝和選擇
k8s提供了豐富的第三方的網絡插件,有Flannel,Calico等,這些網絡插件的細節會在後面的文章進行探索,安裝者應該根據具體場景進行選擇,這裏我們使用Calico。
通過執行以下命令,能夠使得k8s下載Calico的相關容器並啓動容器(注意:這裏網絡也可能是個問題,可以通過kubectl describe查看下正在下載的鏡像版本,來通過阿里雲進行拉去)
當然如果要指定版本的話,還是需要把yaml文件下載到本地。
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
插件安裝完成後可以看到所有的容器都啓動了:
[root@master-calico ~]# kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-mf7qk 2/2 Running 0 1m
kube-system etcd-master-calico 1/1 Running 0 2m
kube-system kube-apiserver-master-calico 1/1 Running 0 2m
kube-system kube-controller-manager-master-calico 1/1 Running 0 2m
kube-system kube-dns-86f4d74b45-jn5lp 3/3 Running 0 3m
kube-system kube-proxy-p852h 1/1 Running 0 3m
kube-system kube-scheduler-master-calico 1/1 Running 0 2m
六.將node節點加入到集羣中
在加入節點之前請確保node節點中有需要的鏡像:
[root@node1-calico xkx]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
quay.io/calico/node v3.1.3 7eca10056c8e 6 days ago 248 MB
quay.io/calico/cni v3.1.3 9f355e076ea7 6 days ago 68.8 MB
k8s.gcr.io/kube-proxy-amd64 v1.10.3 4261d315109d 2 weeks ago 97.1 MB
k8s.gcr.io/pause-amd64 3.1 da86e6ba6ca1 5 months ago 742 kB
gcr.io/google_containers/pause-amd64 3.0 99e59f495ffa 2 years ago 747 kB
執行命令:
kubeadm join 192.168.58.3:6443 --token hcl4ve.hg1d94r2efvps2jk --discovery-token-ca-cert-hash sha256:e58a49956896f7fcfb54bc225ea0df5cc9ba3bb52ffd6bfb0a5d3998f7c636a4
執行完成後得到結果:
[preflight] Running pre-flight checks.
[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[WARNING FileExisting-crictl]: crictl not found in system path
Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
[preflight] Starting the kubelet service
[discovery] Trying to connect to API Server "192.168.58.3:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.58.3:6443"
[discovery] Requesting info from "https://192.168.58.3:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.58.3:6443"
[discovery] Successfully established connection with API Server "192.168.58.3:6443"
This node has joined the cluster:
* Certificate signing request was sent to master and a response
was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the cluster.
通過在master上執行kubectl get nodes可以看到節點已經成功的加入的集羣了:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-calico Ready master 12m v1.10.3
node1-calico Ready <none> 3m v1.10.3
node2-calico Ready <none> 16s v1.10.3
node3-calico Ready <none> 13s v1.10.3
至此,通過kubeadm安裝k8s集羣完畢
八.總結
本文詳細介紹了通過kubeadm來部署一個簡單的k8s集羣,集羣只有一個master和3個node節點,這種部署方式應該只適用於測試環境,這種方式部署存在幾個問題需要進一步思考:
1.Master節點上的k8s系統服務,都是通過容器提供的,在Master節點重啓後,容器也會消亡,這時候就需要重新初始化集羣,在生產環境是否還是按照這種方式部署,只是master節點部署多臺。
2.etcd服務與master部署在一起,實際生產環境應該是分離的。
3.還未配置dashboard,來通過界面的方式管理k8s