本文介紹一下使用kubeadm安裝K8S集群,並使用docker作為容器運行時的具體安裝步驟。
環境說明
主機節點
| 機器角色 | IP地址 |
| master | 192.168.30.11 |
| node01 | 192.168.30.12 |
| node02 | 192.168.30.13 |
軟件說明
軟件版本
| 軟件 | 版本 |
| docker | 20.10.8 |
| kubeadm | 1.22.2 |
| kubelet | 1.22.2 |
| kubectl | 1.22.2 |
環境准備
(在所有節點上操作)
1. 關閉防火牆
systemctl stop firewalld systemctl disable firewalld
2. 關閉selinux
setenforce 0 # 臨時關閉 sed -i 's/enforcing/disabled/g' /etc/selinux/config # 永久關閉
3. 關閉swap
swapoff -a # # 臨時關閉 sed -ir 's/.*swap.*/#&/g' /etc/fstab # 永久關閉
4. 設置主機名
每個節點根據自己習慣去命名
hostnamectl set-hostname <hostname>
5. 在每個節點添加hosts信息
cat >> /etc/hosts << EOF 192.168.30.11 k8s-master 192.168.30.12 k8s-node01 192.168.30.13 k8s-node02 EOF
6. 創建k8s.conf文件,配置內核參數,將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 EOF 執行 sysctl --system 使得如上添加的配置生效
7. 時間同步(如果時間已經同步,這一步可以省略)
yum install ntpdate -y ntpdate ntpdate cn.pool.ntp.org 常用的NTP時間服務器 cn.ntp.org.cn #中國 edu.ntp.org.cn #中國教育網 ntp1.aliyun.com #阿里雲 ntp2.aliyun.com #阿里雲 cn.pool.ntp.org #最常用的國內NTP服務器
安裝相關軟件包
(master操作)
yum install conntrack-tools libseccomp libtool-ltdl -y
安裝docker/kubeadm/kubelet
(master,node01,node02 均安裝)
安裝docker
# 安裝相關軟件
yum install -y yum-utils device-mapper-persistent-data lvm2
# 使用阿里雲的源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看可用版本
yum list docker-ce --showduplicates
# 選擇一個版本進行安裝,這里用 docker-ce-20.10.8-3.el7.x86_64
yum install docker-ce-20.10.8-3.el7.x86_64 -y
# 啟動 docker
systemctl start docker
# 查看狀態
systemctl status docker
# 設置開機啟動
systemctl enable docker
# 查看version信息
docker version
# 設置鏡像源
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn" ],
"exec-opts": ["native.cgroupdriver=systemd"] # 修改docker的cgroup為systemd
}
安裝kubeadm、kubelet、kubectl
(kubectl是master端的管理工具,node節點可以不用安裝)
#由於官方源國內無法訪問,這里使用阿里雲yum源進行替換: cat > /etc/yum.repos.d/kubernetes.repo << EOF [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF #安裝kubeadm、kubelet、kubectl 由於版本更新頻繁,這里安裝1.22.2版本 yum install -y kubeadm-1.22.2 yum install -y kubelet-1.22.2 yum install -y kubectl-1.22.2 如果安裝時提示公鑰沒有安裝,解決方法:--nogpgcheck 進行跳過公鑰檢查安裝 # 設置kubelet開機啟動(注意:kubelet服務會暫時啟動不了,先不用管它) systemctl enable kubelet
在master端初始化
kubeadm init \ --apiserver-advertise-address=192.168.30.11 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.22.2 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.30.11 這里填master地址即可
這個時候並不會成功,報錯如下:

很明顯,是kubelet沒啟動導致。
查看/var/log/messages日志,有這樣一條:
failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
這是因為docker的Cgroup是cgroups,kubelet的Cgroups是systemd,兩者的Cgroups不一樣導致。
修改方法如下:
鑒於用的k8s版本更新較快,本文只記錄當前1.22.2的修改方式,其他版本請參詳官方:
# 重置未初始化成功的kubeadm配置
echo y | kubeadm reset
修改docker,只需在/etc/docker/daemon.json中,添加"exec-opts": ["native.cgroupdriver=systemd"]即可
修改后如下:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn" ],
"exec-opts": ["native.cgroupdriver=systemd"]
}
修改kubelet:
cat > /var/lib/kubelet/config.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF
重啟docker 與 kubelet:
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
再次初始化就可以了。然后照着提示在操作就可以了。
安裝網絡
mkdir flannel cd flannel wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube- flannel.yml # 安裝flannel網絡 kubectl apply -f kube-flannel.yml # 檢查 kubectl get pods -n kube-system
### 在執行 kubectl get cs 命令查看健康狀態時,輸出如下信息:
[root@k8s-master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
這是不正常的,解決方法:
cd /etc/kubernetes/manifests # 創建備份文件夾bak mkdir bak # 備份kube-scheduler.yaml到bak文件夾下 cp kube-scheduler.yaml bak # 修改kube-scheduler.yaml文件 將 --port=0 這一行刪除 # 重啟kubelet systemctl restart kubelet
再次執行kubectl get cs,顯示正常狀態

