CentOS7搭建k8s集群
硬件准备(所有节点)
- 请确保CPU至少2核,内存2G
- 禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
注意 : 如果不关闭防火墙,k8s内部服务之间无法通讯。比如无法连接数据库,java.net.UnknownHostException
3. 如果是多台虚拟机,需要保证虚拟机hostname不同。如果几台虚拟机是复制出来的,很可能忘记修改hostname、静态IP
4. 禁用SELINUX
临时禁用
setenforce 0
永久禁用
vim /etc/selinux/config
SELINUX=disabled
- 修改k8s.conf文件
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system #立即生效
- 关闭swap
# 临时关闭
swapoff -a
#永久关闭swap,**重启后生效**,所以最好配合临时关闭方式一起使用
修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载
# 注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0`
- 在/etc/hosts里面一定要有本机的hostname
docker的准备(所有节点)
- docker安装CentOS安装docker
- 修改docker配置使用systemd (必须配置,不然会报错)
vim /etc/docker/daemon.json #可能没有/etc/docker这个文件夹,新建就好了
#粘贴以下内容
{
"registry-mirrors": ["https://yqbg1qh9.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
systemctl enable docker #开机启动,
k8s源的准备(所有节点)
由于有墙的限制,所以要使用阿里的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
yum clean all
yum upgrade
镜像准备(所有节点)
下载k8s所需镜像,registry.cn-hangzhou.aliyuncs.com/google_containers是待会初始化主节点的时候要使用的仓库地址
#!/bin/bash
images=(
kube-apiserver:v1.21.0
kube-proxy:v1.21.0
kube-controller-manager:v1.21.0
kube-scheduler:v1.21.0
coredns:v1.8.0
etcd:3.4.3-0
pause:3.1
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
所有节点上都要有这些镜像,如果某个node缺少必要镜像,那么这个node拉取镜像会失败。
变成执行文件(所有节点)
chmod 700 ./master_images.sh
拉取必要镜像(所有节点)
./master_images.sh
安装软件(所有节点)
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl enable kubelet && systemctl start kubelet
初始化master节点(master节点)
kubeadm init --kubernetes-version=1.21.0 \
--apiserver-advertise-address=192.168.56.121 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
kubeadm init --kubernetes-version=1.18.1 \ 安装时指定的版本
--apiserver-advertise-address=192.168.56.121 \ **masterIP地址**,我用的静态IP
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ 仓库名称,会从这个仓库拉取镜像
--service-cidr=10.1.0.0/16 \ k8s的Service网络
--pod-network-cidr=10.244.0.0/16 k8s的pod 网络
安装flannel(master节点)
flannel只需要在master安装,安装之后,coredns镜像就是running状态了。新节点加入后会在kube-system空间新建一个flannel容器。
安装flannel时,或许有墙导致下载超时,这里有源文件
在使用这个文件时一定注意,当中有关pod网络的配置,一定要和master初始化时指定的一致
net-conf.json: |
{
"Network": "10.244.0.0/16", 注意这里要和--pod-network-cidr=10.244.0.0/16一致
"Backend": {
"Type": "vxlan"
}
验证
重置
sudo kubeadm reset
rm -rf $HOME/.kube
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf /var/lib/etcd
如果pod调度一直失败,则可能是flannel网络与cni网络不一致造成的,参考下面两篇文章
Kubernetes之network: failed to set bridge addr: “cni0“ already has an IP address different from xxx问题
解决k8s"failed to set bridge addr: “cni0” already has an IP address different from 10.244.1.1/24"
另外,当上面的解决方法适合在普通node节点上执行,在master上只能kubeadm reset了,整个集群重新部署。
排错
- coredns:v1.8.0不存在
注意到提示中的仓库路径有两个coredns
就把原来的coredns打个标签吧,这个标签必须打,如果某一个node上缺少coredns,就会无法拉取镜像。
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.0 \
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
- 在master上的请求发送不到node节点
一般是因为虚拟机使用了多张网卡造成的,参考解决k8s无法通过svc访问其他节点pod的问题
另外,在修改的时候注意不要改错地方了
在这里改
而不是在头部这一大坨
注意点
只有master机器上要有k8s所需要的镜像,其他机器只要安装了kubectl、kubedam、kubelet就可以了
默认在node节点不能使用kubectl命令,如果想使用则需要把master下的/etc/kubernetes/admin.conf复制到node相同的路径下,再在node上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
k8s默认无法想master节点调度,如果只是搭建一台测试环境,则需要允许向master节点调度。
kubectl taint node <k8s-master-name> node-role.kubernetes.io/master-
如果master节点想恢复不能调度的状态则
kubectl taint node <k8s-master-name> node-role.kubernetes.io/master=""
生成新的加入集群命令
kubeadm token create --print-join-command
常用命令
sudo journalctl -xe | grep cni 查看cni日志
参考
https://blog.csdn.net/shykevin/article/details/105526586?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
https://blog.csdn.net/weixin_42715225/article/details/112969089
https://blog.csdn.net/zh452647457/article/details/118078110
https://blog.csdn.net/weixin_38169886/article/details/99809114