环境介绍
Vmware虚拟机挂载两个Ubuntu18.04虚拟镜像,相互之间可以Ping通。
安装的K8s版本为v1.25.x 底层容器接口为docker加cri组件(Kubernetes v1.23以后便不再支持docker,转而支持更底层的containerd,此时需要cri组件来支持docker,docker相当于是对containerd进行了一层封装)。
master节点 192.168.74.140
node节点 192.168.74.139
环境配置
查看并设置主机名,解析需要连入集群的主机
主机名最终会在集群中作为Node节点或者Master节点的名字被显示,所以注意不要同名
查看主机名:
hostname $hostname
更改主机名称(把 k8s-master 换成你想要的名字):
sudo hostnamectl set-hostname k8s-master
解析主机:
sudo gedit /etc/hosts
写入以下内容(注意IP地址和主机名换成自己的):
192.168.74.140 k8s-master
192.168.74.139 k8s-node1
关闭swap
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
查看是否关闭
free -h
开启防火墙的端口
这一步主要是为了放置kubeadm init的时侯报错,很多教程是直接关闭防火墙。
sudo ufw allow 6443
查看防火墙状态
sudo ufw status
以防万一,这里给出关闭防火墙的命令,但是此处不要执行!
sudo ufw disable
sudo ufw status
操作防火墙以后,重启电脑(虚拟机)
重启后注意查看swap状态
free -m
如果swap没关,运行:
sudo swapoff -a
开启IPv4转发
sudo cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
设置时间同步
sudo dpkg-reconfigure tzdata
选择 Asia ShangHai
安装Docker
Docker 可以安装 docker.io 或者 docker.ce 。docker.io是由Debian维护的docker版本,docker.ce是由Docker官方维护的社区版,如果是Ubuntu系统,推荐安装io版本
sudo apt-get update
sudo apt-get -y install docker.io
修改docker启动项:
sudo mkdir /etc/docker
sudo gedit /etc/docker/daemon.json
复制以下内容进去:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
保存退出,更新设置
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
查看docker版本
sudo docker version
查看docker状态
sudo systemctl status docker
查看docker信息(主要是查看Cgroup驱动,查看完整信息便不用加 | grep Cgroup)
sudo docker info | grep Cgroup
安装 cri-dockerd 组件
一般来说下载最新的就行:
进入以下网址,下载cri组件(版本看自己选择),这里选择0.26
https://github.com/Mirantis/cri-dockerd/releases
找到想要的版本,点进去,找到对印的安装包下载,Ubuntu应该下载deb包,CentOS是rpm包。
同时,还要注意版本代号,Ubuntu18.04代号是Bionic,22.04.1是jammy。
当然也可以下载源码,自己编译安装
将文件下载到本地以后,在cri包的路径下新建一个终端,执行安装命令:
注意包名!! 一般输入到cri三个字母以后使用TAB键补全即可。
sudo dpkg -i cri-dockerd_0.2.6.3-0.ubuntu-bionic_amd64.deb
调整启动参数,注意此处,后续报错可能会回来改
sudo sed -i -e 's#ExecStart=.*#ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8#g' /lib/systemd/system/cri-docker.service
设置开机自启动
sudo systemctl daemon-reload
sudo systemctl enable cri-docker
查看cri-docker状态:
sudo systemctl status cri-docker
安装Kubernetes
安装依赖:
sudo apt-get install -y apt-transport-https ca-certificates curl
安装GPG密匙
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
sudo echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
更新软件源
sudo apt-get update
查看Kubernetes可用版本,因为三个组件的版本都是一样的,所以只需要查看其中一个就可以
apt-cache madison kubeadm
注意:如果Ubuntu使用不同的软件源,对软件版本的命名会有所不同,aliyun的源在结尾会有 -00
下载对应版本的kubernetes组件,这里下载1.25.0-00, 有需要可以更换其他版本
sudo apt-get install -y kubelet=1.25.0-00 kubeadm=1.25.0-00 kubectl=1.25.0-00
标记软件包,防止自动更新:
sudo apt-mark hold kubelet kubeadm kubectl
配置kubelet,该操作主要是针对利用docker作为kubernetes的容器,如果使用Containerd则不需要配置。当然,使用docker也可以不配置,但是,需要在kubeadm命令上使用“–cri-socket unix:///run/cri-dockerd.sock”选项
sudo mkdir /etc/sysconfig
sudo gedit /etc/sysconfig/kubelet
复制以下内容,保存退出
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock
启动kubelet
sudo systemctl enable --now kubelet
以上内容是所有节点都要执行的,下面的操作步骤会分master节点和Node节点
master节点初始化
查看初始化需要的镜像
sudo kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
拉取镜像
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --cri-socket unix:///run/cri-dockerd.sock
初始化节点,注意这里的ip地址要换成你的master节点的ip地址,k8s的版本也要换成你下载的版本(此处不要加-00,尽管你下载的包名带-00)
切换到root模式再执行(centos 的命令是 sudo root):
sudo su
kubeadm init --control-plane-endpoint=192.168.74.140 --kubernetes-version=v1.25.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs --image-repository registry.aliyuncs.com/google_containers
此时出现如下界面就配置好了:
记住kubeadm join那条指令,后续用于node节点加入集群。
配置环境变量:还是在su环境下:
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
切换回普通模式(username是你的机器名字,绿字@前面的字母,不会的话就重起一个终端)
su username
设置配置文件备份
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
master 节点,安装网络插件
这里用flannel,也可以用Calico
wget https://github.com/flannel-io/flannel/releases/download/v0.20.1/flanneld-amd64
mkdir /opt/bin
cp flanneld-amd64 /opt/bin/flanneld
chmod +x /opt/bin/flanneld
继续执行
sudo kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
等待一会,查看状态(root模式执行)结果应该会变成ready
kubectl get nodes
Node节点,加入集群
wget https://github.com/flannel-io/flannel/releases/download/v0.20.1/flanneld-amd64
mkdir /opt/bin
cp flanneld-amd64 /opt/bin/flanneld
chmod +x /opt/bin/flanneld
加入节点,利用刚才保存的命令:(末尾加上–cri-socket unix:///run/cri-dockerd.sock)
kubeadm join 192.168.74.140:6443 --token vgsks2.7h1fivdvo0ax726m \
--discovery-token-ca-cert-hash sha256:f986c855e2beb7026feebfd94373da79b0a73e7ad52c2aa0a2c57d011ac31890 --cri-socket unix:///run/cri-dockerd.sock
不出问题的话,主节点在root下执行
kubectl get nodes
就可以查看到Node状态了
扩展内容1
使用containerd代替 docker 和 cri 那一步
查看K8s和containerd的匹配关系https://containerd.io/releases/
最好别用apt安装,apt的版本太低
安装containerd,注意链接中的ubuntu对应的版本名称,18.04是bionic,22.04.1是jammy(最好是自己打开这个网址,找到路径以后再复制过来,或者下载好了以后再弄进来)
curl -# -O https://mirrors.aliyun.com/docker-ce/linux/ubuntu/dists/bionic/pool/stable/amd64/containerd.io_1.6.9-1_amd64.deb
sudo dpkg -i containerd.io_1.6.9-1_amd64.deb
导出默认配置文件
sudo containerd config default > /etc/containerd/config.toml
编辑配置:
sudo gedit /etc/containerd/config.toml
修改sandbox_image行替换为aliyun的pause镜像
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
增加:
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
配置 systemd cgroup 驱动 (修改,不是增加)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
配置镜像加速:
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins. "io.contianerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.aliyuncs.com"]
启动服务:
sudo systemctl enable containerd
sudo systemctl restart containerd
扩展内容2
kubeadm init 报错排错1:
运行以下命令,定位错误:
journalctl -xeu kubelet | grep Failed
查看报错原因,一般会有几条错误,先看第一条,翻到最上面,如果是6443之类的端口拒绝访问,那说明是防火墙的问题,这种问题一般是之前只是单纯的禁用了防火墙。单纯的禁用防火墙是没用的。
开启防火墙:
sudo ufw enable
查看防火墙状态:
sudo ufw status
启用6443端口
sudo ufw allow 6443
重启虚拟机
此时执行以下命令重置kubeadm(root模式执行)
kubeadm reset --cri-socket unix:///run/cri-dockerd.sock && rm -rf /etc/kubernetes/ /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni /etc/cni/net.d
再次执行kubeadm init(root模式,如果报错yaml文件存在,再此执行上面的reset命令,注意替换IP地址和K8s版本)
kubeadm init --control-plane-endpoint=192.168.74.140 --kubernetes-version=v1.25.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --cri-socket unix:///run/cri-dockerd.sock --upload-certs --image-repository registry.aliyuncs.com/google_containers
kubeadm init 报错排错2:
Failed to create pod sandbox:…
参考这里
扩展内容2
删除node节点
都在root模式下运行
查看节点:
kubectl get node
驱逐pod(node_name 换成要驱逐的node名字)
kubectl drain node_name --delete-local-data --force --ignore-daemonsets
删除节点
kubectl delete nodes node_name
node节点root执行
kubeadm reset --cri-socket unix:///run/cri-dockerd.sock
扩展内容3
token过期怎么办
全在root模式下执行:
查看当前的token列表
kubeadm token list
重新生成新的token
kubeadm token create
再次查看当前的token列表
kubeadm token list
获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
节点加入集群别忘了(–cri-socket unix:///run/cri-dockerd.sock)
kubeadm join 39.96.46.96:6443 --token 369tcl.oe4punpoj9gaijh7 --discovery-token-ca-cert-hash sha256:7ae10591aa593c2c36fb965d58964a84561e9ccd416ffe7432550a0d0b7e4f90 --cri-socket unix:///run/cri-dockerd.sock
扩展内容4
卸载K8s
卸载containerd
sudo apt-get purge --auto-remove containerd.io
reset集群
sudo su
kubeadm reset -f
卸载k8s
sudo apt-get purge --auto-remove kubernetes-cni
sudo apt-get purge --auto-remove kubeadm
sudo apt-get purge --auto-remove kubectl
sudo apt-get purge --auto-remove kubelet
删除文件
sudo su
modprobe -r ipip
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
apt clean all
apt remove kube*
利用dpkg命令查看是否还有k8s其他服务
dpkg -l | grep kube
如果有,则执行以下命令删除,替换kube_name成软件名字
sudo apt-get purge --auto-remove kuber_name
find / -name kube* -delete
find / -name kube* | xargs rm -rf
find / -name kube* | xargs rmdir
重启