持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
安装
前提准备
- 本次使用两台主机搭建K8s集群,并且两台主机是可以互相连通的。
- 能够访问外网,因为需要拉取必要镜像
- 安装Linux系统,且内核版本在3.10 及以上
| 操作系统 | 主机名 | IP |
|---|---|---|
| centos7.9.2003(最小化安装) | master | 8.16.0.67 |
| centos7.9.2003(最小化安装) | slaver | 8.16.0.66 |
安装步骤
-
安装master
- 配置环境
- 安装containerd
- 安装kubectl、kubelet、kubeadm工具
- 进行kubeadm init
- 安装网络
-
安装node(同master,有小部分差别)
-
将node与master进行join
Master
-
配置环境
配置环境包括配置hosts,关闭一些不必要的服务。
#设置主机名 hostnamectl set-hostname master #添加hosts解析 cat >> /etc/hosts << EOF 8.16.0.67 master 8.16.0.66 slaver EOF ping -c4 master #同步时间 yum -y install ntp systemctl start ntpd && systemctl enable ntpd && systemctl status ntpd #关闭防火墙 systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld #永久关闭seLinux(需重启系统生效) setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config #关闭swap swapoff -a # 临时关闭 sed -i 's/.*swap.*/#&/g' /etc/fstab #加载IPVS模块 yum -y install ipset ipvsadm cat > /etc/sysconfig/modules/ipvs.modules <<EOF modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4 -
安装
containerd可以将
containerd换成docker,因为docker附带了containerd(文章结尾附带了Docker版),containerd即将成为趋势。cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF # 载入必要模块 sudo modprobe overlay sudo modprobe br_netfilter cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF sudo sysctl --system yum install -y wget # 配置软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # yum list |grep containerd # 安装containerd yum -y install containerd.io.x86_64 mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 使用 systemd cgroup 驱动程序 sed -i '/runc.options/a\ SystemdCgroup = true' /etc/containerd/config.toml && \ grep 'SystemdCgroup = true' -B 7 /etc/containerd/config.toml # 更改sandbox_image sed -ri 's#k8s.gcr.io/pause:3.2#registry.aliyuncs.com/google_containers/pause:3.6#' /etc/containerd/config.toml # endpoint位置添加阿里云的镜像源 sed -ri 's#https://registry-1.docker.io#https://registry.aliyuncs.com#' /etc/containerd/config.toml systemctl daemon-reload systemctl enable containerd --now systemctl status containerdTips:启动可能会有问题,是因为sed命令没有生效,那么可以手动修改/etc/containerd/config.toml,增加
endpoint、sandbox_image值,查看SystemdCgroup是否重复。[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://registry.aliyuncs.com"] [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"cgroups是docker使用的核心技术之一,其名称源自控制组群(英语:control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。
-
安装kubectl、kubelet、kubeadm工具
kubeadm:用来初始化集群的指令。kubelet:在集群中的每个节点上用来启动 Pod 和容器等。kubectl:用来与集群通信的命令行工具。
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 EOF yum list kubeadm --showduplicates | sort -r yum -y install kubeadm-1.23.1-0 kubelet-1.23.1-0 kubectl-1.23.1-0 systemctl enable --now kubelet systemctl status kubeletTips:执行
systemctl enable --now kubelet可能会无法启动,kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。执行第四步后,再查看状态。 -
kubeadm初始化及安装网络
#设置crictl cat << EOF >> /etc/crictl.yaml runtime-endpoint: unix:///var/run/containerd/containerd.sock image-endpoint: unix:///var/run/containerd/containerd.sock timeout: 10 debug: false EOF mkdir ~/kubeadm_init && cd ~/kubeadm_init kubeadm init # 定义初始化文件 kubeadm config print init-defaults > kubeadm-init.yaml cat > kubeadm-init.yaml << EOF apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 8.16.0.67 bindPort: 6443 nodeRegistration: criSocket: /run/containerd/containerd.sock name: 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: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.23.1 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF # 查看所需镜像列表 kubeadm config images list --config kubeadm-init.yaml # 预拉取镜像 kubeadm config images pull --config kubeadm-init.yaml ctr -n k8s.io i ls -q crictl images crictl ps -a # 执行kubeadm初始化 kubeadm init --config=kubeadm-init.yaml mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 安装网络 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlTips:
crictl是containerd兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。- init后会生成join语句
kubeadm join 8.16.0.67:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:db42cac7470d6df1bb187db2aa89f9204f7de13d1ca28abc435d462bf72e651c