環境規划
集群類型
一主多從
一台master節點和多台node節點,搭建簡單,但是有單機故障風險,適合用於測試環境
多主多從
多台master節點和多台node節點,搭建麻煩,安全性高,適合用於生產環境

為了測試簡單,本次搭建的是一主兩從類型的集群
安裝方式
k8s有多種部署方式,目前主流的方式有kubeadm、minikube、二進制包
- minikube:一個用於快速搭建單節點的k8s的工具
- kubeadm:一個用於快速搭建k8s集群的工具
- 二進制包:從官網下載的每個組件的二進制包,依次去安裝,此方式對於理解k8s組件更加有效
現在需要安裝k8s集群環境,但又不想過於麻煩,所以選擇使用kubeadm的方式
環境搭建
准備三台centos虛擬機,分別命名為master node1 node2

虛擬機安裝步驟自行百度,注意虛擬機配置至少2核2g內存,不然無法使用k8s集群
使用xshell連接三台虛擬機

配置xshell同時向三台虛擬機輸入命令

改變xshell布局為瓷磚排列

這樣我們就能同時向三台虛擬機發送命令,同時觀察三台虛擬機的狀態了
環境初始化
檢查centos版本
使用k8s集群要求centos版本在7.5及以上,在xshell中輸入
[root@master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
顯示centos版本為7.9,符合要求
主機名解析
配置三台虛擬機的主機名到ip地址的映射
[root@master ~]# vim /etc/hosts
#在里面添加
你的master虛擬機的ip地址 master
你的node1虛擬機的IP地址 node1
你的node2虛擬機的ip地址 node2
ping主機名查看是否能成功連通
[root@master ~]# ping master [root@master ~]# ping node1 [root@master ~]# ping node2
如果都能ping通證明沒有問題
開啟時間同步
kubernetes要求集群中的節點時間必須精確一致,這里直接使用chronyd服務從網絡同步時間
啟動chronyd服務
[root@master ~]# systemctl start chronyd
設置chronyd服務開機自啟
[root@master ~]# systemctl enable chronyd
使用date驗證時間
[root@master ~]# date 2021年 06月 30日 星期三 09:51:14 CST
禁用iptables和firewalld服務
注意:這只是開發學習中使用,生產環境中慎重關閉
k8s和docker在運行過程中會產生大量的iptables規則,為了不讓系統規則跟它們混淆,直接關閉系統的規則
#關閉防火牆 [root@master ~]# systemctl stop firewalld #設置開機自動關閉防火牆 [root@master ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. #關閉iptables服務 [root@master ~]# systemctl stop iptables Failed to stop iptables.service: Unit iptables.service not loaded.
禁用selinux
selinux是linux系統下的一個安全服務,如果不關閉它,在安裝集群中會產生各種各樣的奇葩問題
[root@master ~]# vim /etc/selinux/config
#將里面的SELINUX改為disabled
SELINUX=disabled
禁用swap分區
swap分區指的是虛擬內存分區,它的作用是在物理內存使用完之后,將磁盤空間虛擬成內存來使用
啟用swap設備會對系統的性能產生非常負面的影響,因此k8s要求每個節點都要禁用swap設備
但是如果因為某些原因確實不能關閉swap分區,就需要在集群安裝過程中通過明確的參數進行配置說明
[root@master ~]# vim /etc/fstab
#將swap一行進行注釋
#/dev/mapper/centos-swap swap
修改linux的內核參數
修改Linux的內核參數,添加網橋過濾和地址轉發功能
[root@master ~]# vim /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
重新加載配置
[root@master ~]# sysctl -p #加載網橋過濾模塊 [root@master ~]# modprobe br_netfilter #查看網橋過濾模塊是否加載成功 [root@master ~]# lsmod |grep br_netfilter br_netfilter 22256 0 bridge 151336 1 br_netfilter
配置ipvs功能
在k8s中service有兩種代理模型,一種是基於iptables的,一種是基於ipvs的
兩者比較的話,ipvs的性能明顯要高一些,但是如果要使用它的話,需要手動載入ipvs模塊
安裝ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
添加需要加載的模塊寫入腳本文件
[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules > #!/bin/bash > modprobe -- ip_vs > modprobe -- ip_vs_rr > modprobe -- ip_vs_wrr > modprobe -- ip_vs_sh > modprobe -- nf_conntrack_ipv4 > EOF
為腳本文件添加權限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
#執行腳本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
查看對應的模塊是否加載成功
[root@master ~]# lsmod |grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
重啟服務器
上述步驟完成之后,需要重啟Linux系統
[root@master ~]# reboot
查看selinux是否是禁用狀態
[root@master ~]# getenforce
Disabled
查看swap分區
[root@master ~]# free -m total used free shared buff/cache available Mem: 1819 166 1488 9 164 1504 Swap: 0 0 0
安裝docker
依舊發送鍵盤輸入的所有會話

切換鏡像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
查看當前鏡像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
安裝特定版本的docker-ce
#安裝時必須指定--setopt=obsoletes=0,否則yum會自動安裝更高版本 [root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
添加一個配置文件
docker在默認情況下使用的Cgroup Driver為cgroupfs,而k8s推薦使用systemd來代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json > { > "exec-opts":["native.cgroupdriver=systemd"], > "registry-mirrors":["https://knOt2bca.mirror.aliyuncs.com"] > } > EOF [root@master ~]# more /etc/docker/daemon.json { "exec-opts":["native.cgroupdriver=systemd"], "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"] }
啟動docker
[root@master ~]# systemctl start docker [root@master ~]# docker version Client: Version: 18.06.3-ce API version: 1.38 Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:26:51 2019 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.3-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:28:17 2019 OS/Arch: linux/amd64 Experimental: false
設置docker開機自啟動
[root@master ~]# systemctl enable docker
安裝kubernetes組件
由於kubernetes的鏡像源在國外,這里切換成國內的鏡像源
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo [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
安裝kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
配置kubelet的cgroup
[root@master ~]# vim /etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
設置kubernets開機自啟
[root@master ~]# systemctl enable kubelet
准備集群鏡像
在安裝kubernetes集群之前,必須提前准備好集群需要的鏡像,所需鏡像可以通過下面命令查看
[root@node1 ~]# kubeadm config images list I0630 15:52:58.055686 9125 version.go:251] remote version is much newer: v1.21.2; falling back to: stable-1.17 W0630 15:53:00.822309 9125 validation.go:28] Cannot validate kube-proxy config - no validator is available W0630 15:53:00.822336 9125 validation.go:28] Cannot validate kubelet config - no validator is available k8s.gcr.io/kube-apiserver:v1.17.17 k8s.gcr.io/kube-controller-manager:v1.17.17 k8s.gcr.io/kube-scheduler:v1.17.17 k8s.gcr.io/kube-proxy:v1.17.17 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.4.3-0 k8s.gcr.io/coredns:1.6.5
下載鏡像
[root@master ~]# images=( kube-apiserver:v1.17.17 kube-controller-manager:v1.17.17 kube-scheduler:v1.17.17 kube-proxy:v1.17.17 pause:3.1 etcd:3.4.3-0 coredns:1.6.5 )
[root@master ~]# for imageName in ${images[@]};do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
查看鏡像
[root@master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.17.17 3ef67d180564 5 months ago 117MB k8s.gcr.io/kube-apiserver v1.17.17 38db32e0f351 5 months ago 171MB k8s.gcr.io/kube-controller-manager v1.17.17 0ddd96ecb9e5 5 months ago 161MB k8s.gcr.io/kube-scheduler v1.17.17 d415ebbf09db 5 months ago 94.4MB k8s.gcr.io/coredns 1.6.5 70f311871ae1 20 months ago 41.6MB k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 20 months ago 288MB k8s.gcr.io/pause 3.1 da86e6ba6ca1 3 years ago 742kB
集群初始化
注意:此過程只需要在master節點上執行
創建集群
[root@master ~]# kubeadm init \ --kubernetes-version=v1.17.17 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=你的master的ip地址
如果成功,你將會在最后兩行看見如下消息

復制這兩行消息
將節點加入k8s集群
在節點一及節點二中粘貼剛剛復制的消息


在master節點中添加配置
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config [root@master ~]# kubectl get nodes
查看kubernetes節點信息
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady master 149m v1.17.4 node1 NotReady <none> 137m v1.17.4 node2 NotReady <none> 137m v1.17.4
表明節點添加成功
安裝網絡插件
注意:此操作只在master節點執行
獲取fannel的配置文件
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
如果下載失敗可以復制鏈接到你的電腦然后通過代理進行下載傳到虛擬機中
運行安裝命令
[root@master ~]# kubectl apply -f kube-flannel.yml podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created
查看狀態
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 3h34m v1.17.4 node1 Ready <none> 3h23m v1.17.4 node2 Ready <none> 3h23m v1.17.4
服務部署
在k8s集群中部署一個nginx程序,測試集群是否在正常工作
部署nginx
注意:此操作只在master節點上執行
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine deployment.apps/nginx created
暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed
查看服務狀態
[root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6867cdf567-65vjr 1/1 Running 0 33m
[root@master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h nginx NodePort 10.99.24.85 <none> 80:31892/TCP 33m
在瀏覽器中輸入主機ip地址加上nginx的端口,我這里是31892

表明nginx已經正常開啟了
