Skip to content

kubeadm快速部署k8s

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

这个工具能通过两条指令完成一个kubernetes集群的部署:

shell
# 创建一个 Master 节点
$ kubeadm init

# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 linux
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

准备环境

角色IP
master192.168.71.130
node1192.168.71.131
node2192.168.71.132

更新包

shell
sudo apt-get update

关闭防火墙

shell
# centos
systemctl stop firewalld
systemctl disable firewalld

# ubuntu
sudo systemctl stop ufw
sudo systemctl disable ufw

关闭selinux

shell
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

关闭swap

shell
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

根据规划设置主机名

shell
hostnamectl set-hostname <hostname>
eg:
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2

在master添加hosts

shell
cat >> /etc/hosts << EOF
192.168.71.130 master
192.168.44.131 node1
192.168.44.132 node2
EOF

将桥接的IPv4流量传递到iptables的链

shell
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

时间同步

shell
yum install ntpdate -y
apt install ntpdate -y
# 切换为中国时区
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com

安装Docker

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。 这里的版本很重要,一定要对应,所有服务器都安装

安装Docker

shell
# 清理旧的 Docker 源(如果有)
sudo rm -f /etc/apt/sources.list.d/docker.list
#直接添加阿里云 Docker 源(跳过 GPG 校验,适合快速安装)
echo "deb [trusted=yes] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
#更新源并安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

docker 换源

shell
# docker 换源
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://doublezonline.cloud",
    "https://dislabaiot.xyz",
    "https://docker.fxxk.dedyn.io",
    "https://dockerpull.org",
    "https://docker.unsee.tech",
    "https://hub.rat.dev",
    "https://docker.1panel.live",
    "https://docker.nastool.de",
    "https://docker.zhai.cm",
    "https://docker.5z5f.com",
    "https://a.ussh.net",
    "https://docker.udayun.com",
    "https://hub.geekery.cn"
  ]
}
EOF

# 重启
systemctl daemon-reload  
systemctl restart docker

# 设置开机重启
systemctl enable docker

安装cri-docker(一定要确保启动成功)

shell
# 下载到服务器
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
# 解压
tar xf cri-dockerd-0.3.16.amd64.tgz
# 配置
mv cri-dockerd/cri-dockerd /usr/local/bin/
# mv cri-dockerd/cri-dockerd /usr/bin/

设置开机启动(最好手动复制)

shell
cat > /etc/systemd/system/cri-dockerd.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/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10
 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
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
shell
cat > /etc/systemd/system/cri-docker.socket <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service    #systemd cri-docker.servics 文件名
 
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
 
[Install]
WantedBy=sockets.target
EOF
shell
# 执行开机启动
systemctl daemon-reload
systemctl enable cri-dockerd.service
systemctl restart cri-dockerd.service

部署k8s与集群

除了特殊标记的,其他部分需要master 与 node 节点都执行

安装基础工具

shell
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
shell
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

配置公共签名密钥

shell
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# 
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

准备源仓库

shell
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

安装默认版本(我这里目前是1.32.9)

shell
sudo apt-get install -y kubelet kubeadm kubectl

锁定版本

shell
# 锁定版本
apt-mark hold kubelet kubeadm kubectl
# 解除锁定
apt-mark unhold kubelet kubeadm kubectl

配置kubelet

进入文件kubelet,1.30版本之后都是在 /etc/default/kubelet,之前是 /etc/sysconfig/kubelet

sh
# 三台机器都执行
vim /etc/default/kubelet

添加为如下配置,配置cgroup管理

sh
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

设置开机自启动

注意: 这里只是设置开机启动,但是并没有启动 kubelet。请不要在此刻启动kubelet。那什么时候启动呢?等kubeadm init 的时候会自动带起来 kubelet

sh
# 三台机器都执行
systemctl enable kubelet

初始化集群

初始化集群的操作,请在master上操作,加入集群的命令请在worker节点操作。命令会详细说明

规划集群网段

规划pod/service网段,这两个网段和宿主机网段不能重复!原则只有一个:三个网段不重复,没有交叉即可!

  • 宿主机网段:前面已经规划过。即:192.168.71.0/24
  • service网段:10.96.0.0/12
  • pod网段:10.244.0.0/16

4.6.2 执行kubeadm init命令

执行kubeadm来初始化集群,注意不要完全抄如下命令,请自行更改参数值。下面有参数释义。

shell
# master节点执行
kubeadm init  \  
--kubernetes-version=1.32.9  \  
--control-plane-endpoint=master  \  
--apiserver-advertise-address=192.168.71.130  \  
--pod-network-cidr=10.244.0.0/16  \  
--service-cidr=10.96.0.0/12  \  
--image-repository=registry.aliyuncs.com/google_containers   \  
--cri-socket=unix:///var/run/cri-dockerd.sock  \  
--upload-certs   \  
--v=9
shell
kubernetes-version:指定k8s的版本,我这里是1.32.9
control-plane-endpoint:可以理解为集群master的命名,随意写即可
apiserver-advertise-address:集群中master的地址!注意不要抄,写你自己虚拟机的ip地址
pod-network-cidr:pod网段地址,4.6.1已经规划过了,只要不与集群网段和service网段重复即可
service-cidr:service网段地址,4.6.1已经规划过了,只要不与集群网段和pod网段重复即可
image-repository:指定使用国内镜像
cri-socket:指定使用的容器运行时,如果你使用的containerd容器,那就不用写这个参数
v:日志级别,9表示输出的信息会很详细

后续操作

9c27baa7e92e16bf076de65887cd4771.png

shell
# 只在master上执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在node节点执行

shell
# 在node节点执行
kubeadm join master:6443 --token x4hyb1.noymxgmeuf77uh5g \
	--discovery-token-ca-cert-hash sha256:94098aaf486209272bd7f884d2ff695394e7c6ab6981cea17a2c6ee0b43b2b73
  --cri-socket=unix:///var/run/cri-dockerd.sock

执行检查

shell
kubectl get nodes

此时节点都还是NoteReady状态

shell
root@master:/# kubectl get nodes
NAME     STATUS     ROLES           AGE     VERSION
master   NotReady   control-plane   3m14s   v1.32.9
node1    NotReady   <none>          21s     v1.32.9
node2    NotReady   <none>          12s     v1.32.9

安装calico

下载配置

shell
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml
shell
# master执行
wget  https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml
# master执行
vim custom-resources.yaml

修改其中的网段为之前规划好的pod网段10.244.0.0/16

运行calico

sh
kubectl create -f custom-resources.yaml

检测运行

shell
kubectl get pods -n calico-system

测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

shell
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

参考资料

https://developer.aliyun.com/article/1627889

https://blog.csdn.net/qq_43116031/article/details/133818049

https://blog.csdn.net/wtl1992/article/details/138174676

https://www.cnblogs.com/zhaolongisme/p/17215053.html

https://edu.51cto.com/article/note/10575.html

https://juejin.cn/post/7473838374366347303

https://www.yisu.com/ask/33602449.html

Released under the MIT License.