系统环境
主机名 |
操作系统 |
IP地址 |
节点名称 |
k8s-master |
CentOS Linux release 7.6.1810 |
192.168.2.213 |
管理节点 |
k8s-node001 |
CentOS Linux release 7.6.1810 |
192.168.2.214 |
工作节点 |
一、全局操作(所有机器执行)
1、关闭SELinux
禁用SELinux的目的是让容器可以读取主机文件系统
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i 's/SELINUXTYPE=targeted/#&/' /etc/selinux/config
setenforce 0
2、关闭firewalld防火墙
Kubernetes的master(管理主机)与node(工作节点)之间会有大量的网络通信,在一个安全的内部网络环境中建议关闭防火墙服务。
systemctl disable firewalld
systemctl stop firewalld
3、关闭swap分区
swapoff -a
永久关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
将swap那行注释掉
4、添加hosts
vim /etc/hosts
192.168.2.213 k8s-master
192.168.2.214 k8s-node001
5、部署docker环境
Kubernetes 1.24以上版本已经弃用docker,改为使用Containerd,可以不安装docker。但国内访问国外网站一直受到限制,我这里安装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 makecache fast
yum -y install docker-ce
mkdir -p /data/docker
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://registry.docker-cn.com"],
"data-root": "/data/docker"
}
systemctl start docker.service
systemctl status docker.service
6、安装kubeadm、kubectl、kubelet
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
二、部署master节点(仅master主机执行)
1、修改kubeadm的默认配置
kubeadm config print init-defaults #输出 kubeadm init 命令默认参数的内容。
kubeadm config print join-defaults #输出 kubeadm join 命令默认参数的内容。
kubeadm config migrate #在新旧版本之间进行配置转换。
Kubeadm config images list #列出所需的镜像列表
Kubeadm config images pull #拉取镜像到本地
生成初始化参数配置文件
kubeadm config print init-defaults > init-config.yaml
vim init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.2.213 #修改成master节点的IP地址
bindPort: 6443
nodeRegistration:
criSocket: /run/containerd/containerd.sock #修改成containerd.sock文件所在路径
imagePullPolicy: IfNotPresent
name: k8s-master #修改成master节点的主机名
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #使用阿里云的镜像地址
kind: ClusterConfiguration
kubernetesVersion: 1.26.2 #需要安装的k8s版本号
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16" #指定pod网段
serviceSubnet: 10.96.0.0/16 #指定service网段
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
说明:
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers#国内无法访问registry.k8s.io地址,所以这里改成阿里云镜像地址,否则初始化master节点会失败。
kubernetesVersion: 1.26.2 #版本号改成和镜像的版本号一致,否则初始化master节点会再次下载1.26.0的镜像。
2、下载kubernetes的相关镜像
kubeadm config images list
可以通过 kubeadm config images pull 命令下载镜像,但是内地应该访问不了dl.k8s.io,很大概率下载失效,所以使用docker pull下载。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull coredns/coredns:1.9.3
K8s初奴化时会默认获取registry.k8s.io前缀的镜像,所以需要给镜像打个标签
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.26.2 registry.k8s.io/kube-controller-manager:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.26.2 registry.k8s.io/kube-apiserver:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.26.2 registry.k8s.io/kube-scheduler:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.2 registry.k8s.io/kube-proxy:v1.26.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.6-0 registry.k8s.io/etcd:3.5.6-0
docker tag coredns/coredns:1.9.3 registry.k8s.io/coredns/coredns:v1.9.3
3、初始化master节点
kubeadm init --config=init-config.yaml --upload-certs
报错了,按错误提示是要将/proc/sys/net/bridge/bridge-nf-call-iptables设置为1
echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl -p /etc/sysctl.d/k8s.conf
再次执行kubeadm init --config=init-config.yaml --upload-certs,又报错了
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
systemctl restart containerd
再次执行kubeadm init --config=init-config.yaml --upload-certs,又又报错了
由于直接日志显示不完整,所以将日志写入到一个临时文件中,方便查看
journalctl -xeu kubelet > test.txt
很明显是pause的版本不对,我们下载的是3.9,应该要用3.6的,重新下载3.6版本的pause即可。
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
1.24以上版本已使用containerd替代Dockershim,所以这里还需要将pause镜像导入到CRI里。
docker save registry.k8s.io/pause:3.6 -o pause.tar
ctr -n k8s.io images import pause.tar
systemctl daemon-reload
systemctl restart kubelet
再次执行kubeadm init --config=init-config.yaml --upload-certs,又又又报错了
master初始化前需要停止kubelet
rm -fr /etc/kubernetes/manifests
systemctl stop kubelet
再次执行kubeadm init --config=init-config.yaml --upload-certs,终于成功了
出现如上图字样说明master节点初始化成功,按照提示执行以下命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc
如果初始化master有问题,可将集群重置,再次初始化master
kubeadm reset
4、解决kube-proxy无法成功运行问题
kubectl get nodes
查看nodes状态,发现master节点是NotReady状态
kubectl get pod -n kube-system
查看pod状态,发现kube-proxy是CrashLoopBackOff状态,说明集群虽然初始化成功,但是却不正常。
查看kube-proxy日志
kubectl logs kube-proxy-qdx98 -n kube-system
通过报错信息可以看到kube-proxy无法识别SupportIPVSProxyMode这个字段,这是因为1.20以上版本启用ipvs配置的定义方式和之前的版本有所不同,以下是官方的定义方式:
kubeProxy:
config:
mode: ipvs
查看我们的初始化配置文件init-config.yaml
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
很明显是多了featureGates:和SupportIPVSProxyMode: true这两行,那么我们可以修改kube-proxy的启动配置,将这两行删除即可。
kubectl -o yaml get cm kube-proxy -n kube-system
查看kube-proxy配置项详情
kubectl edit cm kube-proxy -n kube-system
将featureGates:和SupportIPVSProxyMode: true这两行删除,保存退出,重启kube-proxy。
kubectl delete pod kube-proxy-qdx98 -n kube-system
三、工作节点加入集群(node节点执行)
输入kubeadm init成功之后提供的join命令,--ignore-preflight-errors=all参数可以打印错误详细信息。
kubeadm join 192.168.2.213:6443 --token 52b38s.4mln9k8lgd3w5hol --discovery-token-ca-cert-hash sha256:efb53b0ccdf3708a0265299f155b0356ed888175d5334025c33fcd6af0a2b141 --ignore-preflight-errors=all
注:该token 有效期为24小时。参数 –control-plane 就是加入控制节点,不带该参数就是加入工作节点。
如果token过期的话,也可以用如下命令生成:
kubeadm token create --print-join-command
果然还是报错了,查看kubelet的日志
journalctl -xeu kubelet -l
还是containerd的问题,删除它的config.toml文件即可
mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
systemctl restart containerd
systemctl stop kubelet
再次执行join命令
终于成功了,按照提示在master节点上查看node状态
四、安装网络插件Flannel(仅master安装)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
检查pod网段配置是否与init-config.yaml一致,如果不一致,需要修改成init-config.yaml里配置的pod网段。
kubectl apply -f kube-flannel.yml
查看pod状态发现,有一个proxy没有启起来
查看node节点的kubelet日志,发现又有pause:3.6的报错
在node节点上执行
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
docker save registry.k8s.io/pause:3.6 -o pause.tar
ctr -n k8s.io images import pause.tar
systemctl daemon-reload
systemctl restart kubelet
此时在master节点上查看node和pod状态,都正常了。
再次查看node节点的kubelet日志,发现还有个错误
检查了一下node节点,确实是没有/etc/kubernetes/manifests目录,此问题不影响使用,但kubelet一直抛这个错误,很烦,还影响查看有用的日志信息。
手动创建/etc/kubernetes/manifests目录
mkdir/etc/kubernetes/manifests
systemctl restart kubelet
再次查看kubelet日志,OK,终于正常了。至此,k8s集群就部署成功了。
五、防火墙配置
如果要开启firewalld防火墙的话,可以参考以下配置
组件 |
默认端口号 |
API Server |
8080(HTTP非安全端口号) 6443(HTTPS安全端口号) |
Controller Manager |
10257 |
Scheduler |
10259 |
Kubelet |
10250 10248(只读端口号) |
etcd |
2379(供客户端访问) 2380(供etcd集群内部节点之间访问) 2381(HTTPS端口号) |
proxy |
10249 10256 |