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
复制
集群启动成功标识:
节点加入集群
正常情况下,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/^.* //'
复制
将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
复制
部署 CNI 网络插件
k8s集群初始化完成后节点状态都是NotReady。是因为kube-system
下的CNI
网络pod未正常运行导致网络有问题。
CNI是容器网络接口,作用是实现容器跨主机网络通信。
kubectl get pods -n kube-system
复制
此时需要安装CNI 网络插件。CNI 网络插件最常用的是calico
和flannel
。
# 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
复制