如何在虚拟机中安装部署K8S?

教程参考:centos7安装k8s 1.28版本,基于科学-CSDN博客

环境准备:

准备三台机器,都做以下操作,或者只准备一个机器,最后再克隆两台。

yum:

换源,这是阿里云的源

bash 复制代码
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

然后清缓存,建立元数据

yum clean all

yum makecache

yum更新

yum update -y

#这里要按下tab键补全

yum install -y bash-completio

#下载wget

yum install -y wget

#下载网络工具(不是很清楚这里下这个的目的,可能是为了后面k8s之间网络通信使用

yum install -y net-tools

#下载GCC

yum install -y gcc

虚拟机配置:

关闭防火墙:

systemctl stop firewalld

systemctl disable firewalld

systemctl is-enabled firewalld

同步时间:(这里我报错了,但是在三个虚拟机设置的时候,特意调的一样的时间,所以这三个虚拟机时间是同步的)

sudo yum -y install ntpdate

sudo ntpdate ntp1.aliyun.com

sudo systemctl status ntpdate

sudo systemctl start ntpdate

sudo systemctl status ntpdate

sudo systemctl enable ntpdate

关闭swap:

free -h

sudo swapoff -a

sudo sed -i 's/.*swap.*/#&/' /etc/fstab

free -h

关闭selinux

getenforce

cat /etc/selinux/config

setenforce 0

sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

cat /etc/selinux/config

安装containerd和K8S

配置K8S环境

内核参数:

cat > /etc/sysctl.d/Kubernetes.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1 #当通过桥接网络接收到IPV6时,通过ip6tables的规则转发

net.bridge.bridge-nf-call-iptables = 1 #当通过桥接网络接收到IPV4时,通过iptables的规则转发

net.ipv4.ip_forward = 1#允许ipv4转发,即使目标机不是本机

vm.swappiness = 0#尽可能地少使用swap

EOF

使配置生效

sysctl --system
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

相关内核模块

cat > /etc/modules-load.d/ipvs.conf <<EOF

ip_vs

ip_vs_rr

ip_vs_wrr

ip_vs_sh

nf_conntrack

EOF

启动服务

systemctl enable --now systemd-modules-load

ip_vs,ip_vs_rr,ip_vs_wrr,ip_vs_sh 是IPVS相关的内核模块。它们提供了不同的负载均衡算法(round-robin,加权轮询,最短任务优先)。

nf_conntrack 和 nf_conntrack_ipv4 是用于网络连接跟踪的内核模块,这在防火墙和NAT中非常重要。

linux kernel 4.19版本已经将nf_conntrack_ipv4 更新为 nf_conntrack

(看不是很懂,但是这里原帖子也有,希望别人能看懂)

安装containerd

这里开始使用科学上网,如果在下面的步骤你发现。

yum -y install yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

配置 containerd

cat >>/etc/modules-load.d/containerd.conf <<EOF

overlay

br_netfilter

EOF

立刻加载 overlay模块

modprobe overlay

立刻加载 br_netfilter模块

modprobe br_netfilter

安装containerd

yum install containerd.io -y

mkdir -p /etc/containerd

containerd config default > /etc/containerd/config.toml

使用systemd管理cgroups

sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml

启动containerd

systemctl enable containerd

systemctl start containerd

安装K8S

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/

enabled=1

gpgcheck=1

gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key

EOF

#查看一下有没有进去

cat /etc/yum.repos.d/kubernetes.repo

安装k8s并启动

yum list kubelet --showduplicates |grep 1.28

开始安装 这篇文档原作者写下时,最新版本为1.28.2 ,我也是安装的该版本

yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2

启动

systemctl enable kubelet

systemctl start kubelet

#查看有没有启动

systemctl status kubelet

下面就是对于虚拟机的一些额外的配置:

修改名称:

查看主机名

hostnamectl

修改主机名

hostnamectl set-hostname xxxx 这里我有三台节点,一个master,两个worker,主机叫k8s-master,两个worker就叫worker1 worker2

给虚拟机固定了IP:

#找到ens33文件,做以下配置:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

#静态IP

BOOTPROTO=static

#允许上网

ONBOOT=yes

#固定IP,一台机器一个IP,我一个是128,一个是129,一个是130

IPADDR=192.168.157.128

#DNS配置

DNS1=114.114.114.114

DNS2=8.8.8.8

#设置网关

GATEWAY=192.168.157.2

修改hosts文件:

#将ip和主机名称对应着写,加到hosts中,三台机器都加(这里IP改为自己的IP):

192.168.157.128 k8s-master

192.168.157.129 worker1

192.168.157.130 worker2

好了,到这里如果只有一台虚拟机的可以进行克隆了,在克隆出来以后,不要一起打开,一个个打开,分别修改一下ens33文件里的ip之后再一起打开,还要修改hostname为hosts文件里的名字。

开始部署master节点

#查看所需要的镜像

kubeadm config images list --kubernetes-version=v1.28.2

#提前下载镜像,不要在init初始化的时候等待太长时间:

kubeadm config images pull

初始化(IP改为自己的)

kubeadm init --kubernetes-version=1.28.2 \

--apiserver-advertise-address=192.168.157.128 \

--pod-network-cidr=10.244.0.0/16

这里会返回一个这样的信息

kubeadm join 192.168.157.128:6443 --token mu7mpy.8xxxxxxxxs --discovery-token-ca-cert-hash sha256:1d5b4b3b3493bxxxxxxxf2a1bb8d1250886xxxxxxxxb92

等初始化完了进行认证配置:

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

检查一下是否起来:

kubectl get node

kubectl get pods -A

kubectl get pods -n kube-system

当时在这里时,master是notready的状态,这是正常的,这里需要加入calico插件。

#先获取他的配置文件

wget https://docs.projectcalico.org/manifests/calico.yaml

#将其中的CALICO_IPV4POOL_CIDR修改,这里注意#

  • name: CALICO_IPV4POOL_CIDR

value: "10.244.0.0/16"

找到下面这个name,并在其下面加入网卡配置

  • name: CLUSTER_TYPE

value: "k8s,bgp"

下面添加

  • name: IP_AUTODETECTION_METHOD

value: "interface=ens33"

然后部署calico:

kubectl apply -f calico.yaml

检查

kubectl get pods -n kube-system

在worker配置

将刚刚获取到的

kubeadm join 192.168.157.128:6443 --token mu7mpy.8xxxxxxxxs --discovery-token-ca-cert-hash sha256:1d5b4b3b3493bxxxxxxxf2a1bb8d1250886xxxxxxxxb92

这种的数据在两台worker中使用

配置密钥:

mkdir ~/.kube cp /etc/kubernetes/kubelet.conf ~/.kube/config

#查看node

kubectl get nodes

这时候就会出现两个worker

部署一个nginxapiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

spec:

selector:

matchLabels:

app: nginx

replicas: 2 # 告知 Deployment 运行 2 个与该模板匹配的 Pod

template:

metadata:

labels:

app: nginx

spec:

containers:

  • name: nginx

image: nginx:1.27.0

ports:

  • containerPort: 80

#进行测试一下:

kubectl apply -f deployment.yaml

#查看一下:

kubectl get pod

遇到的问题:

签名认证的问题:

有一个在下载的时候说什么公钥签名有问题:

解决办法:

打开相对应的yum源,找到相对应的repo,比如你是在下载kube时出现问题的,就找到kubexxxx.repo,将里面的gpgcheck改为0,就不会出现这个错误。

SSL未连接问题:

解决办法:

科学上网

TCP connection reset by peer

gitclone时出现这个问题就:git clone错误: TCP connection reset by peer_git clone tcp connection reset by peer-CSDN博客

如果是yum install时:

其他的都可以yum install,就某个不可以时:科学上网,

如果都不可以,请更换yum源。

部署CALICO时,报错error:calico_node is not empty

calico.yaml文件里的

  • name: CALICO_IPV4POOL_CIDR

value: "10.244.0.0/16"

这里格式要正确,缩进要和其他的保持一致,而且这个CALICO_IPV4POOL_CIDR一开始是注掉的,要将#删掉

POD一直Peding状态:

#查看日志:#(这里xxxx是名称,可以通过 kubectl get pod -n kube-system 查看

kubectl logs -n kube-system xxxxx

#如果这个命令没有出现任何返回也没有报错,那就使用:

journalctl -xefu kubelet

查看日志,我这里报错一直是cni plugin 出现问题,这里就是calico安装部署有问题,需要重新部署一下:

kubectl delete -f calico.yaml

按照上面的教程部署好以后再重新部署。

lookup localhost on 114.114.114.114:53: no such host

出现这个lookup localhost on 114.114.114.114:53: no such host或者是8.8.8.8有问题。

解决办法:

查看hosts文件,缺少下面的装上,然后重启电脑

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

相关推荐
运维小文12 分钟前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
Daniel 大东12 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
登云时刻13 分钟前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Theodore_10224 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸5 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了6 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王7 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq