[k8s 1.27.2]-Kubernates+docker+cri-dockerd 集群部署
k8s安装过程需要注意版本使用,每次操作都需要检查操作结果,尤其是启动服务的服务状态检查,可以减少很多麻烦。如果起服务有问题,可以查看具体的日志分析。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
基本概念
Kubernetes 主要由以下几个核心组件组成:
etcd:保存了整个集群的状态;
kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
kube-controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube-scheduler:负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet:负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container runtime:负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡。
环境准备
主机环境配置
跨主机免密认证
# 生成秘钥对,一路回车
ssh-keygen -t rsa
#跨主机免密码认证
ssh-copy-id root@远程主机ip地址
# 脚本方式ssh-copy-id root@远程主机,1,2,3,4,5为主机ip最后识别
for i in 1 2 3 4 5
do
ssh-copy-id root@10.100.100.$i
done
关闭swap
#临时关闭
swapoff -a
# 永久关闭,或者注释掉swap分区那一行
sed -i 's/.*swap.*/#&/' /etc/fstab
#内核参数调整
cat >> /etc/sysctl.d/k8s.conf << EOF vm.swappiness=0 EOF
sysctl -p /etc/sysctl.d/k8s.conf
网络参数调整
#修改网卡
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
sysctl -p
#启用内核模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4
vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
docker环境清理(如果需要清理docker环境,更换版本)
#卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce-cli \
docker-ce \
containerd.io
#清理存储
rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker
安装Docker v23.0.3
yum -y install wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-23.0.3 docker-ce-cli-23.0.3
# 配置daemon.json文件
# 方案一如果有准备好的daemon.json文件,可以直接cp过去
cp /home/ludpadmin/k8s/daemon.json /etc/docker
# 方案二 配置cgroup驱动及镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"http://node48.*.*.*",
"https://registry.aliyuncs.com",
"https://mirrors.aliyun.com",
"https://rsbud4vc.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://dockerhub.azk8s.cn",
"http://hub-mirror.c.163.com"
],
"insecure-registries":["node48.*.*.*"]
}
EOF
#添加"insecure-registries":["harbor-node:port"],解决docker 链接仓库tls验证问题
systemctl daemon-reload
systemctl enable docker
systemctl start docker #重启 systemctl restart docker÷
systemctl status docker
docker info|grep systemd
#如果已经安装了cri-docker并启动,重新安装新版本docker需要重新启动cri-docker,不然读取的版本信息依然是重装前的
安装docker-compose (Docker Compose version v2.26.1)
上传服务器,copy到执行路径
cp /home/ludpadmin/k8s/docker-compose-linux-x86_64 /usr/bin/docker-compose
给docker-compose 可执行权限
chmod a+x /usr/bin/docker-compose
查看docker-compose版本
docker-compose -version
# Docker Compose version v2.26.1
harbor仓库操作(自选一个节点)
下载软件
mkdir /data/{softs,server} -p && cd /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
解压软件
tar -zxvf harbor-offline-installer-v2.5.0.tgz -C /data/server/
cd /data/server/harbor/
加载镜像
docker load < harbor.v2.5.0.tar.gz
docker images
备份配置
cp harbor.yml.tmpl harbor.yml
修改配置
[root@kubernetes-register /data/server/harbor]# vim harbor.yml.tmpl
# 修改主机名
hostname: harbor-node
http:
port: 80
#https: 注释ssl相关的部分
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# 修改harbor的登录密码
harbor_admin_password: Harbor12345
# 设定harbor的数据存储目录
data_volume: /data/server/harbor/data
配置harbor
./prepare
启动harbor
./install.sh
检查效果
docker-compose ps
定制启动文件
定制服务启动文件
cat >> /etc/systemd/system/harbor.service << EOF
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
#需要注意harbor的安装位置,需要改成自己环境harbor的部署位置
ExecStart=/usr/bin/docker-compose --file /data2/server/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose --file /data2/server/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF
重新加载文件,启动服务
加载服务配置文件
systemctl daemon-reload
启动服务
systemctl start harbor
检查状态
systemctl status harbor
设置开机自启动
systemctl enable harbor
harbor仓库定制
浏览器访问域名,用户名: admin, 密码:Harbor123456
创建仓库k8s,权限为公开的
harbor仓库测试
#登录仓库
# docker login harbor-node:port -u admin
Password: # 输入登录密码 A12345678a
#下载镜像
docker pull busybox
#定制镜像标签
docker tag busybox harbor-node/k8s/busybox:v0.1
#推送镜像
docker push harbor-node/k8s/busybox:v0.1
安装配置cri-dockerd
# 下载安装最新版的cri-dockerd
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8.amd64.tgz
tar xf cri-dockerd-0.3.8.amd64.tgz
rm -rf /usr/bin/cri-dockerd
cp /home/ludpadmin/k8s/cri-dockerd /usr/bin/
rm -rf cri-dockerd cri-dockerd-0.3.8.amd64.tgz
# 配置启动项
cat > /etc/systemd/system/cri-docker.service<<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
# ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
# 指定用作 Pod 的基础容器的容器镜像(“pause 镜像”)
ExecStart=/usr/bin/cri-dockerd --pod-infra-containerimage=node48.it.leap.com/k8s/pause:3.9 --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
#一定详细检查cri-docker启动状态
systemctl status cri-docker
K8s集群初始化(主节点)
images=$(kubeadm config images list --kubernetes-version=1.27.2| awk -F “/” ‘{print $NF}’)
定制阿里云的关于kubernetes的软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#更新软件源
yum clean all
yum makecache
#安装kubeadm kubelet kubectl
#强烈建议指定版本安装,最新版本可能存在适配问题
yum install kubeadm-1.27.2 kubelet-1.27.2 kubectl-1.27.2 -y
# 配置 cgroup 驱动与docker一致
cat > /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
systemctl enable kubelet
检查镜像文件列表
kubeadm config images list
获取镜像文件
images=$(kubeadm config images list --kubernetes-version=1.27.2 | awk -F "/" '{print $NF}')
for i in ${images}
do
docker pull registry.aliyuncs.com/google_containers/$i
docker tag registry.aliyuncs.com/google_containers/$i harbor-node:port/k8s/$i
docker push harbor-node:port/k8s/$i
docker rmi registry.aliyuncs.com/google_containers/$i
done
images=$(docker images )
for i in ${images}
do
echo $i
done
环境初始化命令
kubeadm init --kubernetes-version=1.27.2 \
--apiserver-advertise-address=master节点ip \
--image-repository=harbor-node:port/k8s \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap \
--cri-socket=unix:///var/run/cri-dockerd.sock
kubeadm join 10.0.0.5:6443 --token kt58np.djd3youoqb0bnz4r \
--discovery-token-ca-cert-hash sha256:37a3924142dc6d57eac2714e539c174ee3b0cda723746ada2464ac9e8a2091ce
接下来执行剩余的初始化步骤
可以考虑先修改/etc/kubernetes/admin.conf
中ip为对应的hostnameserver: https://node33-8.lu.leo.com:6443
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#以下如果不执行,会报forbidden的错误
#这可能是由于config没有更新导致的,/root/.kube/config是从/etc/kubernetes/admin.conf复制而来。复制来之后,是需要执行更新kubeconfig命令的。
export KUBECONFIG=$HOME/.kube/config
chmod g-r $HOME/.kube/config
注意,如果初始化成功,并且执行了上述操作,执行kubeadm reset
的时候需要删除一些配置,执行rm -rf $HOME/.kube
,不然重置初始化会报错
Caclico网络插件的配置(3.27.0)
下载[caclico.yaml](https://github.com/projectcalico/calico/tree/v3.27.0/manifests)
#执行命令安装
kubectl apply -f caclico.yaml
添加服务节点
#获取添加节点命令
kubeadm token create --print-join-command
#返回
#kubeadm join 10.12*.3*.4*:6443 --token vwgqxt.40f18gdrnmd7bbkd --discovery-token-ca-cert-hash sha256:023bc38b73bf67074a94d5c07c5eb1bdb03edb8087261a61f3553d9f75a72090
#在各个节点执行
kubeadm join 10.12*.3*.*:6443 --token vwgqxt.40f18gdrnmd7bbkd --discovery-token-ca-cert-hash sha256:023bc38b73bf67074a94d5c07c5eb1bdb03edb8087261a61f3553d9f75a72090 --cri-socket=unix:///var/run/cri-dockerd.sock
总结
安装过程需要注意版本使用,每次操作都需要检查操作结果,尤其是启动服务的服务状态检查,可以减少很多麻烦。
如果起服务有问题,可以查看具体的日志分析
更多推荐
所有评论(0)