Kubernetes基礎學習筆記--基於kubeadm的部署(避坑大全)

  今天來通過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
本文選擇的是第一種方式,沒有VPN的朋友可以通過阿里雲的鏡像倉庫進行拉取,阿里雲的鏡像倉庫是:
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章