前期准备

首先我的 k8s服务器是由 一个 master01服务器和 2个 node节点组成(node1,node2)
另外呢还有一个(harbox)私有仓库(我们的镜像一般存储在这里会比较方便)
另外呢还有个软路由(Router)
基本设施如下:

开始吧
0.私有仓库Harbor安装请看这里 传送门
1.构建Router机器(koolshare)
这个需要你有一台国外的服务器才能搞(我没有,所以我不搞)
2.构建master ,node1 ,node2
系统初始化(三台机器都要执行如系统初始化操作)
设置系统主机名以及 Host 文件的相互解析
1 2 3 4 5 6 7 8 |
hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node2 配置host文件 192.168.66.187 k8s-master01 192.168.66.188 k8s-node1 192.168.66.189 k8s-node2 |
安装依赖包
1 |
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git |
设置防火墙为 Iptables 并设置空规则(需要开启防火墙的可以走这一步)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save 错误注意:iptables -F 有可能会让你丢失ssh连接,iptalbes -L 仔细瞅瞅iptables 的规则,发现INPUT链路的策略是DROP: Chain INPUT (policy DROP) 修改INPUT策略为ACCEPT: iptables -P INPUT ACCEPT #允许所有的包(必执行) #再次清空iptables: iptables -F 发现: ssh没有断开连接,内外网ssh都可以正常访问; 服务部署的tcp端口,可以正常访问。 |
关闭防火墙,清理防火墙规则,设置默认转发策略(推荐):
1 2 3 |
systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat |
关闭 SELINUX 和 swap交换分区
1 2 |
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config |
调整内核参数,对于 K8S
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cat > kubernetes.conf <<EOF net.ipv4.tcp_timestamps=1 net.ipv4.tcp_tw_reuse=1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 #4.1以后内核版本已经抛弃了这个参数可以删除 vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 开启 OOM fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF |
生产如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cat > kubernetes.conf <<EOF net.ipv4.tcp_timestamps=1 net.ipv4.tcp_tw_reuse=1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 vm.swappiness=0 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF |
1 2 3 |
cp -rf kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf #这个命令应该要等docker安装完执行方可 #设置完这些后需要重启系统才能生效的,或者继续往下更新完内核后一起重启 |
调整系统时区
1 2 3 4 5 6 7 |
# 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond |
关闭系统不需要服务
1 |
systemctl stop postfix && systemctl disable postfix |
设置 rsyslogd 和 systemd journald
1 2 |
mkdir /var/log/journal # 持久化保存日志的目录 mkdir /etc/systemd/journald.conf.d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslog ForwardToSyslog=no EOF |
1 |
systemctl restart systemd-journald |
升级系统内核为 4.44
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,
例如: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm #安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装 一次! yum --enablerepo=elrepo-kernel install -y kernel-lt #此时查看系统上的所有可用内核: awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg or awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2-efi.cfg 设置新的内核为grub2的默认版本 服务器上存在4 个内核,如果我们要使用 4.18 这个版本,可以通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置 方法1、通过 grub2-set-default 0 命令设置 其中 0 是上面查询出来的可用内核 grub2-set-default 0 方法2、 #设置开机从新内核启动 grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)' # 重启后安装内核源文件(可有可无看自己) yum --enablerepo=elrepo-kernel install kernel-lt-devel-$(uname -r) kernel-lt-headers-$(uname -r) 详情参考:https://blog.csdn.net/weixin_50344792/article/details/117227739 |
关闭 NUMA
1 |
cp /etc/default/grub{,.bak} |
vim /etc/default/grub # 在 GRUB_CMDLINE_LINUX 一行添加 numa=off
参数

最终文件内容如下所示:
1 2 3 4 5 6 7 |
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet numa=off" GRUB_DISABLE_RECOVERY="true" |
然后备份和生成新的
1 2 |
cp /boot/grub2/grub.cfg{,.bak} grub2-mkconfig -o /boot/grub2/grub.cfg |
然后重启即可 reboot
(系统初始化到此结束….分割线———————–)
Kubeadm部署安装:
kube-proxy开启ipvs的前置条件
1 2 3 4 5 6 7 8 9 10 |
modprobe br_netfilter cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 #这里大于4.19的内核改成nf_conntrack否则找不到模块 EOF |
1 |
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4 |
安装 Docker 软件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 update -y && yum -y install docker-ce ## 创建 /etc/docker 目录 mkdir /etc/docker # 配置 daemon. cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "insecure-registries":["https://hub.atshooter.com"] } EOF #"insecure-registries":["https://hub.atshooter.com"] 这句是harbor私有仓库安全认证域名.对应你的harbor仓库 |
1 2 3 |
mkdir -p /etc/systemd/system/docker.service.d # 重启docker服务 加入开机启动 systemctl daemon-reload && systemctl restart docker && systemctl enable docker |
安装 Kubeadm (主从配置) (注意下下面这个脚本,可能行么有对齐,自行调整 ,编辑器原因)
设置添加阿里YUM软件源
1 2 3 4 5 6 7 8 9 |
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 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 EOF |
1 2 |
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 systemctl enable kubelet.service |
- kubeadm 初始化工具
- kubectl 命令行管理工具
- kubelet 跟dokcer交互创建容器
初始化主节点
初始化之前,我们先导入一下镜像(kuberadm在初始化我们的云服务器之前会从google的云服务器pull镜像,这个镜像还是比较大的,而且速度比较慢,并且她还需要一个科学上网的东东存在,如果你有ssr这个科学上网东西,那没问题,要是你没有呢,所以我们事先已经打包好了这写要用到的镜像)
所需镜像打包下载地址:
链接:https://pan.baidu.com/s/1CxAdBMikFjCrb7iwGHsxsA
提取码:s8bx
下载之后传到服务器,解压
因为这里镜像较多,我们可以写个脚本来导入到docker中
1 2 3 4 5 6 7 8 |
#!/bin/bash ls /root/kubeadm-basic.images > /tmp/imglist.txt cd /root/kubeadm-basic.images for i in $(cat /tmp/imglist.txt) do docker load -i $i done rm -rf /tmp/imglist.txt |

下面的配置针对的是主节点 k8s-master (子节点到上一步导入镜像完成后已截止,只待加入主节点命令)
将kuberadm的配置文件打印到默认的kuberadm-config.yaml文件中
1 |
kubeadm config print init-defaults > kubeadm-config.yaml |
编辑kubeadm-config.yaml文件
1 |
vim kubeadm-config.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
修改文件内容如下: localAPIEndpoint: advertiseAddress: 192.168.66.10 #修改为当前的服务器节点地址 kubernetesVersion: v1.15.1 #修改为当前版本号 networking: podSubnet: "10.244.0.0/16" #这里要添加这一行,为什么呢?默认情况下我们会安装一个Flanneld的插件,去给我们实现覆盖网络他的默认的pod net网段就是这个,如果这个网段不一致,后期你要去配置文件修改,我们先提前统一写好 serviceSubnet: 10.96.0.0/12 # #然后在最后一行添加如下代码,作用是把默认的调度模式改为ipvs --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs #修改默认调度模式为ipvs |
完整配置文件如下(主节点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.66.20 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io kind: ClusterConfiguration kubernetesVersion: v1.15.1 networking: podSubnet: "10.244.0.0/16" dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs |
接下来通过指定yaml文件,进行初始化安装,以及自动颁发证书
1 2 3 4 5 |
--experimental-upload-certs (#让其他节点自动颁发证书,1.13版之后才有这个命令,高可用非常有用) tee kubeadm-init.log (#把所有安装信息都写入到kuberadm-init.log中) #执行下面语句开始初始化安装 kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log |
安装完成后kubeadm的配置文件会放在此目录

1 2 |
/var/lib/kubelet/config.yaml #kubeadm配置文件 /etc/kubernetes/pki #证书存放目录 |
安装完成后还有这几件事要做

1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #拷贝集群管理配置文件 sudo chown $(id -u):$(id -g) $HOME/.kube/config #授权 |
到此主节点配置完成,我们使用命令查看一下节点
1 |
kubectl get node |

部署网络 flannel
为了等会看起来不乱,我们在家目录下创建一个install-k8s文件夹
1 2 3 4 5 6 7 8 9 10 11 12 13 |
mkdir install-k8s #然后把相关重要文件都挪进去 mv kubeadm-config.yaml kubeadm-init.log install-k8s/ #然后创建一个core 核心,把这些文件都移动到core文件夹中 mv * core/ #然后为再创建一个存放插件 ,plugin/flannel文件夹 mkdir -p plugin/flannel cd plugin/flannel #然后在flannel文件夹中 wget https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml(#恕我直言这个如果你没有连接外网yml文件里的镜像你是拉不到的 装完后flannel的状态一直都是 Init:0/1,然后过一段时间,Init:0/1 会变成 Init:ImagePullBackOff(镜像获取失败),原因就是docker根本拉不到这个镜像所以无法启动。在这里卡了我好久,没有科学上网的我真的没办法 ) |
解决办法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#这个镜像不好下载要连接外网,你自己想办法,也可以让别人导给你 docker pull quay.io/coreos/flannel:v0.11.0-amd64 #个人提供flannel镜像下载地址(下载之后导入到你的docker中,然后再往下执行) 链接:https://pan.baidu.com/s/10Br_ZYKKeAuOvf1293FCzg 提取码:wuue #下载或导入完flannel镜像后继续向下 mkdir -p /etc/cni/net.d/ cat <<EOF> /etc/cni/net.d/11-flannel.conf {"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}} EOF mkdir /usr/share/oci-umount/oci-umount.d -p mkdir /run/flannel/ cat <<EOF> /run/flannel/subnet.env FLANNEL_NETWORK=172.100.0.0/16 FLANNEL_SUBNET=172.100.1.0/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true EOF wget https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml |
kube-flannel.yml
然后通过kubectl apply命令,依据yml配置文件创建出来
1 |
kubectl apply -f kube-flannel.yml |

创建完成后可以通过以下命令查看这个插件是否创建成功
1 |
kubectl get pod -n kube-system |

查看ifconfig

1 |
kubectl get node #查看节点 |

将子节点加入到主节点master,加入的命令请查看安装日志最后一条
cat kubeadm-init.log

1 2 |
kubeadm join 192.168.66.20:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:892ebfb563c30b09d788949920ed206e8957a8c4f6c978e10f803169f9033376 |
那我们把这条命令复制到其他子节点运行一下

1 |
kubectl get nodes |

查看详细信息
1 |
kubectl get pod -n kube-system -o wide |

可以看到这2个节点还在初始化过程当中
我们等待他运行成功
1 |
kubectl get pod -n kube-system -w |

镜像加载失败了,还是手动给其他2个子节点导入flannel镜像吧

导入之后他会自动重启(k8s一个pod启动失败他会一直启动直到启动成功)

三个节点都已经运成功

::后期工作
因为 install-k8s目录下的一些配置文件和安装日志后期可能会用到,你最好放到/usr/local下防止不经意删除(建议)
到此,我们的k8s集群就安装成功了
1 2 |
如果安装失败, 则可以执行kubeadm reset命令将主机恢复原状, 重新执行 kubeadm init命令, 再次进行安装 |
- 本文固定链接: https://www.yoyoask.com/?p=1724
- 转载请注明: shooter 于 SHOOTER 发表