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
3.[WARNING IsDockerSystemdcheck]:detected "cgroupfs"as the Docker cgroup driver.The recommended driver is “systemd”.Please follow the guide at https://kubernetes.io/docs/setup/cri/
答:官方文档表示,更改设置,令容器运行时和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
清除k8s相关内容,重新开始
在输入下边命令的时候将第一条命令和后边几条分开输入,因为第一条会让你输入一个y来确认
kubeadm reset
命令并未清理 CNI(network plugin)配置、iptables 规则、IPVS 表或者 kubeconfig 文件。这意味着,如果你的问题源自这些配置,你可能还需要手动清理它们:
- 清理 CNI 配置:删除
/etc/cni/net.d
目录下的文件。- 重置 iptables:使用
iptables -F
和iptables -t nat -F
命令清除 iptables 规则。- 清理 IPVS 表:如果你的集群使用了 IPVS,使用
ipvsadm --clear
命令清理 IPVS 表。- 清理 kubeconfig 文件:删除
$HOME/.kube/config
文件。kubeadm reset rm -rf /etc/cni/net.d iptables -F iptables -t nat -F rm -rf $HOME/.kube/config