通过kubeadm搭建Kubernetes(1.16.0版本)集群环境
安装Docker(所有节点)
-
Docker的安装
CentOS 7下安装Docker及基础操作注意,不要安装最新的版本
请结合Kubernets官方网站的文档说明,安装Kubernetes对于的Docker的版本;安装不匹配的版本,可能会出现问题,安装k8s的时候也会提示警告;这里安装的k8s 1.16.0,对应的Docker的版本查找方式如下-
进入Github的官方仓库
Kubernetes github仓库 -
找到对应的版本
找到的你要安装的版本
-
找到Unchanged
-
镜像制作
指定阿里云的镜像仓库(推荐)
// 只要docker安装好之后,不需要做过多的操作
// 在使用kubeadm init的时候 加上阿里云的仓库地址
// master节点安装的时候有详细说明
--image-repository registry.aliyuncs.com/google_containers
手动制作镜像
采用上面的方式可以忽略这个步骤!!
如果你扛的一手好梯子(科学上网),也可以忽略这一步;但是普遍情况下是无法访问到k8s.gcr.io进行镜像的下载;因此我们可以通过Docker的镜像转换为k8s的镜像;
-
创建 k8s_pull.sh
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 docker pull mirrorgooglecontainers/etcd-amd64:3.3.15-0 docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 docker pull mirrorgooglecontainers/pause:3.1 docker pull coredns/coredns:1.6.2 docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 k8s.gcr.io/kube-apiserver:v1.16.0 docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0 docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0 docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0 docker tag mirrorgooglecontainers/etcd-amd64:3.3.15-0 k8s.gcr.io/etcd:3.3.15-0 docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 docker tag coredns/coredns:1.6.2 k8s.gcr.io/coredns:1.6.2 docker rmi mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 mirrorgooglecontainers/etcd-amd64:3.3.15-0 mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 mirrorgooglecontainers/pause:3.1 coredns/coredns:1.6.2
-
下载镜像
sh k8s_pull.sh
准备工作
-
基础配置
-
设置hosts(每个节点都做)
vi /etc/hosts //添加以下配置 192.168.1.26 master 192.168.1.22 node01 192.168.1.21 node02
-
设置hostnamectl(每个节点)
// 在每个节点设置自己的主机名 即: /etc/hostname 下的值 设置好之后建议重启一下 // 也可以在各个节点 vim /etc/hostname 进行修改 hostnamectl set-hostname master hostnamectl set-hostname node01 hostnamectl set-hostname node02
-
关闭防火墙(测试环境)
// 在内网网络环境安全的情况下,可以关闭防火墙 systemctl disable firewalld systemctl stop firewalld
-
开放端口(生产)
//防火墙对外开放以下端口 //MASTER节点 6443 Kubernetes API server 2379-2380 etcd server client API 10250 Kubelet API 10251 kube-scheduler 10252 kube-controller-manager 10255 Read-only Kubelet API (Heapster) //Worker节点 10250 Kubelet API 10255 Read-only Kubelet API (Heapster) 30000-32767 Default port range for NodePort Services. Typically, these ports would need to be exposed to external load-balancers, or other external consumers of the application itself.
-
更新系统时间(每个节点)重要
yum install -y ntpdate // 更新系统时间 时间不一致将无法加入到集群 ntpdate time.windows.com // 将系统时间同步到硬件,防止系统重启后时间被还原 hwclock --systohc // 由于部分机器重启之后系统时间会恢复 因此做以下设置 // 添加定时任务,设置5分钟更新一次时间 echo "*/5 * * * * /usr/sbin/ntpdate time.windows.com > /dev/null 2>&1" >> /var/spool/cron/root // 配置开机执行,电脑在开机之后会执行更新时间 echo "/usr/sbin/ntpdate time.windows.com > /dev/null 2>&1" >> ~/.bashrc // 重启定时任务 systemctl restart crond.service // 查看定时任务 crontab -l
-
-
主机禁用SELinux
setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
-
禁用Swap
swapoff -a # 临时 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab #永久
-
配置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 -p /etc/sysctl.d/k8s.conf sysctl --system
-
配置Kubernetes国内yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=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 EOF
- 阿里云的yum源https://mirrors.aliyun.com
安装(所有节点)
-
安装kubelet、kubeadm、kubectl
// -后面跟的是版本,安装k8s匹配的版本 yum install -y kubelet-1.16.0 kubeadm-1.16.0 kubectl-1.16.0
-
Docker访问hub.docker.com不稳定的设置
// 如果访问稳定的话可以不设置 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
-
重启Docker
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
-
启动 kubelet
systemctl enable kubelet && systemctl start kubelet
部署主节点
-
日志查看路径
tail -f /var/log/messages
-
初始化主节点
kubeadm init \ --apiserver-advertise-address=192.168.1.26 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.16.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap // --apiserver-advertise-address apiserver的地址,也就是master节点的地址 // --image-repository 指定镜像仓库的地址 // --kubernetes-version k8s的版本 // --pod-network-cidr=10.244.0.0/16 后面使用flannel作为网络插件 这里指定pod的网络 // --service-cidr service的网络 // --ignore-preflight-errors=Swap 忽略swap的错误
安装成功之后,docker ps可以看到以下运行的容器
-
node加入集群的指令(注意!!! 以下的这部分很重要)
成功日志的最后一行为node节点加入的指令
kubeadm join 192.168.1.22:6443 --token 91bfpw.smdtbfzc5ebsyldr \ --discovery-token-ca-cert-hash sha256:a769a93dbec36b321195398380b590787cae98e9eb408d1fdb9e52af8c58d2dd
-
查看token
//在master节点执行以下指令 kubeadm token list
-
创建一个新的token
//创建一个临时token(24小时失效) kubeadm token create // 创建一个永久有效的token kubeadm token create --ttl 0 --print-join-command
-
-
复制配置文件到普通用户的host目录
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
验证configmap
kubectl get -n kube-system configmap
-
安装网络插件
// 建议先按以下方式下载,避免耗时 docker pull pengfeilu/flannel:v0.11.0-amd64 docker tag pengfeilu/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64 docker rmi pengfeilu/flannel:v0.11.0-amd64 // 或者直接下载 docker pull quay.io/coreos/flannel:v0.11.0-amd64 // 再执行 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml // 上面的指令执行成功之后需要等几分钟之后相关pod才能正常启动,下面是启动前后的截图 kubectl get pods -n kube-system // 下载成功之后就不用管了,k8s会自动将镜像启动的 // 同理,如果node节点更新失败,也可以手动下载镜像
Node节点部署
-
准备工作
从本文的开始到镜像制作的部分都在Node节点上执行一遍;也就是准备工作部分,安装部分及镜像准备部分都与主节点操作一致
-
加入主节点
-
通过Master启动时的指令
kubeadm join 192.168.1.22:6443 --token 91bfpw.smdtbfzc5ebsyldr \ --discovery-token-ca-cert-hash sha256:a769a93dbec36b321195398380b590787cae98e9eb408d1fdb9e52af8c58d2dd \ --ignore-preflight-errors=Swap
-
更多节点同上操作即可
-
-
主节点查看节点情况
kubectl get nodes // 出现下图说明集群环境已经正常
-
查看端口占用情况
// 查看当前主机的那些端口被占用了 ss -tnl // 根据端口号查询对应的进程id ss -lnp | grep 端口号
重装Master
master安装可能因为一些配置的问题导致失败,但是由于master是由很多模块组成,因此可能装到一半,因为一些异常导致安装失败,再次安装的时候,可能会报端口被占用的情况;可以使用下面的指令重装
kubeadm reset
// 查询初始化安装
kubeadm init --config kubeadm.yaml
-
重装可能出现的错误
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
解决方案可参考可参考:https://cloud.tencent.com/developer/article/1454325
其他错误
-
python版本错误
yum 安装的时候 出现以下错误
//vim /usr/bin/yum //将第一行的python版本 #!/usr/bin/python //改为下面这一行 #!/usr/bin/python2.7 //vim /usr/libexec/urlgrabber-ext-down 修改同上
-
关闭Swap
swapoff -a yes | cp /etc/fstab /etc/fstab_bak cat /etc/fstab_bak |grep -v swap > /etc/fstab
-
Swap错误
//启动指令加上 --ignore-preflight-errors=Swap
-
SELINUX禁用错误
准备工作的时候有说道相关错误
-
Docker Cgroup Driver
sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
到此使用kubeadm搭建的kubernetes集群完成!!!
标题:通过kubeadm搭建Kubernetes(1.16.0版本)集群环境
作者:码霸霸
地址:https://lupf.cn/articles/2019/11/23/1574512937074.html