k8s集群搭建
1.环境依赖1.1 给每一台机器设置主机名hostnamectl set-hostname k8s-master01nhostnamectl set-hostname k8s-node01nhostnamect
1.环境依赖
1.1 给每一台机器设置主机名
hostnamectl set-hostname k8s-master01nhostnamectl set-hostname k8s-node01nhostnamectl set-hostname k8s-node02n#查看主机名nhostnamen#配置IP host映射关系nvi /etc/hostsn192.168.192.128 k8s-master01n192.168.192.129 k8s-node01n192.168.192.130 k8s-node02
1.2 安装依赖包
[root@k8s-master01 ~]# yum -y install conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
1.3 关闭防火墙、Selinux
[root@k8s-master01 ~]# systemctl stop firewalldn[root@k8s-master01 ~]# systemctl disable firewalldn[root@k8s-master01 ~]# yum -y install iptables-servicesn[root@k8s-master01 ~]# systemctl start iptablesn[root@k8s-master01 ~]# systemctl enable iptablesn[root@k8s-master01 ~]# iptables -F n[root@k8s-master01 ~]# service iptables saven[root@k8s-master01 ~]# setenforce 0n[root@k8s-master01 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
1.4 关闭swap分区
#临时关闭n[root@k8s-master01 ~]# swapoff -an#永久关闭n[root@k8s-master01 ~]# sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstabn#确认,是否关闭n[root@k8s-master01 ~]# free -m
1.5 调整 swappiness 参数
# 临时生效n[root@k8s-master01 ~]# echo 0 > /proc/sys/vm/swappinessn# 永久生效n[root@k8s-master01 ~]# vi /etc/sysctl.confnvm.swappiness=0n# 使配置生效n[root@k8s-master01 ~]# sysctl -p
1.6 调整内核参数,对于k8s
[root@k8s-master01 ~]# vi kubernetes.conf nnet.bridge.bridge-nf-call-iptables=1nnet.bridge.bridge-nf-call-ip6tables=1nnet.ipv4.ip_forward=1nnet.ipv4.tcp_tw_recycle=0n#禁止使用 swap 空间,只有当系统 OOM 时才允许使用它nvm.swappiness=0n#不检查物理内存是否够用nvm.overcommit_memory=1n# 开启 OOMnvm.panic_on_oom=0nfs.inotify.max_user_instances=8192nfs.inotify.max_user_watches=1048576nfs.file-max=52706963nfs.nr_open=52706963nnet.ipv6.conf.all.disable_ipv6=1nnet.netfilter.nf_conntrack_max=2310720nn[root@k8s-master01 ~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.confn[root@k8s-master01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
⚠️ 错误及解决
[root@k8s-master01 ~]# modprobe br_netfilter
1.7 调整系统时区
# 设置系统时区为 中国/上海n[root@k8s-master01 ~]# timedatectl set-timezone Asia/Shanghain# 将当前的 UTC 时间写入硬件时钟n[root@k8s-master01 ~]# timedatectl set-local-rtc 0n# 重启依赖于系统时间的服务n[root@k8s-master01 ~]# systemctl restart rsyslogn[root@k8s-master01 ~]# systemctl restart crond
1.8 关闭系统不需要服务
[root@k8s-master01 ~]# systemctl stop postfixn[root@k8s-master01 ~]# systemctl disable postfix
1.9 设置日志保存方式
# 创建保存日志的目录n[root@k8s-master01 ~]# mkdir /var/log/journaln# 创建配置文件存放目录n[root@k8s-master01 ~]# mkdir /etc/systemd/journald.conf.dn# 创建配置文件n[root@k8s-master01 ~]# cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOFn[Journal]n# 持久化保存到磁盘nStorage=persistentn# 压缩历史日志nCompress=yesnSyncIntervalSec=5mnRateLimitInterval=30snRateLimitBurst=1000n# 最大占用空间 10GnSystemMaxUse=10Gn# 单日志文件最大 200MnSystemMaxFileSize=200Mn# 日志保存时间 2 周nMaxRetentionSec=2weekn# 不将日志转发到 syslognForwardToSyslog=nonEOF
1.10 升级系统内核为最新版本
[root@k8s-master01 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpmn# 安装内核n[root@k8s-master01 ~]# yum --enablerepo=elrepo-kernel install -y kernel-ltn# 查看当前的所有内核版本,没有可尝试再次安装n[root@k8s-master01 ~]# cat /boot/grub2/grub.cfg | grep menuentryn# 设置开机从新内核启动n[root@k8s-master01 ~]# grub2-set-default 'CentOS Linux (5.4.127-1.el7.elrepo.x86_64) 7 (Core)'n# 重启n[root@k8s-master01 ~]# rebootn# 查看系统版本n[root@k8s-master01 ~]# uname -r
1.11 kube-proxy 开启 ipvs 前置条件
[root@k8s-master01 ~]# modprobe br_netfiltern[root@k8s-master01 ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOFn#!/bin/bashnmodprobe -- ip_vsnmodprobe -- ip_vs_rrnmodprobe -- ip_vs_wrrnmodprobe -- ip_vs_shnmodprobe -- nf_conntracknEOFn[root@k8s-master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules n[root@k8s-master01 ~]# bash /etc/sysconfig/modules/ipvs.modulesn# 使用lsmod命令查看这些文件是否被引导n[root@k8s-master01 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.docker部署
2.1 安装docker
[root@k8s-master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2n# 添加aliyun镜像仓库n[root@k8s-master01 ~]# yum-config-manager n--add-repo nhttp://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repon[root@k8s-master01 ~]# yum update -y && yum install -y docker-cen# 启动dockern[root@k8s-master01 ~]#systemctl start dockern[root@k8s-master01 ~]#systemctl enable docker
2.2 设置docker daemon文件
# 更新daemon.json文件n[root@k8s-master01 ~]# cat > /etc/docker/daemon.json <<EOFn{n"exec-opts": ["native.cgroupdriver=systemd"],n"log-driver": "json-file",n"log-opts": {n"max-size": "100m"n}n}nEOFn# 创建,存储docker配置文件n[root@k8s-master01 ~]# mkdir -p /etc/systemd/system/docker.service.dn# 重启docker服务n[root@k8s-master01 ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker
3. 安装kubeadm
# 更新yum源n[root@k8s-master01 ~]# cat > /etc/yum.repos.d/kubernetes.repo <<EOFn[kubernetes]nname=Kubernetesnbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64nenabled=1ngpgcheck=0nrepo_gpgcheck=0ngpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpgnhttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgnEOFn# 安装kubeadm、kubelet、kubectln[root@k8s-master01 ~]# yum update -yn[root@k8s-master01 ~]# yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1n# 启动 kubeletn[root@k8s-master01 ~]# systemctl enable kubelet.service && systemctl start kubelet
4. 集群安装
上传镜像压缩包,把压缩包中的镜像导入到本地镜像仓库:kubeadm-basic.images.tar.gz
百度网盘链接:链接:https://pan.baidu.com/s/1SplTajkPv_RH96fozmMoLA 提取码:grcd
写一个脚本导入镜像
[root@k8s-master01 ~]# vi load-images.sh n#!/bin/bashnls /root/kubeadm-basic.images > /tmp/images-list.txtncd /root/kubeadm-basic.imagesnnfor i in $( cat /tmp/images-list.txt )ndon docker load -i $indonenrm -rf /tmp/images-list.txt
导入镜像
[root@k8s-master01 ~]# chmod +x load-images.shn[root@k8s-master01 ~]# ./load-images.sh
初始化主节点 只需要在主节点执行
[root@k8s-master01 ~]# kubeadm config print init-defaults > kubeadm-config.yaml
修改模板
localAPIEndpoint:n advertiseAddress: 192.168.66.10 # 注意:修改配置文件的IP地址nkubernetesVersion: v1.15.1 #注意:修改版本号,必须和kubectl版本保持一致nnetworking:n # 指定flannel模型通信 pod网段地址,此网段和flannel网段一致n podSubnet: "10.244.0.0/16"n serviceSubnet: "10.96.0.0/12"nn---n#指定使用ipvs网络进行通信napiVersion: kubeproxy.config.k8s.io/v1alpha1nkind: kubeProxyConfigurationnfeatureGates:n SupportIPVSProxyMode: truenmode: ipvs
开始初始化 指定初始化的配置文件
[root@k8s-master01 ~]# kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
kubernetes主节点初始化成功后,如下所示:
按照k8s指示,执行下面的命令:
初始化成功后执行如下命令
[root@k8s-master01 ~]# mkdir -p $HOME/.kuben[root@k8s-master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/confign[root@k8s-master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/confign[root@k8s-master01 ~]# kubectl get nodenNAME STATUS ROLES AGE VERSIONnk8s-master01 NotReady master 2m9s v1.15.1
整理一下文件,把k8s初始化配置和日志保存起来。
[root@k8s-master01 ~]# mkdir install-k8sn[root@k8s-master01 ~]# mv kubeadm-config.yaml kubeadm-init.log install-k8s/n[root@k8s-master01 ~]# cd install-k8s/n[root@k8s-master01 install-k8s]# mkdir coren[root@k8s-master01 install-k8s]# mv kubeadm-* core/n[root@k8s-master01 install-k8s]# mkdir pluginn[root@k8s-master01 install-k8s]# mkdir flanneln[root@k8s-master01 install-k8s]# cd flannel/
flannel插件
#部署flannel网络插件 — 只需要在主节点执行
[root@k8s-master01 flannel]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymln[root@k8s-master01 flannel]# kubectl create -f kube-flannel.yml npodsecuritypolicy.policy/psp.flannel.unprivileged creatednclusterrole.rbac.authorization.k8s.io/flannel creatednclusterrolebinding.rbac.authorization.k8s.io/flannel creatednserviceaccount/flannel creatednconfigmap/kube-flannel-cfg createdndaemonset.apps/kube-flannel-ds createdn[root@k8s-master01 flannel]# kubectl get pod -n kube-systemnNAME READY STATUS RESTARTS AGEncoredns-5c98db65d4-4hmsx 1/1 Running 0 6m1sncoredns-5c98db65d4-qw8lf 1/1 Running 0 6m1snetcd-k8s-master01 1/1 Running 0 4m54snkube-apiserver-k8s-master01 1/1 Running 0 5m5snkube-controller-manager-k8s-master01 1/1 Running 0 5m3snkube-flannel-ds-752lb 1/1 Running 0 45snkube-proxy-fcxnl 1/1 Running 0 6mnkube-scheduler-k8s-master01 1/1 Running 0 4m52sn[root@k8s-master01 flannel]# kubectl get nodenNAME STATUS ROLES AGE VERSIONnk8s-master01 Ready master 6m47s v1.15.1
查看网卡信息,就会发现多了一个flannel
加入主节点以及其余工作节点,执行安装日志中的命令即可
#查看日志文件n[root@k8s-master01 core]# cat kubeadm-init.logn# 复制命令到其他几个node节点进行执行即可n[root@k8s-node01 ~]# kubeadm join 192.168.140.128:6443 --token abcdef.0123456789abcdef n --discovery-token-ca-cert-hash sha256:a3d9827be411208258aea7f3ee9aa396956c0a77c8b570503dd677aa3b6eb6d8
在master查看节点
[root@k8s-master01 flannel]# kubectl get nodenNAME STATUS ROLES AGE VERSIONnk8s-master01 Ready master 14m v1.15.1nk8s-node01 Ready <none> 4m10s v1.15.1nk8s-node02 Ready <none> 46s v1.15.1
可能问题:
- 安装过程中出现下列问题时
此报错是因为安装Kubeadm Init的时候,没有增加 --pod-network-cidr 10.244.0.0/16
参数或者kube-flannel.yml
如果yml中的"Network": "10.244.0.0/16"
和--pod-network-cidr
不一样
解决方案:
修改静态pod kube-controller-manager配置
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
添加启动参数如下:
- --allocate-node-cidrs=true n- --cluster-cidr=10.244.0.0/16
此处指定后,controller-manger会为集群下的每一个node分配一个子网段,体现在 kubectl get node k8s-node01 -o yaml | grep -i cid
2. 虚拟机ip变动问题
3. 向集群添加工作节点时
可能原因1:
kubeadm在使用过程中token的有效期只有24h,需要重新生成
kubeadm token create