kubenetes手动安装V1.22.4

1、主节点和工作节点需要的组件

提示:为了方便测试请关闭selinux、关闭防火墙、swap.

SELinux防火墙的设置:

[root@localhost]#getenforce
Disabled
# 修改/etc/selinux/config文件
vim /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled

Firewalld防火墙的设置:

1、firewalld的基本使用:

启动:systemctl start firewalld
关闭:systemctl stop firewalld
查看状态:systemctl status firewalld
开机禁用:systemctl disable firewalld
开机启用:systemctlenabl e firewalld

2、firewall-cmd的基本使用:

# 那怎么开启一个端口呢:
firewall-cmd --zone=public --add-port=80/tcp --permanent (-permanent永久生效,没有此参数重启后失效)
# 重新载入:
firewall-cmd --reload	# 修改firewall-cmd配置后必须重启
# 查看:
firewall-cmd --zone=public --query-port=80/tcp
# 删除:
firewall-cmd --zone=public --remove-port=80/tcp --permanent
# 查看所有打开的端口:
firewall-cmd --zone=public --list-ports

关闭swap:

kubelet不是为处理swap情况而设计的,Kubernetes团队不打算实现这一点,因为目标是pod应该适合主机的内存。

提示:production deployments should disable swap unless testing the NodeSwap feature gate of thekubelet

sudo swapoff -a

永久关闭

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

更多为什么要关闭swap以及防火墙参考

http://bbs.itying.com/topic/63eb43fe5d86c70e8cfe1108

设置服务器时间为最新时间

yum install ntpdate -y
# 设置时区
timedatectl set-timezone Asia/Shanghai 
ntpdate ntp1.aliyun.com

2、主节点和工作节点需要的组件

主节点需要组件

  • docker(也可以是其他容器运行时)
  • kubectl集群命令行交互工具
  • kubeadm集群初始化工具

工作节点需要组件文档

  • docker(也可以是其他容器运行时)
  • kubelet管理Pod和容器,确保他们健康稳定运行
  • kube-proxy网络代理,负责网络相关的工作

3、配置主机hostname每个节点分别设置对应主机名

方法1:如果只是修改hostnamei可以通过如下命令

hostname newHostname
# 或者
hostnamectl set-hostname master

注意:这种修改方式只有当前有效,等服务器重启后hostname就会失效,回到原来的hostname

方法2:永久修改,重启后生效

vim /etc/hostname

方法3:每个节点配置hostname(推荐)

hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

4、所有节点都修改hosts

vim /etc/hosts

这里需要注意改成自己的结点IP

192.168.40.128 master
192.168.40.129 node1
192.168.40.130 node2

5添加安装源(所有节点)

#添加k8s安装源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
pgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

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

#添加Docker安装源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6、安装所需组件(所有节点)

yum remove docker-ce docker-ce-cli containerd.io -y
yum install kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce-20.10.0 docker-ce-cli-20.10.0 -y

提示:Kubernetes自v1.24移除了对docker-shim的支持,而Docker Engine默认又不支持CRl规范,因而二者将无法直接完成整合。为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker。

https://github.com/Mirantis/cri-dockerd

cri-dockerd项目提供了预制的二制格式的程序包,用户按需下载相应的系统和对应平台的版本即可完成安装。

7、启动kubelet、docker,并设置开机启动(所有节点)

systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker

修改docker配置(所有节点)

# kubernetes官方推荐docker等使用systemd作为cgroupdriver,否则kubelet启动不了
cat <<EOF > daemon.json
{
	"exec-opts":["native.cgroupdriver=systemd"],
	"registry-mirrors":["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
# 重启生效

systemctl daemon-reload
systemctl restart docker

8、 用kubeadm初始化集群(仅在主节点跑)

# 初始化集群控制台Control plane
# 失败了可以用kubeadm reset重置

sudo swapoff -a

# 安装流量控制工具
yum install tc -y

kubeadm init --image-repository=registry.aliyuncs.com/google_containers

# 记得把kubeadm join xxx保存起来
# 忘记了重新获取:kubeadm token create--print-join-command

The connection to the server localhost:8080 was refused-did you specify the right host or port?

注意 :防火墙要关闭,swap也要关闭

主节点执行

mkdir -p SHOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown S(id -u):$(id -g)SHOME/.kube/config

允许其他结点访问集群(主节点执行,非必须)

在其他机器上创建~/.kube/config文件也能通过kubectl访问到集群

复制授权文件,以便kubectl可以有权限访问集群

如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点

scp /etc/kubernetes/admin.conf 192.168.40.129:/etc/kubernetes/admin.conf
scp /etc/kubernetes/admin.conf 192.168.40.130:/etc/kubernetes/admin.conf

然后分别在工作节点执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

有兴趣了解kubeadm init具体做了什么的,可以查看官方文档

9、把工作节点加入集群(只在工作节点跑)

kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx
# 例如
kubeadm join 192.168.40.128:6443 --token w4vm15.050mddexyrd4lwow --discovery-token-ca-cert-hash sha256:1ea9521d177f6d9455db98e26a107922c925b324cbc2a301b4274bcb4dcb4667

安装网络插件,否则node是NotReady状态(主节点跑

#很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

[root@localhost ~]kubectl apply -f
https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

查看节点,要在主节点查看(其他节点有安装kubectl也可以查看)

kubectl get nodes

10、配置网络

如果你运行kubectl describe pod/pod-name发现Events中有下面这个错误

networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network:open/run/flannel/subnet.env: no such file or directory

Flannel是由CoreOS开源的针对k8s的网络服务,其目的是为解决k8s集群中各主机上Pod之间的通信问题,其借助etcd维护网络P地址分配,并为每个Node节点分配一个不同的IP地址段

在每个节点创建文件/run/flannel/subnet.env写入以下内容,配置后等待一会就好了

注意:空格

FLANNEL_NETWORK=10.244.0.0/16	#flannel全局网段
FLANNEL_SUBNET=10.244.0.1/24	#本节点子网
FLANNEL_MTU=1450				#容器接口mtu值
FLANNEL_IPMASQ=true 			#地址映射
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

11、提示工具配置

在 Linux 系统中,kubectl 命令行工具自带了命令补全特性,这可以帮助我们更快速、更容易地输入命令。为了启用这个特性,你需要配置你的 shell 环境。

对于 bash shell,你可以用以下命令来启用命令补全:

echo 'source <(kubectl completion bash)' >>~/.bashrc

然后,你需要重新加载 .bashrc 文件让这个更改生效:

source ~/.bashrc

对于 zsh shell,你可以用以下命令来启用命令补全:

echo 'if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi' >>~/.zshrc

然后,你需要重新加载 .zshrc 文件让这个更改生效:

source ~/.zshrc

完成这些操作后,你就可以在输入 kubectl 命令时使用 Tab 键来自动补全命令参数了。

请注意,上述命令中的 >>~/.bashrc>>~/.zshrc 操作会把 kubectl 的补全脚本添加到你的 shell 配置文件中,这样在每次打开新的终端窗口时都会自动启用命令补全。如果你只希望在当前终端窗口启用命令补全,你可以直接运行 source <(kubectl completion bash)source <(kubectl completion zsh)

12、稞机搭建遇到的问题

1.[WARNING Firewalld]:firewalld is active,please ensure ports [6443 10250]are open or your cluster may not function correctly

答:systemctl stop firewalld.service

2.[WARNING Service-Docker]:docker service is not enabled,please run ‘systemctl enable docker.service’

答:systemctl enable docker,service

答:官方文档表示,更改设置,令容器运行时和kubelet使用systemd作为cgroup驱动,以此使系统更为稳定。请注
docker下设置native,cgroupdriver=systemdi选项。

两种解决方式:

一、编辑dacker配置文件/etc/docker/daemon,json

"exec-opts":["native.cgroupdriver=systemd"]
systemctl daemon-reload
systemctl restart docker

二、编辑/usr/Iib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
systemctl daemon-reload
systemctl restart docker

命令:

vi /usr/lib/systemd/system/docker.service
--exec-opt native.cgroupdriver=systemd (追加)

设置完成后通过docker info命令可以看到Cgroup Driver为systemd

docker info | grep Cgroup

4.[WARNING FileExisting-tc] : tc not found in system path

安装流量控制工具

解决动法:

无法用yum安装,yum上有版本,却一直加载不下来。

可以用yum安装,yum服务器也是此版本:

yum命令:yum install tc -y

5:container runtime is not running:output E0606 12:41:12.605990 1307975

[root@master:~]rm -rf /etc/containerd/config.toml

[root@master:~systemctl restart containerd

6、Pod报错解决

如果你运行kubect1 describe pod/pod-name发现Events中有下面这个错误

networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env:no such file or directory

在每个节点创建文件/run/flannel/subnet.env写入以下内容即可解决

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
  1. 清除k8s相关内容,重新开始

    在输入下边命令的时候将第一条命令和后边几条分开输入,因为第一条会让你输入一个y来确认

    image-20230710172417464

    kubeadm reset 命令并未清理 CNI(network plugin)配置、iptables 规则、IPVS 表或者 kubeconfig 文件。这意味着,如果你的问题源自这些配置,你可能还需要手动清理它们:

    1. 清理 CNI 配置:删除 /etc/cni/net.d 目录下的文件。
    2. 重置 iptables:使用 iptables -Fiptables -t nat -F 命令清除 iptables 规则。
    3. 清理 IPVS 表:如果你的集群使用了 IPVS,使用 ipvsadm --clear 命令清理 IPVS 表。
    4. 清理 kubeconfig 文件:删除 $HOME/.kube/config 文件。
kubeadm reset 

rm -rf /etc/cni/net.d
iptables -F 
iptables -t nat -F
rm -rf $HOME/.kube/config
下一篇