CentOS7 / Debian10 使用 kubeadm 安装 Kubernetes (k8s) 1.27.2 (一控制节点+多工作...
source link: https://maxqiu.com/article/detail/155
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
2023/06/15 Linux Docker Kubernetes
官方文档:使用 kubeadm 引导集群
- 本教程适用于开发或测试环境,因为仅有一个控制节点,生产环境应当有多个控制节点
- 下文的命令除特殊说明外,在所有主机上都需要执行
- (2023-6-15)仅适用于
Debian 10
、CentOS 7.9
,在Debian 11
/Debian 12
上安装完成后会有问题,暂时未找到原因
下文的机器环境信息如下:
主机名 | ip | 角色 |
---|---|---|
node1 | 192.168.220.201 | 控制节点 |
node2 | 192.168.220.202 | 工作节点 |
node3 | 192.168.220.203 | 工作节点 |
系统检查与配置
机器唯一性
确保每个节点上 MAC
地址和 product_uuid
的唯一性
- 使用命令
ip link
或ifconfig -a
来获取网络接口的MAC
地址 - 可以使用
cat /sys/class/dmi/id/product_uuid
命令对product_uuid
校验
关闭防火墙
默认情况下, Debian
系统未安装 firewalld
防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭 selinux
仅 CentOS
系统
# 立即
setenforce 0
# 永久
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
关闭 swap
swapoff -a
编辑配置文件
vim /etc/fstab
在 /etc/fstab
中 swap
分区这行前加 #
# /dev/mapper/centos-swap swap swap defaults 0 0
设置 hostname
在各自节点设置
# node1
hostnamectl set-hostname node1
# node2
hostnamectl set-hostname node2
# node3
hostnamectl set-hostname node3
设置 hosts
cat >> /etc/hosts << EOF
192.168.220.201 node1
192.168.220.202 node2
192.168.220.203 node3
EOF
转发 IPv4 并让 iptables 看到桥接流量
加载系统模块
modprobe overlay
modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
配置 sysctl
写入配置文件永久生效
cat <<EOF | 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
保存后执行命令立即生效
sysctl -p
安装 containerd
设置软件源
按照以下教程设置源(仅需要执行到设置存储库并更新缓存,不需要安装 Docker
)
执行以下命令安装 containerd
# CentOS7
yum install -y containerd.io
# Debian10
apt-get install containerd.io
配置 container
默认的配置文件中禁止了 CRI
集成插件,即 disabled_plugins = ["cri"]
,需要启用 CRI
支持才能在 Kubernetes
集群中使用 containerd
# 方便起见,直接删除该配置文件并重启服务
rm -rf /etc/containerd/config.toml
systemctl enable containerd.service
systemctl restart containerd.service
安装 k8s
CentOS7
二选一即可
# 官方源(需要可以访问外网)
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# 阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
# 更新缓存
yum makecache fast
# 查看最新的版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 安装指定版本(2023-6-9最新)
yum install -y kubelet-1.27.2-0 kubeadm-1.27.2-0 kubectl-1.27.2-0 --disableexcludes=kubernetes
# 启动
systemctl enable --now kubelet
Debian10
# 官方源(需要可以访问外网)
curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# 阿里源
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | \
gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
二选一即可
# 官方源(需要可以访问外网)
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | \
tee /etc/apt/sources.list.d/kubernetes.list
# 阿里源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | \
tee /etc/apt/sources.list.d/kubernetes.list
# 更新源
apt-get update
# 查看最新版本
apt-cache madison kubeadm
# 安装最新版本(2023-6-9最新)
apt-get install kubelet=1.27.2-00 kubeadm=1.27.2-00 kubectl=1.27.2-00
# 保持当前版本
apt-mark hold kubelet kubeadm kubectl
部署控制节点
- 使用
--image-repository
设置不同的镜像源- 官方源:
--image-repository=registry.k8s.io
- 阿里源:
--image-repository=registry.aliyuncs.com/google_containers
- 官方源:
- 使用阿里源时,可能需要先执行以下命令手动拉取部分镜像
ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.6
ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
执行初始化
在控制节点上执行以下命令
# 官方源(需要可以访问外网)
kubeadm init \
--apiserver-advertise-address=192.168.220.201 \
--kubernetes-version v1.27.2 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.k8s.io
# 阿里源
kubeadm init \
--apiserver-advertise-address=192.168.220.201 \
--kubernetes-version v1.27.2 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers
初始化之后会显示如下类似内容
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.220.201:6443 --token g9t71p.wajxnogsklp2l02z \
--discovery-token-ca-cert-hash sha256:b20b3beed6eb847aac5085777e92b2c701a779b4e6e89d625d50c838f6e2cafd
其中 kubeadm join xxxxxx --token xxxxxx \ --discovery-token-ca-cert-hash xxxxxx
需要复制下来,用于从节点加入使用
配置环境变量
继续在控制节点上执行以下命令
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
部署工作节点
在工作节点执行以下命令
# 使用阿里源时,需要手动拉取一个镜像
ctr -n k8s.io i pull registry.aliyuncs.com/google_containers/pause:3.6
ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
# 加入
kubeadm join 192.168.220.101:6443 --token ua6ikc.zpbrhi2lr6hm5t9q \
--discovery-token-ca-cert-hash sha256:5e704218035996479d9b07f7b5fa17da6c647d84c8b9185d8360a477722400da
配置网络插件
在控制节点上执行以下命令:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
在控制节点上执行以下命令:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get nodes,pod,svc
展示类似于如下信息:
NAME STATUS ROLES AGE VERSION
node/node1 Ready control-plane 16h v1.27.2
node/node2 Ready <none> 16h v1.27.2
node/node3 Ready <none> 16h v1.27.2
NAME READY STATUS RESTARTS AGE
pod/nginx-77b4fdf86c-2s5dt 1/1 Running 1 (149m ago) 16h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h
service/nginx NodePort 10.106.208.51 <none> 80:31211/TCP 16h
通过访问 ip:31211
(端口是随机的,根据展示信息自行修改)查看页面
如果在执行 kubeadm init
或 kubeadm join
时出错后需要重新执行,则可以执行以下命令初始化
- 执行
kubeadm reset
重置kubeadm
安装的状态 - 执行
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
重置iptables
- 如果重置的是工作节点,则需要在控制节点执行
kubectl delete node <节点名称>
删除被重置的节点
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK