K8S集群环境搭建记录
使用kubeadm工具搭建K8S一主二从集群,一个master和两个node。
环境初始化
1. 检查系统版本:Centos版本要在7.5或之上
[root@K8SMASTER ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
2. 主机名解析:方便集群节点间的直接调用
编辑/etc/hosts文件,添加信息
192.168.255.100 K8SMASTER #master 192.168.255.101 K8SNODE1 #node1 192.168.255.102 K8SNODE2 #node2
3. 时间同步:K8S集群要求节点时间完全一致
[root@K8SMASTER ~]# systemctl start chronyd [root@K8SMASTER ~]# systemctl enable chronyd
# 检查时间是否同步 [root@K8SMASTER ~]# date
4. 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 关闭firewalld服务 [root@K8SMASTER ~]# systemctl stop firewalld [root@K8SMASTER ~]# systemctl disable firewalld # 关闭iptables服务 [root@K8SMASTER ~]# systemctl stop iptables [root@K8SMASTER ~]# systemctl disable iptables
5.禁用selinux
关闭它是为了集群不出现“奇葩”问题
编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
[root@K8SMASTER ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled
6.禁用swap分区
配置文件/etc/fstab,注释掉swap分区一行
[root@K8SMASTER ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Dec 26 13:29:15 2022 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos_k8smaster-root / xfs defaults 0 0 UUID=b0222930-ea77-4644-bdfc-09ac2d109da9 /boot xfs defaults 0 0 #/dev/mapper/centos_k8smaster-swap swap swap defaults 0 0
7. 添加网桥过滤和地址转发功能
编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置
[root@K8SMASTER ~]# cat /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # 重新加载配置 [root@K8SMASTER ~]# sysctl -p # 加载网桥过滤模块 [root@K8SMASTER ~]# modprobe br_netfilter # 查看网桥过滤模块是否加载成功 [root@K8SMASTER ~]# lsmod | grep br_netfilter
8. 配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
# 1 安装ipset和ipvsadm [root@K8SMASTER~]# yum install ipset ipvsadmin -y # 2 添加需要加载的模块写入脚本文件 [root@K8SMASTER~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # 3 为脚本文件添加执行权限 [root@K8SMASTER~]# chmod +x /etc/sysconfig/modules/ipvs.modules # 4 执行脚本文件 [root@K8SMASTER~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5 查看对应的模块是否加载成功 [root@K8SMASTER~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9. 重启服务器
上面步骤完成之后,需要重新启动linux系统
安装docker
# 1 切换镜像源 [root@K8SMASTER~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 2 查看当前镜像源中支持的docker版本 [root@K8SMASTER~]# yum list docker-ce --showduplicates # 3 安装特定版本的docker-ce # 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本 [root@K8SMASTER~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y # 4 添加一个配置文件 # Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs [root@K8SMASTER~]# mkdir /etc/docker [root@K8SMASTER~]# cat <<EOF > /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"] } EOF # 5 启动docker [root@K8SMASTER~]# systemctl restart docker [root@K8SMASTER~]# systemctl enable docker # 6 检查docker状态和版本 [root@K8SMASTER~]# docker version
安装kubernetes组件
先切换成切换成国内的镜像源,编辑/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
# 安装kubeadm、kubelet和kubectl [root@K8SMASTER ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y # 配置kubelet的cgroup # 编辑/etc/sysconfig/kubelet,添加下面的配置 KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" # 4 设置kubelet开机自启 [root@K8SMASTER ~]# systemctl enable kubelet
准备集群镜像
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@K8SMASTER~]# kubeadm config images list
下载镜像
images=( kube-apiserver:v1.17.4 kube-controller-manager:v1.17.4 kube-scheduler:v1.17.4 kube-proxy:v1.17.4 pause:3.1 etcd:3.4.3-0 coredns:1.6.5 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
集群初始化
开始对集群进行初始化,并将node节点加入到集群中
在master操作如下
# 创建集群 [root@K8SMASTER ~]# kubeadm init \ --kubernetes-version=v1.17.4 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=192.168.255.100 # 创建必要文件 [root@K8SMASTER ~]# mkdir -p $HOME/.kube [root@K8SMASTER ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@K8SMASTER ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
在node操作如下
# 将node节点加入集群 [root@K8SMASTER ~]# kubeadm join 192.168.255.100:6443 \ --token 8507uc.o0knircuri8et2312 \ --discovery-token-ca-cert-hash \ sha256:acc37967fb5b0acf39d7598f8a439cc7dc88f439a3f4d0c9caeafafaf1
查看集群状态
[root@K8SMASTER ~]# kubectl get nodes
安装网络插件
安装flannel,也在master节点操作
使用KEXUE上网的方式获取指定yaml:https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改yml中的仓库为国内源:quay.io仓库为quay-mirror.qiniu.com
# 使用配置文件启动fannel [root@K8SMASTER~]# kubectl apply -f kube-flannel.yml
kubernetes的集群环境搭建完成
部署Nginx测试
# 部署nginx [root@K8SMASTER ~]# kubectl create deployment nginx --image=nginx:1.17.2 # 暴露端口 [root@K8SMASTER ~]# kubectl expose deployment nginx --port=80 --type=NodePort