kubernetes集群環(huán)境搭建
1 前置知識點(diǎn)
目前生產(chǎn)部署Kubernetes 集群主要有兩種方式:
kubeadm
Kubeadm 是一個K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
二進(jìn)制包
從github 下載發(fā)行版的二進(jìn)制包,手動部署每個組件,組成Kubernetes 集群。
Kubeadm 降低部署門檻,但屏蔽了很多細(xì)節(jié),遇到問題很難排查。如果想更容易可控,推薦使用二進(jìn)制包部署Kubernetes 集群,雖然手動部署麻煩點(diǎn),期間可以學(xué)習(xí)很多工作原理,也利于后期維護(hù)。
2 kubeadm 部署方式介紹
kubeadm 是官方社區(qū)推出的一個用于快速部署kubernetes 集群的工具,這個工具能通過兩條指令完成一個kubernetes 集群的部署:
- 創(chuàng)建一個Master 節(jié)點(diǎn)kubeadm init
- 將Node 節(jié)點(diǎn)加入到當(dāng)前集群中$ kubeadm join <Master 節(jié)點(diǎn)的IP 和端口>
3 安裝要求
在開始之前,部署Kubernetes 集群機(jī)器需要滿足以下幾個條件:
- 一臺或多臺機(jī)器,操作系統(tǒng)CentOS7.x-86_x64
- 硬件配置:2GB 或更多RAM,2 個CPU 或更多CPU,硬盤30GB 或更多
- 集群中所有機(jī)器之間網(wǎng)絡(luò)互通
- 可以訪問外網(wǎng),需要拉取鏡像
- 禁止swap 分區(qū)
4 最終目標(biāo)
- 在所有節(jié)點(diǎn)上安裝Docker 和kubeadm
- 部署Kubernetes Master
- 部署容器網(wǎng)絡(luò)插件
- 部署Kubernetes Node,將節(jié)點(diǎn)加入Kubernetes 集群中
- 部署Dashboard Web 頁面,可視化查看Kubernetes 資源
5 準(zhǔn)備環(huán)境
[圖片上傳失敗...(image-4919a1-1725265833508)]
| 角色 | IP地址 | 組件 |
|---|---|---|
| master01 | 192.168.5.3 | docker,kubectl,kubeadm,kubelet |
| node01 | 192.168.5.4 | docker,kubectl,kubeadm,kubelet |
| node02 | 192.168.5.5 | docker,kubectl,kubeadm,kubelet |
6 環(huán)境初始化
6.1 檢查操作系統(tǒng)的版本
# 此方式下安裝kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)
6.2 主機(jī)名解析
為了方便集群節(jié)點(diǎn)間的直接調(diào)用,在這個配置一下主機(jī)名解析,企業(yè)中推薦使用內(nèi)部DNS服務(wù)器
# 主機(jī)名成解析 編輯三臺服務(wù)器的/etc/hosts文件,添加下面內(nèi)容
192.168.90.100 master
192.168.90.106 node1
192.168.90.107 node2
6.3 時間同步
kubernetes要求集群中的節(jié)點(diǎn)時間必須精確一直,這里使用chronyd服務(wù)從網(wǎng)絡(luò)同步時間
企業(yè)中建議配置內(nèi)部的會見同步服務(wù)器
# 啟動chronyd服務(wù)
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
6.4 禁用iptable和firewalld服務(wù)
kubernetes和docker 在運(yùn)行的中會產(chǎn)生大量的iptables規(guī)則,為了不讓系統(tǒng)規(guī)則跟它們混淆,直接關(guān)閉系統(tǒng)的規(guī)則
# 1 關(guān)閉firewalld服務(wù)
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
# 2 關(guān)閉iptables服務(wù)
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables
6.5 禁用selinux
selinux是linux系統(tǒng)下的一個安全服務(wù),如果不關(guān)閉它,在安裝集群中會產(chǎn)生各種各樣的奇葩問題
# 編輯 /etc/selinux/config 文件,修改SELINUX的值為disable
# 注意修改完畢之后需要重啟linux服務(wù)
SELINUX=disabled
6.6 禁用swap分區(qū)
swap分區(qū)指的是虛擬內(nèi)存分區(qū),它的作用是物理內(nèi)存使用完,之后將磁盤空間虛擬成內(nèi)存來使用,啟用swap設(shè)備會對系統(tǒng)的性能產(chǎn)生非常負(fù)面的影響,因此kubernetes要求每個節(jié)點(diǎn)都要禁用swap設(shè)備,但是如果因?yàn)槟承┰虼_實(shí)不能關(guān)閉swap分區(qū),就需要在集群安裝過程中通過明確的參數(shù)進(jìn)行配置說明
# 編輯分區(qū)配置文件/etc/fstab,注釋掉swap分區(qū)一行
# 注意修改完畢之后需要重啟linux服務(wù)
vim /etc/fstab
注釋掉 /dev/mapper/centos-swap swap
# /dev/mapper/centos-swap swap
6.7 修改linux的內(nèi)核參數(shù)
# 修改linux的內(nèi)核采納數(shù),添加網(wǎng)橋過濾和地址轉(zhuǎn)發(fā)功能
# 編輯/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
# 加載網(wǎng)橋過濾模塊
[root@master ~]# modprobe br_netfilter
# 查看網(wǎng)橋過濾模塊是否加載成功
[root@master ~]# lsmod | grep br_netfilter
6.8 配置ipvs功能
在Kubernetes中Service有兩種帶來模型,一種是基于iptables的,一種是基于ipvs的兩者比較的話,ipvs的性能明顯要高一些,但是如果要使用它,需要手動載入ipvs模塊
# 1.安裝ipset和ipvsadm
[root@master ~]# yum install ipset ipvsadm -y
# 2.添加需要加載的模塊寫入腳本文件
[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
# 3.為腳本添加執(zhí)行權(quán)限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
# 4.執(zhí)行腳本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5.查看對應(yīng)的模塊是否加載成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
6.9 安裝docker
# 1、切換鏡像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看當(dāng)前鏡像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3、安裝特定版本的docker-ce
# 必須制定--setopt=obsoletes=0,否則yum會自動安裝更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4、添加一個配置文件
#Docker 在默認(rèn)情況下使用Vgroup Driver為cgroupfs,而Kubernetes推薦使用systemd來替代cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5、啟動dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
2.6.10 安裝Kubernetes組件
# 1、由于kubernetes的鏡像在國外,速度比較慢,這里切換成國內(nèi)的鏡像源
# 2、編輯/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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、安裝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
# 4、配置kubelet的cgroup
#編輯/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、設(shè)置kubelet開機(jī)自啟
[root@master ~]# systemctl enable kubelet
6.11 準(zhǔn)備集群鏡像
# 在安裝kubernetes集群之前,必須要提前準(zhǔn)備好集群需要的鏡像,所需鏡像可以通過下面命令查看
[root@master ~]# kubeadm config images list
# 下載鏡像
# 此鏡像kubernetes的倉庫中,由于網(wǎng)絡(luò)原因,無法連接,下面提供了一種替換方案
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
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
6.11 集群初始化
下面的操作只需要在master節(jié)點(diǎn)上執(zhí)行即可
# 創(chuàng)建集群
[root@master ~]# kubeadm init \
--apiserver-advertise-address=192.168.90.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 創(chuàng)建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
下面的操作只需要在node節(jié)點(diǎn)上執(zhí)行即可
kubeadm join 192.168.0.100:6443 --token awk15p.t6bamck54w69u4s8 \
--discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117
在master上查看節(jié)點(diǎn)信息
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m v1.17.4
node1 NotReady <none> 22s v1.17.4
node2 NotReady <none> 19s v1.17.4
6.13 安裝網(wǎng)絡(luò)插件,只在master節(jié)點(diǎn)操作即可
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
由于外網(wǎng)不好訪問,如果出現(xiàn)無法訪問的情況,可以直接用下面的 記得文件名是kube-flannel.yml,位置:/root/kube-flannel.yml內(nèi)容:
https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
也可手動拉取指定版本
docker pull quay.io/coreos/flannel:v0.14.0 #拉取flannel網(wǎng)絡(luò),三臺主機(jī)
docker images #查看倉庫是否拉去下來
個人筆記
若是集群狀態(tài)一直是 notready,用下面語句查看原因,
journalctl -f -u kubelet.service
若原因是: cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
mkdir -p /etc/cni/net.d #創(chuàng)建目錄給flannel做配置文件
vim /etc/cni/net.d/10-flannel.conf #編寫配置文件
{
"name":"cbr0",
"cniVersion":"0.3.1",
"type":"flannel",
"deledate":{
"hairpinMode":true,
"isDefaultGateway":true
}
}
6.14 使用kubeadm reset重置集群
#在master節(jié)點(diǎn)之外的節(jié)點(diǎn)進(jìn)行操作
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
##重啟kubelet
systemctl restart kubelet
##重啟docker
systemctl restart docker
6.15 重啟kubelet和docker
# 重啟kubelet
systemctl restart kubelet
# 重啟docker
systemctl restart docker
使用配置文件啟動fannel
kubectl apply -f kube-flannel.yml
等待它安裝完畢 發(fā)現(xiàn)已經(jīng)是 集群的狀態(tài)已經(jīng)是Ready
6.16 kubeadm中的命令
# 生成 新的token
[root@master ~]# kubeadm token create --print-join-command