k8s集群搭建1.27.1版本(来源于图灵k8s笔记)
目前比较常用的是flannel和calico,flannel的功能比较简单,不具备复杂网络的配置能力,不支持网络策略;calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。访问Nginx地址: http://任意节点的i
一、环境准备
准备虚拟机环境 centos7虚拟机详细安装教程(包含网络设置-仅主机模式)
二、服务器环境设置
1.关闭防火墙(所有节点)
关闭防火墙并设置开机不启动
systemctl stop firewalld
systemctl disable firewalld
2.关闭swap分区(所有节点)
修改后重启服务器生效
swapoff -a
vim /etc/fstab #永久禁用swap,删除或注释掉/etc/fstab里的swap设备的挂载命令即可
#/dev/mapper/centos-swap swap swap defaults 0 0
设置完成后查询swap分区,结果swap一行都是0即是正确的
3.Centos7内核升级(所有节点)
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,还有会造成kube-proxy不能转发流量
#查看现在的内核版本
[root@k8s-master ~]#uname -a
Linux localhost.localdomain 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
#查看 yum 中可升级的内核版本
yum list kernel --showduplicates
#如果list中有需要的版本可以直接执行 update 升级,多数是没有的,所以要按以下步骤操作
#导入ELRepo软件仓库的公共秘钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#Centos7系统安装ELRepo
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
#Centos8系统安装ELRepo
yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
#查看ELRepo提供的内核版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#kernel-lt:表示longterm,即长期支持的内核
#kernel-ml:表示mainline,即当前主线的内核
#安装主线内核(32位安装kernek-ml)
yum --enablerepo=elrepo-kernel install kernel-ml.x86_64
#查看系统可用内核,并设置启动项
[root@k8s-master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.9.2-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-6.9.2-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.71.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.71.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-dd6f96846f6c40f6826515187afe5db3
Found initrd image: /boot/initramfs-0-rescue-dd6f96846f6c40f6826515187afe5db3.img
done
[root@k8s-master ~]# sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.9.2-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-dd6f96846f6c40f6826515187afe5db3) 7 (Core)
#指定开机启动内核版本
cp /etc/default/grub /etc/default/grub-bak #备份
grub2-set-default 0 #设置默认内核版本
#重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg
#更新软件包并重启系统
yum makecache
reboot
#验证内核
[root@k8s-master ~]# uname -a
Linux localhost.localdomain 6.9.2-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Sat May 25 22:54:44 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux
4.设置主机名(所有节点)
#注意每个节点的名字要不一样
hostnamectl set-hostname k8s-master
# 配置hosts
vim /etc/hosts
192.168.137.20 k8s-master
192.168.137.21 k8s-node1
192.168.137.22 k8s-node2
5.时间同步(所有节点)
yum install ntpdate -y && ntpdate time.windows.com
6.配制iptables规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
#设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 网桥生效
sysctl --system
三、安装docker(所有节点)
1.安装docker-ce
#安装需要的软件包, yum-util 提供yum-config-manager功能
yum install -y yum-utils
# 设置yum源,并更新 yum 的包索引
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
# 查看仓库中docker版本,选择安装指定版本
yum list docker-ce --showduplicates | sort -r
# 安装docker指定版本
yum install -y docker-ce-3:24.0.2-1.el7.x86_64
2.配制镜像加速和cgroup
我们可以借助阿里云的镜像加速器,登录阿里云(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台)
#没有则自己创建文件
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://jbw52uwf.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
#"exec-opts": ["native.cgroupdriver=systemd"]为docker使用cgroup的方式,k8s使用方式也是systemd,两边要一致
#重启docker
systemctl restart docker
systemctl enable docker
镜像加速器地址可以改成你自己的加速器地址
四、安装cri-dockerd(所有节点)
k8s官方表示1.24版本以上以不安装cri,这里需要手动安装
#https://github.com/Mirantis/cri-dockerd/releases
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
#修改/usr/lib/systemd/system/cri-docker.service文件中的ExecStart配置
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload
systemctl enable --now cri-docker
五、yum安装kubeadm、kubelet、kubectl(所有节点)
# 将 SELinux 设置为 permissive 模式
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#配置k8s yum源
vim /etc/yum.repos.d/kubernetes.repo
[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
#查看kubeadm有什么版本
yum list --showduplicates | grep kubeadm
#不指定版本默认为最新版本,安装k8s1.27.1
sudo yum install -y kubelet-1.27.1 kubeadm-1.27.1 kubectl-1.27.1
#配置开机自启
sudo systemctl enable --now kubelet
#指定容器运行时为containerd
crictl config runtime-endpoint /run/containerd/containerd.sock
#查看版本
kubeadm version
#指定镜像仓库地址,k8s将提前从该地址拉取k8s所需的镜像
kubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --cri-socket unix:///var/run/cri-dockerd.sock
六、初始化master节点的控制面板(master节点)
# kubeadm init --help可以查看命令的具体参数用法
#在master节点执行初始化(node节点不用执行)
#apiserver-advertise-address 指定apiserver的IP,即master节点的IP
#image-repository 设置镜像仓库为国内镜像仓库
#kubernetes-version 设置k8s的版本,跟kubeadm版本一致
#service-cidr 这是设置node节点的网络的,暂时这样设置
#pod-network-cidr 这是设置node节点的网络的,暂时这样设置
#cri-socket 设置cri使用cri-dockerd
kubeadm init \
--apiserver-advertise-address=192.168.137.20 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.27.1 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
# 可以查看kubelet日志
journalctl -xefu kubelet
执行后返回:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.137.20:6443 --token hw32j0.06iiw1e830icfrk0 \
--discovery-token-ca-cert-hash sha256:06bc39b1081b47e0dac685cc69746feede9bbf165c470507223a7af2dffbacbd
提示以上信息证明你初始化成功
# 在master节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
#在你要加入的node节点上执行,master节点不用执行
# --cri-socket unix:///var/run/cri-dockerd.sock 是一个配置选项,用于指定容器运行时接口 (CRI) 与 Docker 守护程序之间的通信方式。
kubeadm join 192.168.137.20:6443 --token hw32j0.06iiw1e830icfrk0 \
--discovery-token-ca-cert-hash sha256:06bc39b1081b47e0dac685cc69746feede9bbf165c470507223a7af2dffbacbd \
--cri-socket unix:///var/run/cri-dockerd.sock
#如果上面的令牌忘记了,或者新的node节点加入,在master上执行下面的命令,生成新的令牌
kubeadm token create --print-join-command
#查看所有命名空间的pod
kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-65dcc469f7-mff2n 1/1 Running 0 69m
kube-system coredns-65dcc469f7-r5gl9 1/1 Running 0 69m
kube-system etcd-k8s-m1 1/1 Running 1 71m
kube-system kube-apiserver-k8s-m1 1/1 Running 2 71m
kube-system kube-controller-manager-k8s-m1 1/1 Running 27 (70m ago) 71m
kube-system kube-proxy-np46m 1/1 Running 0 52s
kube-system kube-proxy-wbp65 1/1 Running 0 69m
kube-system kube-proxy-xwqc7 1/1 Running 0 2m5s
kube-system kube-scheduler-k8s-m1 1/1 Running 26 71m
#如果有pod启动失败,可以通过下面的命令查看pod的详细信息
kubectl describe pod coredns-65dcc469f7-mff2n -n kube-system
查询pod的日志
kubectl describe pod coredns-65dcc469f7-n5v6x -n kube-system
七、安装网络插件(我安装的是calico)
flannel和calico选择一种安装就行
目前比较常用的是flannel和calico,flannel的功能比较简单,不具备复杂网络的配置能力,不支持网络策略;calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。
1.flannel插件
# 下载flannel
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#更改network地址,是初始化时的pod地址范围
vim kube-flannel.yml
...
net-conf.json: |
{
"Network": "10.244.0.0/16", #更改为初始化pod的地址范围
"Backend": {
"Type": "vxlan"
}
}
...
#安装flannel
kubectl apply -f kube-flannel.yml
2.calico插件
# 下载calico.yaml
wget https://docs.projectcalico.org/v3.25/manifests/calico.yaml --no-check-certificate
#查看calico用到的镜像
grep image: calico.yaml
# 查询结果
image: docker.io/calico/cni:v3.25.0
image: docker.io/calico/cni:v3.25.0
image: docker.io/calico/node:v3.25.0
image: docker.io/calico/node:v3.25.0
image: docker.io/calico/kube-controllers:v3.25.0
#默认的calico.yaml清单文件无需手动配置Pod子网范围(如果需要,可通过CALICO_IPV4POOL_CIDR指定),默认使用
#kube-controller-manager的"–cluster-cidr"启动项的值,即kubeadm init时指定的"–pod-network-cidr"或清单文件中使用"podSubnet"的值。
vim calico.yaml
...
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16" #更改为初始化pod的地址范围
...
#安装calico.yaml
kubectl apply -f calico.yaml
#查看所有的pod
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-6c99c8747f-lkq25 1/1 Running 2 (4m14s ago) 10m
kube-system calico-node-854xw 1/1 Running 1 (4m47s ago) 10m
kube-system coredns-65dcc469f7-9w584 1/1 Running 0 60m
kube-system coredns-65dcc469f7-s44ww 1/1 Running 0 60m
kube-system etcd-k8s-m1 1/1 Running 1 60m
kube-system kube-apiserver-k8s-m1 1/1 Running 5 (63m ago) 60m
kube-system kube-controller-manager-k8s-m1 1/1 Running 44 (9m14s ago) 60m
kube-system kube-proxy-zqpvp 1/1 Running 0 60m
kube-system kube-scheduler-k8s-m1 1/1 Running 43 (5m30s ago) 26s
#如果是重装calico,需要先清除旧的配置
rm -rf /etc/cni/net.d/
rm -rf /var/lib/calico
安装好网络插件之后,查看所有pod的状态,如果没好就多等一会
如果长时间安装不成功,可以使用命令查看安装日志 kubectl describe pod coredns-65dcc469f7-n5v6x -n kube-system
3.验证集群可用性
#检查节点
#status为ready就表示集群可以正常运行了
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-m1 Ready control-plane 73m v1.27.1
k8s-n1 Ready <none> 2m58s v1.27.1
k8s-n2 Ready <none> 4m12s v1.27.1
查看集群健康情况
kubectl get cs
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true","reason":""}
scheduler Healthy ok
controller-manager Healthy ok
八、测试:用K8S部署Nginx
1.在k8s-master机器上执行
# 创建一次deployment部署
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort # --port是service的虚拟ip对应的端口
# 查看Nginx的pod和service信息
kubectl get pod,svc -owide
访问Nginx地址: http://任意节点的ip:图中Nginx的对外映射端口,http://192.168.137.20:30417/
常见错误
- 安装flannel插件时,查看pod发现错误:loadFlannelSubnetEnv failed: open /run/flannel/subnet.env: no such file or directory
查看各个节点,包括master 节点是否有/run/flannel/subnet.env,内容应该是类似如下:
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
若有节点没有该文件那就拷贝一份。
- Failed to pull image "docker.io/flannel/flannel:v0.22.0"
# docker拉取flannel镜像到本地
docker pull docker.io/flannel/flannel:v0.22.0
- Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock To see the stack trace of this error execute with --v=5 or higher
原因:没有整合kubelet和cri-dockerd
解决办法: 在命令后面加上以下选项
--cri-socket unix:///var/run/cri-dockerd.sock
- node执行kubectl命令出现下面的错误:couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused
echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
source /etc/profile
添加自动补全功能
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
重置k8s集群
#master节点执行
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
手动清除配置信息
重置(reset)Kubernetes 集群的过程并不会清理 CNI 配置、iptables 规则和 IPVS 表,以及 kubeconfig 文件。要进行这些清理操作,你需要手动执行以下步骤:
1.清理 CNI 配置:运行以下命令以删除 /etc/cni/net.d 目录中的 CNI 配置文件:
rm -rf /etc/cni/net.d
2.清理 iptables 规则:使用 "iptables" 命令手动清理 iptables 规则。你可以运行以下命令来重置 iptables 规则:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
3.清理 IPVS 表(仅适用于使用 IPVS 的集群):如果你的集群使用 IPVS,请运行以下命令以重置 IPVS 表:
ipvsadm --clear
4.清理 kubeconfig 文件:检查 $HOME/.kube/config 文件的内容,并根据需要手动删除或清理该文件。
rm $HOME/.kube/config
Ingress网关安装
兼容性查看:GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes
更多推荐
所有评论(0)