kubeadm快速部署k8s
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 linux
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
准备环境
| 角色 | IP |
|---|---|
| master | 192.168.71.130 |
| node1 | 192.168.71.131 |
| node2 | 192.168.71.132 |
更新包
sudo apt-get update关闭防火墙
# centos
systemctl stop firewalld
systemctl disable firewalld
# ubuntu
sudo systemctl stop ufw
sudo systemctl disable ufw关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久根据规划设置主机名
hostnamectl set-hostname <hostname>
eg:
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2在master添加hosts
cat >> /etc/hosts << EOF
192.168.71.130 master
192.168.44.131 node1
192.168.44.132 node2
EOF将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效时间同步
yum install ntpdate -y
apt install ntpdate -y
# 切换为中国时区
timedatectl set-timezone Asia/Shanghai
ntpdate time.windows.com安装Docker
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。 这里的版本很重要,一定要对应,所有服务器都安装
安装Docker
# 清理旧的 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-plugindocker 换源
# 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(一定要确保启动成功)
# 下载到服务器
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/设置开机启动(最好手动复制)
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
EOFcat > /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# 执行开机启动
systemctl daemon-reload
systemctl enable cri-dockerd.service
systemctl restart cri-dockerd.service部署k8s与集群
除了特殊标记的,其他部分需要master 与 node 节点都执行
安装基础工具
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpgsudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg配置公共签名密钥
# 如果 `/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准备源仓库
# 此操作会覆盖 /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)
sudo apt-get install -y kubelet kubeadm kubectl锁定版本
# 锁定版本
apt-mark hold kubelet kubeadm kubectl
# 解除锁定
apt-mark unhold kubelet kubeadm kubectl配置kubelet
进入文件kubelet,1.30版本之后都是在 /etc/default/kubelet,之前是 /etc/sysconfig/kubelet
# 三台机器都执行
vim /etc/default/kubelet添加为如下配置,配置cgroup管理
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"设置开机自启动
注意: 这里只是设置开机启动,但是并没有启动 kubelet。请不要在此刻启动kubelet。那什么时候启动呢?等kubeadm init 的时候会自动带起来 kubelet
# 三台机器都执行
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来初始化集群,注意不要完全抄如下命令,请自行更改参数值。下面有参数释义。
# 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=9kubernetes-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表示输出的信息会很详细后续操作

# 只在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节点执行
# 在node节点执行
kubeadm join master:6443 --token x4hyb1.noymxgmeuf77uh5g \
--discovery-token-ca-cert-hash sha256:94098aaf486209272bd7f884d2ff695394e7c6ab6981cea17a2c6ee0b43b2b73
--cri-socket=unix:///var/run/cri-dockerd.sock执行检查
kubectl get nodes此时节点都还是NoteReady状态
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
下载配置
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml# 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
kubectl create -f custom-resources.yaml检测运行
kubectl get pods -n calico-system测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
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