1. 程式人生 > >Kubernetes基礎學習筆記--基於kubeadm的部署(避坑大全)

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 分割槽

[[email protected] ~]# setenforce 0
[[email protected] ~]# swapoff -a

5.在每臺節點上安裝docker,本文安裝的是1.13.1,同時不要忘了還要做一個映象加速,我這裡使用的是阿里雲的映象加速,具體設定方法這裡不詳細介紹,可以百度。

[[email protected] 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的時候都會得到錯誤的資訊,如下所示:

[[email protected] xkx]# kubectl get pods --all-namespaces
The connection to the server localhost:8080 was refused - did you specify the right host or port?

好了,我們執行完了以後,就可以通過如下命令來驗證是否初始化成功:

[[email protected] 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

外掛安裝完成後可以看到所有的容器都啟動了:

[[email protected] ~]# 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節點中有需要的映象:

[[email protected] 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

相關推薦

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

  今天來通過kubeadm在虛擬機器環境部署一套kubernetes,1臺master節點,3臺node節點。本文的部署步驟是根據kubernetes官網的Using kubeadm to Create a Cluster來進行的,有興趣的讀者可以參考,連結為:https:

python程式設計:從入門到實踐學習筆記-基於Django框架的Web開發-設計樣式和部署(二)

部署學習筆記 接下來我們將使用Heroku(基於Web的平臺)管理Web應用程式的部署。 建立Heroku賬戶 訪問https://signup.heroku.com註冊一個帳號。 安裝Heroku Toolbelt 安裝Heroku Toolbelt,對部署到He

python基礎學習筆記

好的 留下 path false 找到 __name__ ems 單詞 ups 1 #!/usr/bin/env python 2 #coding=utf-8 3 4 def login(username): 5 if username==‘

MySql 基礎學習筆記 1——概述與基本數據類型: 整型: 1)TINYINT 2)SMALLINT 3) MEDIUMINT 4)INT 5)BIGINT 主要是大小的差別 圖 浮點型:命令

where float 函數名 src ron 編碼方式 永遠 -m mas 一、CMD中經常使用mysql相關命令 mysql -D, --database=name //打開數據庫 --delimiter=name //指定分隔符 -h, --host=na

RabbitMQ基礎學習筆記(C#代碼示例)

esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信

Java基礎學習筆記八 Java基礎語法之接口和多態

java cas 發現 過程 類類型 結果 覆寫 實例 new 接口 接口概念 接口是功能的集合,同樣可看做是一種數據類型,是比抽象類更為抽象的”類”。接口只描述所應該具備的方法,並沒有具體實現,具體的實現由接口的實現類(相當於接口的子類)來完成

Java基礎學習筆記二十二 網絡編程

數據丟失 交互圖 主動 總結 交互 servers -- 處理 關閉 絡通信協議 通過計算機網絡可以使多臺計算機實現連接,位於同一個網絡中的計算機在進行連接和通信時需要遵守一定的規則,這就好比在道路中行駛的汽車一定要遵守交通規則一樣。在計算機網絡中,這些連接和通信的規則被

Java基礎學習筆記二十三 Java核心語法之反射

負責 目錄 boolean tostring 筆記 str 編譯 三種 進制 類加載器 類的加載 當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,鏈接,初始化三步來實現對這個類進行初始化。 加載就是指將class文件讀入內存,並為之創建一個Clas

Java基礎學習筆記十六 集合框架(二)

first 哈希 cat etag 基於 col 容器 處的 新元素 List List接口的特點: 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麽集合中,元素的存儲就是按照11、22、33的順序完成的。 它是一個帶有索引的集合,通過索引就

Java基礎學習筆記二十四 MySQL安裝圖解

password data 默認 count 重新 doc documents tran xp系統 、MYSQL的安裝 1、打開下載的mysql安裝文件mysql-5.5.27-win32.zip,雙擊解壓縮,運行“setup.exe”。

Java基礎學習筆記二十七 DBUtils和連接池

ride 基本 代碼塊 ear 不同 一行 ria 靜態方法 ... DBUtils 如果只使用JDBC進行開發,我們會發現冗余代碼過多,為了簡化JDBC開發,本案例我們講采用apache commons組件一個成員:DBUtils。DBUtils就是JDBC的簡化開發工

Java基礎學習筆記

body -1 ride java基礎學習 功能 根據 title 過濾 ret File 的高級獲取功能 String[] list() 返回一個字符串數組,這些字符串指定此抽象路徑名表示的目錄中的文件和目錄 示例

docker基礎學習筆記

分享 http upd mar raid templates ubunt 數據信息 rfi docke image 概述 docke image 概述基礎鏡像列出本地鏡像創建鏡像修改已有鏡像利用Dockerfile來創建鏡像從本地文件系統導入上傳鏡像存出和載入鏡像移除

Docker學習筆記——私有倉庫部署

docker registry https1、系統環境:CentOS 7.3 172.16.0.44 registry 已安裝docker 172.16.0.45 client 已安裝docker2、未加密倉庫部署 下載registry鏡像 docker pull registry

Java語言基礎學習筆記(七)

day tez lec mdk abd err .com mar mdm 烈7A茨諳9m繁5暗MChttp://www.zcool.com.cn/collection/ZMTg3NzE1Njg=.html 3馗iC蓖17握WM啦http://www.zcool.com.cn

node+webpack環境搭建 vue.js 2.0 基礎學習筆記

build tao 2.0 png 模板 gis mage tps 環境 npm install -g vue //全局安裝vue npm install -g webpack //全局安裝webpack npm install -g vue-cli

Linux運維之道之網絡基礎學習筆記1.1

達內 linux雲計算運維 網絡基礎1.1TCP/IP詳細解讀:TCP/IP協議簡介:TCP/IP是最廣泛支持的通信協議集合---包括大量internet應用中的標準協議;---支持跨網絡架構,跨操作系統平臺的通信;主機與主機之間通信的三個要素:---IP地址;---子網掩碼;---IP路由;IP地址

達內 10.24-25linux基礎學習筆記

linux初級學習linux系統簡單認識: windows系統是我們常見的系統,它采用的是圖形化的操作界面,簡單來說就是用鼠標點點點, 進行操作; linux系統使用的是命令行操作模式,需要輸入命令才能夠運行程序。而且linux系統是一個開源的系統,bug來說相較於windows系統要少很多,所以

達內 10.31linux基礎學習筆記

linux初級命令學習####################################################################################### ----- 硬盤分區及格式化及掛載 識別硬盤 => 分區規劃 => 格式化 =>

一篇文章帶你入門Linux——馬哥Linux基礎學習筆記

更改密碼 自帶 ctime 詳細信息 內嵌 桌面環境 地址定界 格式符 p s 1.課程體系: 中級: 初級:系統基礎 中級:系統管理、服務安全及服務管理、Shell腳本; 高級: MySQL數據庫; cache & stor