说明:docker容器管理比较常见,现在除了docker,还有containerd跟docker类似,用于容器管理
1:前提条件:
建议最小硬件配置:2核CPU、2G内存、50G硬盘
服务器最好可以访问外网,会有从网上拉取镜像需求
2:版本
操作系统:centos7.9
containerd: 1.6.22
3:服务器规划:(本实验采用虚拟机)
master:192.168.73.190
4:配置环境初始化
关闭防火墙
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 # 永久
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
hostnamectl set-hostname master
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.73.190 master
EOF
配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 将桥接的IPv4流量传递到iptables的链
swappiness 参数调整,swap关闭,也必须添加此参数
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
执行如下命令使修改生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
安装 ipvs
cat >> /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#chmod 755 /etc/sysconfig/modules/ipvs.modules
#/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件后,可执行lsmod | grep -e ip_vs -e nf_conntrack_ipv4 查询是否加载所需的内核模块
安装 ipset 软件包
yum install ipset -y
查看 ipvs 的代理规则,则安装管理工具 ipvsadm
yum install ipvsadm -y
同步服务器时间
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources
5.安装 containerd
下载补丁源
wget -O /etc/yum.repos.d/docker-ce.repo https:
//mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装containerd
# 查看可安装版本
[root@master ~]# yum list | grep containerd
containerd.io.x86_64 1.6.10-3.1.el7 @docker-ce-stable
# 执行安装
[root@master ~]# yum -y install containerd.io
# 查看
[root@master ~]# rpm -qa | grep containerd
containerd.io-1.6.10-3.1.el7.x86_64
创建containerd配置文件
# 创建目录
mkdir -p /etc/containerd
containerd config
default
> /etc/containerd/config.toml
# 替换配置文件
sed -i
's#SystemdCgroup = false#SystemdCgroup = true#'
/etc/containerd/config.toml
sed -i
's#sandbox_image = "registry.k8s.io/pause:3.6"#sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"#'
/etc/containerd/config.toml
启动containerd
systemctl enable containerd
systemctl start containerd
systemctl status containerd
验证containerd安装是否成功
6.安装三大件( kubelet、kubeadm、kubectl)
下载 kubernetes 源码库
cat >> /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
安装 kubeadm、kubelet、kubectl(指定自己想要的版本,如版本1.25.0)
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
设置运行时
crictl config runtime-endpoint /run/containerd/containerd.sock
将 kubelet 设置成开机启动
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
7.初始化集群
---master执行----
导出默认的初始化配置
kubeadm config print init-defaults > kubeadm.yaml
修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要 注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定 cgroupDriver 为systemd
- advertiseAddress: 192.168.73.190 # 修改为master节点IP
- name: master # 修改为master节点的主机名
- imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 阿里云镜像地址
- kubernetesVersion: 1.25.0 # 版本根据执行:kubelet --version 查看
- podSubnet: 172.16.0.0/16 # networking: 下添加pod网段
- cgroupDriver: systemd # 指定 cgroupDriver 为 systemd
[root@master ~]# cat kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.73.190
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.25.0
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
执行以上配置文件进行初始化
kubeadm init --config=kubeadm.yaml
执行结果最后为如下:
拷贝k8s认证文件
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 node -o wide查看是否安装成功
可以看到“CONTAINER-RUNTIME”下面显示containerd
但问题是状态为 notReady, 这个要安装网络插件
下载calico文件
curl https:
//projectcalico.docs.tigera.io/archive/v3.23/manifests/calico.yaml -O
然后编辑calico.yaml文件
(初始化master的时候podSubnet: 172.16.0.0/16,但calico.yaml
文件默认IP为:192.168.0.0/16,所以需要改为172.16网段)
# 找到CALICO_IPV4POOL_CIDR,取消注释并这里需要修改172.16
- name: CALICO_IPV4POOL_CIDR
value:
"172.16.0.0/16"
执行完后发现controller一直为pending状态
执行 查看原因
kubectl describe pod calico-kube-controllers-d8b9b6478-wbv9c -n kube-system
发现这时候取消添加容忍或 取消污点
这里取消污点,执行:
(注意,污点名称可以在上面describe node里找到,且命令最后有一个“-”)
kubectl taint nodes master node-role.kubernetes.io/control-plane-
再次执行:
# kubectl get pod -A -o wide
# kubectl get nodes -o wide
已经全部正常了