暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubeadm安装k8s集群v1.23.6

原创 我为啥没洁癖 2023-12-26
674

kubeadm管理集群

kubeadm,原理和 minikube 类似,也是用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。而在保持这个高水准的同时,kubeadm 还具有了和 minikube 一样的易用性,只要很少的几条命令,如 init、join、upgrade、reset 就能够完成 Kubernetes 集群的管理维护工作,这让它不仅适用于集群管理员,也适用于开发、测试人员

环境

  • centos7

  • 3台主机,2G内存40G硬盘

    #node1,作为master 192.168.10.115 #node2 192.168.10.116 #node3 192.168.10.117
    复制
  • Docker版本20+,k8s版本1.23.6

    k8s从1.24版本开始不支持Docker,支持CRI规范,需要Docker适配。

初始化

所有需要加入k8s的节点都需要进行初始化。

# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux # 永久 sed -i 's/enforcing/disabled/' /etc/selinux/config # 临时 setenforce 0 # 关闭swap # 临时 swapoff -a # 永久 sed -ri 's/.*swap.*/#&/' /etc/fstab # 关闭完swap后,一定要重启一下虚拟机!!! reboot # 根据规划设置主机名 hostnamectl set-hostname <hostname> # 在master添加hosts cat >> /etc/hosts << EOF 192.168.10.115 node1 192.168.10.116 node2 192.168.10.117 node3 EOF # 将桥接的IPv4流量传递到iptables的链 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 生效 sysctl --system # 时间同步 yum install ntpdate -y ntpdate time.windows.com
复制

安装

所有需要加入k8s的节点都需要进行安装需要的组件。

安装Docker

参考Docker文档安装即可。

添加k8s源

使用阿里的国内k8s源

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 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
复制

安装kubeadm,kubelet,kubectl

yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 systemctl enable kubelet # 配置关闭 Docker 的 cgroups,修改 /etc/docker/daemon.json,加入以下内容 vim /etc/docker/daemon.json "exec-opts": ["native.cgroupdriver=systemd"] # 重启 docker systemctl daemon-reload&&systemctl restart docker
复制

启动集群

启动master

  • --apiserver-advertise-address需要指定当前master节点的ip
  • --image-repository 指定下载镜像的仓库地址
  • --service-cidr 指定svc网段
  • --pod-network-cidr 指定pod网段
# 在 Master 节点下执行 kubeadm init \ --apiserver-advertise-address=192.168.10.115 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.6 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16 # 安装成功后,复制如下配置并执行 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 获取集群节点信息 kubectl get nodes
复制

集群启动成功标识:

image-20231207122624316

节点加入集群

正常情况下,master初始化成功后会有加入集群的提示命令,见上节启动成功标识。

如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请token和查询--discovery-token-ca-cert-hash

# 如果 token 已经过期,就重新申请 kubeadm token create # token 没有过期可以通过如下命令获取 kubeadm token list # 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256: openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
复制

image-20231207125553366

image-20231207130326373

将token和--discovery-token-ca-cert-hash进行拼接即可得到节点加入集群的命令。

# 加入集群,在node2 和node3 执行加入集群的操作。 kubeadm join 192.168.10.115:6443 --token api3ki.pc8rj4xjj85dqzfo --discovery-token-ca-cert-hash sha256:98e63486b39a238a504ece51ce218aec77a55e737bb8eea5cdbab138b8847f92
复制

image-20231207130527423

部署 CNI 网络插件

k8s集群初始化完成后节点状态都是NotReady。是因为kube-system下的CNI网络pod未正常运行导致网络有问题。

CNI是容器网络接口,作用是实现容器跨主机网络通信。

kubectl get pods -n kube-system
复制

image-20231207140612816

此时需要安装CNI 网络插件。CNI 网络插件最常用的是calicoflannel

# kubeadm的配置信息存在config-map中 kubectl -n kube-system describe cm kubeadm-config |grep -i pod # 查看pod网段和svc网段 kubectl -n kube-system describe cm kubeadm-config |grep -i net
复制

calico

需要先下载获取calico.yaml配置文件。

# 在 master 节点上执行 # 下载 calico 配置文件,可能会网络超时。可以单独下载 curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O
复制

修改文件,需要让calico管理的pod子网和k8s集群的一致。并且指定calico使用的网卡。找到配置文件路径kind: DaemonSet>containers>env。编辑节点的环境配置。参考文档

  • CALICO_IPV4POOL_CIDR pod子网网端
  • IP_AUTODETECTION_METHOD 选用网卡
# CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同。新版默认是注释放开 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" # 修改 IP_AUTODETECTION_METHOD 下的网卡名称。新版没有IP_AUTODETECTION_METHOD在CALICO_IPV4POOL_CIDR下面新增。 # interface指定节点192,168.10.xx对应的网卡enp0s3 - name: IP_AUTODETECTION_METHOD value: interface=enp0s3 #查看所有iamge信息 grep image calico.yaml # 删除镜像 docker.io/ 前缀,避免下载过慢导致失败 sed -i 's#docker.io/##g' calico.yaml
复制

部署调整后的配置文件calico.yaml

#可以提前在所有节点将镜像pull下来 docker pull calico/node:v3.26.1 #部署前会先去下载镜像calico/node:v3.26.1 kubectl apply -f calico.yaml #查看所有node状态Ready kubectl get nodes #查看system空间所有pod是running状态 kubectl get pods -n kube-system
复制

可能出现的问题

  • /var/lib/calico/nodename不存在。

    直接在每个节点上新建文件/var/lib/calico/nodename,文件内输入节点的hostname。

    #对应node1是node1,node2就是node2 echo 'node1' > /var/lib/calico/nodename
    复制
  • pod失败后刷新

#删除全部后重新apply kubectl delete -f calico.yaml #移除指定的pod,删除了pod后k8s会自动调度,任何pod都可以 kubectl delete pod ${pod_name} -n kube-system
复制

测试集群

# 部署一个测试的nginx kubectl create deployment nginx --image=nginx # 暴露端口 kubectl expose deployment nginx --port=80 --type=NodePort # 查看 pod 以及服务信息,根据暴露的端口映射到了32397。外部可以通过32397端口经过任意节点ip可以访问nginx kubectl get pod,svc
复制

image-20231207171833842

image-20231207171854889

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论