最近在學習k8s,一直在線上學習。決定自己搭建一個在自己本地跑的k8s環境。爲了檢驗自己在學習成果之外,更是讓自己學了會用起來。
部署軟件版本
Docker: `docker-ce 18.06`
Kubernetes: `k8s 1.13.1
必要條件
1.準備三臺ubuntu虛擬機(要是有三臺主機的請忽略這一點),在本地搭建環境的化,推薦安裝server版的沒有Desktop,節省資源。可以k8s集羣跑起來不太卡。
2.推薦安裝xshell, xftp。這中遠程控制linux的軟件。在配置集羣的時候方便管理虛擬機。
3. 推薦虛擬機跑在vmware 上。不太推薦VirtualBox.畢竟收費更好用一點。(手動滑稽)。
4. 最好做一步,就來一個快照,方便做錯,之後回覆。
附上 用xshell管理虛擬機的照片,比單個虛擬機之間來回切換好多了。
左邊的是master 節點的終端 右邊的是兩個子節點的終端
基本配置
安裝Ubuntu
這種教程網上一大堆,可以自己去百度一下啊,或者谷歌一下。不過,記得安裝的時候把ssh安裝上,要是沒有安裝上,請看我的另一篇,如何在Ubuntu上安裝並配置ssh
配置Ubuntu
修改主機名
1. 用root用戶登錄
2. 打開配置文件 /etc/cletc/cloud/cloud.cfg (每個發行版的配置文件不同,請按照自己的版本,找自己的配置文件)
3. 修改配置 perserve_hostname: true
4. 重啓 讓配置文件生效
配置IP(NAT模式)
動態獲取
1.用root用戶登錄
2.在/etc//編寫自己的網絡配置文件 我的配置文件是 /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
dhcp4: false
version: 2
3. 使配置文件生效 ,並重啓
netplan apply
shutdown -r now
靜態IP(永久有效)
過程和動態的一樣,只不過配置文件不一樣
network:
ethernets:
ens33:
addresses: [192.168.80.144/24]
dhcp4: false
gateway4: 192.168.80.131
nameservers:
addresses: [192.168.80.131]
optional: true
version: 2
靜態的需要 指明ip地址 和其他網絡配置 新手推薦動態獲取
修改Hosts
這一步 是爲了讓主機通過別名找到集羣中的別的主機
編輯 /etc/hosts
把集羣的主機ip 和別名 按照下面格式寫下來
192.168.80.144 master
重啓 讓配置生效
docker 安裝
推薦看我的另一篇 安裝docker
k8s安裝及部署
之前這些工作做完之後,可以開始搭建k8s了,一下不具體指明的操作都是三個節點都需要執行了。
我集羣主機分配具體如下:
192.168.80.144 master
192.168.80.145 node1
192.168.80.146 node2
k8s安裝
配置並安裝k8s國內源
-
創建配置文件
sudo touch /etc/apt/sources.list.d/kubernetes.list
-
添加寫權限
zxt@master:~$ sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list
再添加,內容如下:
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
-
執行
sudo apt update
更新操作系統源,開始會遇見如下錯誤zxt@master:~$ sudo apt update Get:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B] Err:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease Err:6 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease Could not wait for server fd - select (11: Resource temporarily unavailable) [IP: 202.141.176.110 443] Reading package lists... Done W: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB E: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed. N: Updating from such a repository can't be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details.
其中:
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
簽名認證失敗,需要重新生成。記住上面的NO_PUBKEY
6A030B21BA07F4FB
-
添加認證key
運行如下命令,添加錯誤中對應的key(錯誤中NO_PUBKEY後面的key的後8位)
gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB
接着運行如下命令,確認看到OK,說明成功,之後進行安裝:
gpg --export --armor BA07F4FB | sudo apt-key add -
-
再次重新
sudo apt update
更新系統下載源數據列表
zxt@master:~$ sudo apt update
Hit:1 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease
Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease
Get:6 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
Ign:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages
Get:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages [26.6 kB]
Fetched 26.6 kB in 42s (635 B/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
165 packages can be upgraded. Run 'apt list --upgradable' to see them.
以上沒有報和錯誤異常,表示成功。
禁止基礎設施
-
禁止防火牆
$ sudo ufw disable Firewall stopped and disabled on system startup
-
關閉swap
# 成功 $ sudo swapoff -a # 永久關閉swap分區 $ sudo sed -i 's/.*swap.*/#&/' /etc/fstab
-
禁止selinux
# 安裝操控selinux的命令
$ sudo apt install -y selinux-utils
# 禁止selinux
$ setenforce 0
# 重啓操作系統
$ shutdown -r now
# 查看selinux是否已經關閉
$ sudo getenforce
Disabled(表示已經關閉)
k8s系統網絡配置
(1) 配置內核參數,將橋接的IPv4流量傳遞到iptables的鏈
創建/etc/sysctl.d/k8s.conf
文件
添加內容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
(2) 執行命令使修改生效
# 【候選】建議執行下面的命令
$ sudo modprobe br_netfilter
$ sudo sysctl -p /etc/sysctl.d/k8s.conf
安裝k8s
注意: 切換到root用戶
$ su
-
安裝Kubernetes 目前安裝版本
v1.13.1
$ apt update && apt-get install -y kubelet=1.13.1-00 kubernetes-cni=0.6.0-00 kubeadm=1.13.1-00 kubectl=1.13.1-00
-
設置爲開機重啓
$ sudo systemctl enable kubelet && systemctl start kubelet $ sudo shutdown -r now
驗證k8s
-
使用root用戶登錄
Master
主機 -
執行如下個命令
kubectl get nodes
輸出如下
$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
-
查看當前k8s版本
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
節點的配置
把每個節點的主機名字改成集羣中的名字,ip地址可以選擇動態獲取,也可以寫全部改成金泰的
1. 使用root用戶登錄
2. 打開配置文件`vim /etc/cloud/cloud.cfg`
3. 修改配置`preserve_hostname: true`
修改hosts文件
使用root用戶登錄
1. 打開hosts文件 `vim /etc/hosts`
2. 輸入如下內容
```shell
192.168.80.144 master
192.168.80.145 node1
192.168.80.146 node2
3. 重啓機器`shutdown -r now`
配置master節點
創建工作目錄`
`$ mkdir /home/zxt/working
$ cd /home/zxt/working/
創建kubeadm.conf配置文件
- 創建k8s的管理工具
kubeadm
對應的配置文件,候選操作在home/zxt/working/
目錄下
使用kubeadm配置文件,通過在配置文件中指定docker倉庫地址,便於內網快速部署。
生成配置文件
kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
- 修改
kubeadm.conf
中的如下兩項:
- imageRepository
- kubernetesVersion
vi kubeadm.conf
# 修改 imageRepository: k8s.gcr.io
# 改爲 registry.cn-beijing.aliyuncs.com/imcto
imageRepository: registry.cn-beijing.aliyuncs.com/imcto
# 修改kubernetes版本kubernetesVersion: v1.13.0
# 改爲kubernetesVersion: v1.13.1
kubernetesVersion: v1.13.1
- 修改
kubeadm.conf
中的API服務器地址,後面會頻繁使用這個地址。
- localAPIEndpoint:
localAPIEndpoint:
advertiseAddress: 192.168.80.144
bindPort: 6443
注意:
192.168.236.177
是master主機的ip地址
- 配置子網網絡
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
這裏的10.244.0.0/16
和 10.96.0.0/12
分別是k8s內部pods和services的子網網絡,最好使用這個地址,後續flannel網絡需要用到。
拉去K8S必須的鏡像
- 查看一下都需要哪些鏡像文件需要拉取
$ kubeadm config images list --config kubeadm.conf
registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/pause:3.1
registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24
registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6
- 拉取鏡像
#下載全部當前版本的k8s所關聯的鏡像
kubeadm config images pull --config ./kubeadm.conf
5.3.4 初始化kubernetes環境
#初始化並且啓動
$ sudo kubeadm init --config ./kubeadm.conf
更多kubeadm配置文件參數詳見
kubeadm config print-defaults
k8s啓動成功輸出內容較多,但是記住末尾的內容
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.80.144:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8
按照官方提示,執行以下操作。
-
執行如下命令
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
創建系統服務並啓動
# 啓動kubelet 設置爲開機自啓動
$ sudo systemctl enable kubelet
# 啓動k8s服務程序
$ sudo systemctl start kubelet
驗證kubernetes啓動結果
- 驗證輸入,注意顯示master狀態是
NotReady
,證明初始化服務器成功
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 12m v1.13.1
- 查看當前k8s集羣狀態
$ kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
目前只有一個master,還沒有node,而且是NotReady狀態,那麼我們需要將node加入到master管理的集羣中來。在加入之前,我們需要先配置k8s集羣的內部通信網絡,這裏採用的是flannel網絡。
部署flannel網絡
$cd /home/zxt/working
$wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
編輯這個文件,確保flannel網絡是對的,找到net-conf.json
標記的內容是否正確。
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
這個"10.244.0.0/16"和 ./kubeadm.conf中的podsubnet的地址要一致。
應用當前flannel配置文件
itcast@master:~/working$ kubectl apply -f kube-flannel.yml
輸出結果如下
root@master:~/working# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
配置Node
確認外部環境
-
確認關閉swap
apt install -y selinux-utils swapoff -a
-
禁止selinux
setenforce 0
-
確認關閉防火牆
ufw disable
配置k8s集羣的Node主機環境
-
啓動k8s後臺服務
# 啓動kubelet 設置爲開機自啓動 $ sudo systemctl enable kubelet # 啓動k8s服務程序 $ sudo systemctl start kubelet
-
將master機器的
/etc/kubernetes/admin.conf
傳到到node1和node2登錄
master
終端#將admin.conf傳遞給node1 sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/ #將admin.conf傳遞給node2 sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/
-
登錄
node1
終端,創建基礎kube配置文件環境
$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 登錄
node2
終端,創建基礎kube配置文件環境
$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
node1
和node2
分別連接master
加入master集羣。這裏用的是kubeadm join
指令
$ sudo kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8
這裏要注意,使用的hash應該是master
主機 kubeadm init
成功之後生成的hash碼。
- 應用兩個node主機分別應用flannel網絡
將master
中的kube-flannel.yml
分別傳遞給兩個node
節點.
#將kube-flannel.yml傳遞給node1
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/
#將kube-flannel.yml傳遞給node2
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/
分別啓動flannel
網絡
zxt@node1:~$ kubectl apply -f kube-flannel.yml
zxt@node2:~$ kubectl apply -f kube-flannel.yml
- 查看node是否已經加入到k8s集羣中(需要等一段時間才能ready)
zxt@node2:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 35m v1.13.1
node1 Ready <none> 2m23s v1.13.1
node2 Ready <none> 40s v1.13.1
這樣k8s就搭建起來了。