今天按照网上的教程使用kubeadm安装了K8s集群,记录安装操作如下:
附上原地址:https://www.kubernetes.org.cn/5551.html
准备工作
- 资源准备
IP | 主机名 | 系统
--------- | --------- | ---------
192.168.8.117 | master-192-168-8-117 | centos7
192.168.8.52 | node-192-168-8-52 | centos7
192.168.8.38 | node-192-168-8-38 | centos7
配置主机名后,在每个机器上添加hosts,如下:
192.168.8.117 master-192-168-8-117
192.168.8.38 node-192-168-8-38
192.168.8.52 node-192-168-8-52
- 关闭防火墙、selinux
systemctl stop firewalld
systemctl disable firewalls
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
注意:修改selinux/config文件后需要重启系统生效,临时调整使用setenforce 0
- 调整内核参数
在/etc/sysctl.conf文件中增加以下内容,加载br_netfilter内核模块后通过sysctl使变更生效。
K8s从1.8开始要求系统关闭swap,否则kubelet无法启动,通过swapoff -a
命令关闭,并在/etc/fstab
文件中删除开机自动装载,并修改swappiness参数
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
modprobe br_netfilter
sysctl -p
注:如实在不想关闭swap,或对机器上其他应用有影响,可修改kubelet配置,去掉对swap的限制,修改/etc/sysconfig/kubelet,加上如下配置
KUBELET_EXTRA_ARGS=--fail-swap-on=false
- 准备ipvs环境
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
通过lsmod | grep -e ip_vs -e nf_conntrack_ipv4
命令查看系统是否成功加载响应模块
另外需要安装ipvsadm用于管理ipvs配置
如果以上条件无法满足,及时kube-proxy开启了ipvs,也会回退到iptables
- 安装docker
导入docker repo文件后通过yum进行安装
yum install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce
systemctl enable docker
- 修改docker 的cgroup driver
根据官方的文档内容,在systemd为init system的系统中,只是用systemd作为docker的cgroup driver,可以让服务器节点在资源紧张的情况下更加稳定,
创建以下文件内容/etc/docker/daemon.json
{"exec-opts": ["native.cgroupdrivers=systemd"] }
重启docker后可以通过docker info
命令查看
安装K8s
- 安装kubeadm、kubelet、kubectl
这里使用阿里云的镜像站进行安装,先配置yum repo
[K8s]
name = K8s repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
设置kubelet的开机自启动
systemctl enable kubelet
- 初始化集群
使用kubeadm config print init-defaults
可以获取到集群的默认配置,基于此配置,我们可以自行调整策略,简述如下kubeadm.yaml:
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.8.117 #定义API地址为master节点
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master-192-168-8-117
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.0 #修改版本号,默认还是v1.14
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12 #定义service/pod的网络地址,其中pod地址必须和后面的flannel地址段相同
podSubnet: 10.244.0.0/16
scheduler: {}
使用命令kubeadm init --config kubeadm.yaml
命令即可进入集群初始化阶段;
安装命令输出的提示,创建~/.kube
目录,并复制kube.config文件到目录下就完成了kubelet的配置。
最后的节点加入集群的命令一定要保存下来,后续如需要扩容也通过改命令完成;
因默认使用的镜像无法正常访问,我们可以先把镜像从阿里云镜像站pull下来,在修改tag的方式;
使用kubeadm config images list
命令获取到安装所需的镜像列表,并写入image.list文件,将以下脚本copy到同目录下执行即可
cat image.list | while read line
do
aliImage=`echo $line |sed "s/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/g"`
docker pull $aliImage
docker tag $aliImage $line
done
初始化完成后可通过命令查看集群状态
kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
- 安装flannel
下载flannel.yml文件直接通过kubectl命令安装即可
curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
如果集群存在多个网卡,需要在kube-flannel.yml中指定内网网卡,在flannel的启动参数中增加-iface=eth0
使用kubectl get pod -n kube-system
可以查看flannel的pod处于running状态即安装成功,
此时通过kubectl get node
可以看到master节点已经处于ready状态
- 增加node节点
使用前面初始化完成后输出的kubeadm join命令在node节点上执行,就完成了node节点加入集群的操作 - 移除节点
先在master节点上执行
kubectl drain node-192-168-8-52 --delete-local-data --force --ignore-daemonsets
kubectl delete node node-192-168-8-52
在node节点上清空配置
kubeadm reset
ifconfig flannel.1 down
ip link delete flannel.1
在其他node上执行
kubeadm delete node node-192-168-8-52
- 开启ipvs
如果前面ipvs相关的准备都正确完成,在这里就可以修改kubeproxy的配置使用ipvs
kubectl edit configmap kube-proxy -n kube-system
将其中的mode修改为mode:"ipvs"
再重启各节点上的kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
重启完成,后查看kube-proxy的log日志,如有输出Using ipvs Proxier说明已经开启了ipvs,
在node上可以通过ipvsadm -Ln查看转发配置