1. 环境准备
本次安装,使用 docker 18.09.9 和 kubelet-1.16.4,请确保centos版本在7.6及以上
# 查看centos版本命令
cat /etc/redhat-release
准备三台虚拟机,hostname分别命名为:master、work1、work2
如无特殊说明,操作都是针对所有节点
1.1 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
cat /etc/selinux/config|grep SELINUX=
1.2 关闭交换内存
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p #让配置生效
cat /proc/sys/vm/swappiness
1.3 配置 ip_forward 转发
# ip_forward配置文件当前内容为0,表示禁止数据包转,将其修改为1表示允许
echo "1" > /proc/sys/net/ipv4/ip_forward
1.4 配置相关yum源
- 备份自身yum源
yum install -y wget
mkdir /etc/yum.repos.d/bak && mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/bak/
- 下载 centos7源、docker源、k8s源头
# 阿里云看这里
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
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=0
EOF
# 华为云看这里
wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# !!!!!! 华为云的k8s开源库没有本次教程安装的k8s 1.16.4版本,所以我们还是用阿里云的k8s开源镜像库
# !!!!!! 华为云别整天吹牛逼了,跟阿里云的差距不是一点点,先把这些开源镜像的基础服务提升下质量再来吹牛逼
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=0
EOF
1.5 刷新yum缓存
yum clean all && yum makecache fast
2. 安装docker
# 安装必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装 Docker-CE
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
# 配置阿里云镜像加速器和k8s运行要求docker的--cgroup-driver=systemd
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的加速器地址,推荐阿里云"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 设置开机启动
systemctl enable docker && systemctl start docker
3. 安装 k8s 相关组件
yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4
systemctl enable kubelet && systemctl start kubelet
# 添加 kubectl 上下文到环境中
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source ~/.bash_profile
3.1 修改内核参数
k8s 网络一般使用 flannel,该网络需要设置内核参数 bridge-nf-call-iptables=1 添加参数配置文件:
sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
使参数生效
sysctl -p /etc/sysctl.d/k8s.conf
如果centos版本低于7.6这一步会出错,请按照如下步骤解决:
执行 sysctl -p /etc/sysctl.d/k8s.conf 会报异常,一般是因为修改这个参数需要系统有 br_netfilter 模块
查看系统里是否有 br_netfilter 模块
lsmod |grep br_netfilter
新增 br_netfilter 模块:
到这里,所有节点的环境准备工作完毕。
4. master节点配置
4.1 master节点初始化操作
- 执行初始化命令, --image-repository 指定阿里云的yum,因为默认的google官方源被墙。
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16
- 如果在机器在内网中不允许访问公网,请事先将所需的镜像下载下来,通过
docker load
命令导入
# 获取当次安装所需的镜像列表信息
[root@kqkd1 ~]# kubeadm config images list
I0804 13:19:28.671072 15762 version.go:252] remote version is much newer: v1.21.3; falling back to: stable-1.19
W0804 13:19:29.456813 15762 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.19.13
k8s.gcr.io/kube-controller-manager:v1.19.13
k8s.gcr.io/kube-scheduler:v1.19.13
k8s.gcr.io/kube-proxy:v1.19.13
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
# 得到上面的镜像列表之后再通过如下方式下载
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.4
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0
# 打tag
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.19.13 k8s.gcr.io/kube-apiserver:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.13 k8s.gcr.io/kube-controller-manager:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.19.13 k8s.gcr.io/kube-scheduler:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.19.13 k8s.gcr.io/kube-proxy:v1.19.13
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0
# 此时的初始化就不需要带上阿里云的镜像仓库地址了
kubeadm init --kubernetes-version v1.16.4 --pod-network-cidr=10.244.0.0/16
出现下面这幅图就代表初始化成功了,但是还需要按照说明执行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2 添加 flannel 的网络
按照 master 的提示,我们接下来应该配置一个 pod network。 但是,因为国内网络不通的原因,此操作无法完成。 请使用博主为你定制的下面这个文件来完成。kqkd-flannel.yml下载
kubectl apply -f https://blog-20200224.oss-cn-shenzhen.aliyuncs.com/images/kqkd-flannel.yml
如果存在镜像下载失败,那么去 hub.docker.com 官方仓库搜索flannel,下载别人转存的镜像,然后重新打tag
至此,master节点初始化就已经完成了,最后在master上安装k8s命令补全
yum -y install bash-completion
source /etc/profile.d/bash_completion.sh
# 使用如下命令查看集群
kubectl get nodes
5. work 节点初始化
work节点的配置,相对master来说简单许多,只需要规划好节点的hostname即可
这里在 work1、work2上执行master初始化时打印的join语句
kubeadm join 192.168.3.180:6443 --token z3hvmn.e3wlgk6xnsam6brp \
--discovery-token-ca-cert-hash sha256:d833e649a92f18715a88d2e11bca79425c76c03846eab297d9bf9d9de99c0a8d
如果不慎找不到当初的这条join token语句了,可以用以下几个命令找回来
# 获得token列表
kubeadm token list
# 重新创建一个token
kubeadm token create --print-join-command
可以看到work1、work2加入集群成功,回到master节点查看所有节点
kubectl get nodes
发现work1、work2已经成功加入
至此,整个集群的搭建过程就结束了。
6. 验证集群以及错误处理
执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:
kubectl get pods --all-namespaces
红色框所示服务是k8s内部pod,如果都是正常的那么表示k8s集群安装完成。
6.1 错误处理
如果发现有状态错误的Pod,则可以执行kubectl --namespace=kube-system describe pod <pod_name> 来查看错误原因,常见的错误原因是镜像没有下载完成。如果安装失败,则可以执行 kubeadm reset 命令将主机恢复原状,同时记得删除掉 $HOME/.kube 文件,执行以上步骤再次进行安装。经过博主在测试环境多次搭建尝试,一路走下来是完全没问题的,如果有中间过程出现问题的,请注意centos版本是否在7.6及以上,还可以通过网站左侧邮箱联系到博主寻求帮助。
6.2 剔除节点
# 在master节点执行
kubectl drain node名称 --delete-local-data --force --ignore-daemonsets
kubectl delete node node名称
# 在node上执行,删除对应的网络
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
7. 后续优化
7.1 修改kubernetes服务 nodeport 类型的端口范围
如果不修改的话那么在 service 中可以在物理机暴露的端口范围是30000-32767
# master上执行
vim /etc/kubernetes/manifests/kube-apiserver.yaml
找到 --service-cluster-ip-range 这一行,在这一行的下一行增加 如下内容
- --service-node-port-range=1-65535
最后重启kubelet
systemctl daemon-reload
systemctl restart kubelet