01 使用kubeadm搭建K8s集群
1.1 版本选择
centos7 Docker Community: 20.10.7 K8s Version: v1.23.14 Calico Version: v3.201.2 准备台centos机器
配置要求:每台机器至少2C2G,不然运行不起来
192.168.0.51 master
192.168.0.52 worker01
192.168.0.53 worker02
1.3 安装Docker
3台机器
参考Docker安装文档[略]
1.4 安装依赖和更新
3台机器
yum -y update yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp1.5 修改hosts文件
(1)master
sudo hostnamectl set-hostname m vi /etc/hosts 192.168.0.51 m 192.168.0.52 w1 192.168.0.53 w2(2)2台worker
sudo hostnamectl set-hostname w1/w2 vi /etc/hosts 192.168.0.51 m 192.168.0.52 w1 192.168.0.53 w2(3)彼此ping测试一下
1.6 系统基础配置
3台机器
# (1)关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # (2)关闭selinux 【SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。】 setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # (3)关闭swap 【在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。】 swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # (4)配置iptables的ACCEPT规则 iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT # (5)设置系统参数 cat </etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system 1.7 配置K8s的yum源
3台机器
cat </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 EOF 1.8 安装kubeadm、kubectl和kubelet
3台机器
kubeadm: the command to bootstrap the cluster.
kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.
kubectl: the command line util to talk to your cluster.
(1)列出可以安装的版本
yum list kubeadm --showduplicates | sort -r(2)安装kubeadm、kubectl和kubelet
yum install -y kubeadm-1.23.14 kubelet-1.23.14 kubectl-1.23.141.9 设置Docker与K8s为同一个cgroup
3台机器
(1)Docker
# docker vi /etc/docker/daemon.json # 添加这行 "exec-opts": ["native.cgroupdriver=systemd"], # 重启docker systemctl restart docker(2)K8s
# kubelet sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 重启kubelet systemctl restart kubelet && systemctl enable kubelet1.10 准备安装K8s组件需要的image
3台机器
1.10.1 查看Components的镜像
kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.14 k8s.gcr.io/kube-controller-manager:v1.23.14 k8s.gcr.io/kube-scheduler:v1.23.14 k8s.gcr.io/kube-proxy:v1.23.14 k8s.gcr.io/pause:3.6 k8s.gcr.io/etcd:3.5.5-0 k8s.gcr.io/coredns/coredns:v1.8.61.10.2 解决镜像不能拉取的思路
我已经在阿里镜像仓库已经将具体的镜像下载好了,按照如下步骤下载转换一下即可
3台机器
sh ./kubeadm-pull-image.sh
#!/bin/bash set -e KUBE_VERSION=v1.23.14 KUBE_PAUSE_VERSION=3.6 ETCD_VERSION=3.5.5-0 ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/jack-kubernetes GCR_URL=k8s.gcr.io images=(kube-proxy:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-apiserver:${KUBE_VERSION} pause:${KUBE_PAUSE_VERSION} etcd:${ETCD_VERSION} ) for imageName in ${images[@]} ; do docker pull $ALIYUN_URL/$imageName docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName docker rmi $ALIYUN_URL/$imageName donedocker pull registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 docker tag registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6 docker rmi registry.cn-hangzhou.aliyuncs.com/jack-kubernetes/coredns:v1.8.61.11 搭建Master
Master Node
(1)初始化Master
kubeadm init --kubernetes-version=1.23.14 --apiserver-advertise-address=192.168.0.51 --pod-network-cidr=10.244.0.0/16(2)记录下join的内容
kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \ --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0(3)根据日志提示进行如下操作
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config(4)查看cluster-info和健康检查
kubectl cluster-info curl -k https://localhost:6443/healthz(5)查看系统Pod
kubectl get pods -n kube-system(6)kube init流程
# 进行一系列检查,以确定这台机器可以部署kubernetes # 生成kubernetes对外提供服务所需要的各种证书可对应目录 ls /etc/kubernetes/pki/* # 为其他组件生成访问kube-ApiServer所需的配置文件 ls /etc/kubernetes/ # 生成master节点需要的Pod文件。 ls /etc/kubernetes/manifests/*.yaml # 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。 # master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来 # 为集群生成一个bootstrap token # 将ca.crt等master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用 # 最后一步是安装默认插件。kubernetes默认kube-proxy和DNS两个插件是必须安装的(7)安装calico网络插件
# 选择网络插件 https://kubernetes.io/docs/concepts/cluster-administration/addons/ # calico网络插件 https://projectcalico.docs.tigera.io/getting-started/kubernetes/ # 提前拉取镜像 docker pull docker.io/calico/kube-controllers:v3.20.3 docker pull docker.io/calico/pod2daemon-flexvol:v3.20.3 docker pull docker.io/calico/node:v3.20.3 docker pull docker.io/calico/cni:v3.20.3 # 安装calico:v3.20 kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml # 查看calico是否安装成功 watch kubectl get pods --all-namespaces1.12 搭建Worker Node
(1)查看node状态
kubectl get nodes(2)在2台worker node上执行
kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \ --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0(3)查看node状态
kubectl get nodes -w1.13 K8s搭建之后的常见问题
1.13.1 Node NotReady
# 问题描述 kubectl get nodes NAME STATUS ROLES k8s-master Ready control-plane,master k8s-worker01 NotReadyk8s-worker02 NotReady # 问题排查思路 在NotReady的node上执行:journalctl -f -u kubelet 查看其出错可能的原因: (1)kubelet服务没有设置为开机启动:systemctl restart kubelet && systemctl enable kubelet (2)网络环境发生了变化 (3)机器资源不足 ... 1.13.2 Worker如何使用kubectl
# 问题描述,在w1节点上通过kubectl get pods查看资源,发现报错 The connection to the server localhost:8080 was refused - did you specify the right host or port? # 解决方案 需要在worker节点上添加可以操作集群的权限,具体设置如下: 切换到master上,cd ~ ---> cat .kube/config --->复制内容 切换到worker02上 cd ~ ---> 新建文件 .kube/config --->粘贴内容1.13.3 token忘记了怎么办
# token是用于worker节点加入master节点的凭证,默认有效期是24小时,格式如下 kubeadm join 192.168.0.51:6443 --token bi2z4y.nmwqwaz5e5scqhb3 \ --discovery-token-ca-cert-hash sha256:5791deaa7119c6536cd4869ea9a152b00ae4b70b1aa19750137a077e4c6afed0 # 查看token是否还在有效期内 kubeadm token list [root@~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION ykv2ae.fsa5wj7rrxrm1xsd 21h 2022-12-06T06:17:45Z authentication,signing The default bootstrap token generated by 'kubeadm init'. # 如果在有效期内,则生成一个token-hash,和token一起组成用于join的内容 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # 如果token已经过期了,则先生成一个新的token和token-hash,用于join的内容 kubeadm token create --print-join-command kubeadm token list # 默认token有效期是24小时,如果想设置有效期,则可以通过--ttl来设置,0表示永不过期 kubeadm token create --print-join-command --ttl=0 # 如果要删除token,则执行如下命令 kubeadm token delete 3nc3wu.pfn3mlgxafuut606