CentOS7使用kubeadm部署k8s-1.28集群
使用自定义kubernets镜像仓库进行初始化kubeadm参数详解参数名称参数含义默认值API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。API 服务器绑定的端口。6443为控制平面指定一个稳定的 IP 地址或 DNS 名称。为服务的虚拟 IP 地址另外指定 IP 地址段。为服务另外指定域名指明 Pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会
参考资料:生产环境
记录使用CentOS7.9进行k8s-1.28版本部署,运行时环境使用containerd,网络插件使用calic,集群搭建完成后。搭建NFS共享存储环境,测试运行pod并挂载使用持久卷。
服务器角色
主机名 | **IP地址 ** | 角色 | 基础组件 |
---|---|---|---|
el7-linux-node-01 | 192.168.240.11 | k8s-master | kubeadm,kubelet,kubectl,containerd,nfs-server |
el7-linux-node-02 | 192.168.240.12 | k8s-worker | kubeadm,kubelet,kubectl,containerd,nfs-client |
el7-linux-node-03 | 192.168.240.13 | k8s-worker | kubeadm,kubelet,kubectl,containerd,nfs-client |
软件环境
软件名称 | 版本 |
---|---|
CentOS | 7.9 |
Kubernetes | 1.28 |
contianerd | 1.6.28 |
安装步骤
- 确认运行环境
- 环境准备
- 安装容器运行时
- 安装kubeadm、kubelet、kubectl
- 配置cgroup驱动程序
kubeadm安装配置
参考资料:安装 kubeadm
确认运行环境
服务器准备
- CPU 2核,内存2G以上
- 集群主机间相互通信
- 节点之间不可以有重复主机名、MAC或product_uuid
- 禁用交接分区
系统初始化配置
所有服务器执行
禁用selinux
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
禁用swap
# 关闭swap分区
swapoff -a
sed -i 's|^\(/.*swap\)|#\1|' /etc/fstab
禁用防火墙
# 关闭防火墙
systemctl stop iptables
systemctl disable iptables
升级操作系统内核
yum -y update kernel*
管理节点密钥配置
# 生成密钥
ssh-keygen -t ecdsa -f /root/.ssh/id_rsa -N ''
# 复制密钥到所有服务器
ssh-copy-id 192.168.240.11
ssh-copy-id 192.168.240.12
ssh-copy-id 192.168.240.13
主机解析配置
el-linux-node-01执行
cat >> /etc/hosts << EOF
192.168.240.11 el7-linux-node-01
192.168.240.12 el7-linux-node-02
192.168.240.13 el7-linux-node-03
EOF
scp /etc/hosts 192.168.240.12:/etc/hosts
scp /etc/hosts 192.168.240.13:/etc/hosts
安装容器运行时
每台服务器安装,在此采用Docker-CE + cri-dockerd,由于kubernetes在1.24(含)以后的版本中移除了cri-dockerd。需要手动进行部署
开启网络转发
以下命令在每台服务器上执行
转发 IPv4 并让 iptables 看到桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 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 参数而不重新启动
sudo sysctl --system
检查开启结果
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl \
net.bridge.bridge-nf-call-iptables \
net.bridge.bridge-nf-call-ip6tables \
net.ipv4.ip_forward
containerd安装
以下命令在每台服务器上执行
安装containerd
# 配置docker-ce软件源
# 移除已经安装的docker版本
yum remove -y docker docker-common docker-selinux docker-engine
# 下载docker-ce软件源文件
curl -o /etc/yum.repos.d/docker-ce.repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 替换官方源地址为国内yum源地址。
sed -e 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' \
-i.bak /etc/yum.repos.d/docker-ce.repo
# 安装docker-ce
yum makecache fast
# 安装containerd
yum install -y containerd
配置containerd
# 备份默认配置文件
mv /etc/containerd/config.toml /etc/containerd/config.toml.default
# 重新生成配置文件
containerd config default > /etc/containerd/config.toml
sed -i 's|registry.k8s.io|registry.aliyuncs.com/google_containers|g' /etc/containerd/config.toml
启动containerd
systemctl enable containerd
systemctl restart containerd
systemctl status containerd
配置客户端工具
配置crictl工具运行时接口地址(runtime-endpoint),工具使用方法参考:cri-tools/docs/crictl.md at master · kubernetes-sigs/cri-tools
# 配置crictl工具运行时接口地址(runtime-endpoint)
crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
crictl ps
安装kubeadm、kubelet、kubectl
需要在每台机器上安装以下的软件包:
- kubeadm:用来初始化集群的指令。
- kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与集群通信的命令行工具。
kubeadm 不能帮你安装或者管理 kubelet 或 kubectl, 所以你需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 之间可以存在一个次要版本的偏差,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
参考资料:安装 kubeadm
配置Yum源
以下命令在每台服务器上执行
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
sed -e "s|packages.cloud.google.com|mirrors.ustc.edu.cn/kubernetes|" \
-e "s|gpgcheck=1|gpgcheck=0|" \
-i /etc/yum.repos.d/kubernetes.repo
安装kubeadm
以下命令在每台服务器上执行
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
使用kubeadm创建集群
创建集群步骤
- 准备容器镜像
- 初始化控制平面节点
- 安装Pod网络组件-calico
- 向集群中加入工作节点
准备容器镜像
查看镜像列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
由于官网镜像在国内访问不稳定,会出现访问失败。
使用国内镜像进行替换下载,在此pause使用3.9会导致集群无法初始化,还需要下载pause:3.6
以下命令在每台服务器上执行
使用自定义镜像仓库拉取镜像
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers
方法二
# 下载对应的镜像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.26.1
docker pull registry.aliyuncs.com/google_containers/pause:3.6
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.6-0
docker pull coredns/coredns:1.9.3
# 将镜像标记为官方镜像版本
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.1 registry.k8s.io/kube-apiserver:v1.26.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.26.1 registry.k8s.io/kube-controller-manager:v1.26.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.26.1 registry.k8s.io/kube-scheduler:v1.26.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.26.1 registry.k8s.io/kube-proxy:v1.26.1
docker tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
docker tag registry.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.6-0 registry.k8s.io/etcd:3.5.6-0
docker tag coredns/coredns:1.9.3 registry.k8s.io/coredns/coredns:v1.9.3
初始化控制平面节点
控制节点初始化
以下命令在服务器el7-linux-01(192.168.240.11)上执行
自定义镜像进行初始化(推荐)
# 使用自定义kubernets镜像仓库进行初始化
kubeadm init \
--apiserver-advertise-address 192.168.240.11 \
--apiserver-bind-port 6443 \
--control-plane-endpoint 192.168.240.11 \
--service-cidr=10.119.0.0/16 \
--service-dns-domain="cluster.local" \
--pod-network-cidr=10.120.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers
kubeadm参数详解
参考资料:kubeadm init
参数名称 | 参数含义 | 默认值 |
---|---|---|
–apiserver-advertise-address | API 服务器所公布的其正在监听的 IP 地址。 | 如果未设置,则使用默认网络接口。 |
–apiserver-bind-port 6443 | API 服务器绑定的端口。 | 6443 |
–control-plane-endpoint | 为控制平面指定一个稳定的 IP 地址或 DNS 名称。 | |
–service-cidr | 为服务的虚拟 IP 地址另外指定 IP 地址段。 | “10.96.0.0/12” |
–service-dns-domain | 为服务另外指定域名 | “cluster.local” |
–pod-network-cidr | 指明 Pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDR。 | |
–image-repository | 选择用于拉取控制平面镜像的容器仓库。 | “registry.k8s.io” |
默认镜像进行初始化(不推荐)
此命令初始化时使用默认镜像仓库镜像进行初始化,由于k8s镜像仓库在国内不能进行访问,此方法不推荐
# 使用默认镜像仓库镜像进行初始化
kubeadm init \
--apiserver-advertise-address 192.168.240.11 \
--apiserver-bind-port 6443 \
--control-plane-endpoint 192.168.240.11 \
--service-cidr=10.119.0.0/16 \
--service-dns-domain="cluster.local" \
--pod-network-cidr=10.120.0.0/16
环境变量配置
# 设置环境变量,官网建议root用户使用
export KUBECONFIG=/etc/kubernetes/admin.conf
cat <<EOF | tee -a ~/.bash_profile
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bash_profile
# 复制控制配置,便于后继使用kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# cp /etc/kubernetes/admin.conf ~/.kube/config
集群节点加入
控制节点初始化时输出以下命令,用于添加管理节点与工作节点
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.240.11:6443 --token nwc0z8.jdfc102z4ocpgtlo \
--discovery-token-ca-cert-hash sha256:aafd6f69a0a10e22fabdf2367ef6cc200f188fd7f4cc330b02b7ac7d256e304b \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.240.11:6443 --token nwc0z8.jdfc102z4ocpgtlo \
--discovery-token-ca-cert-hash sha256:aafd6f69a0a10e22fabdf2367ef6cc200f188fd7f4cc330b02b7ac7d256e304b
工作节点加入集群
kubeadm join 192.168.240.11:6443 --token nwc0z8.jdfc102z4ocpgtlo \
--discovery-token-ca-cert-hash sha256:aafd6f69a0a10e22fabdf2367ef6cc200f188fd7f4cc330b02b7ac7d256e304b
加入集群令牌管理
上面的输出结果中的token令牌时效为23h,超过时效后可以通过以下命令重新获取
kubeadm token create --print-join-command
查看已经创建的令牌列表
kubeadm token list
kubeadm集群重置
kubeadm重置集群配置命令,如在安装过程中需要对集群进行重置,使用以下命令完成操作
kubeadm reset
docker ps -qa |xargs docker rm -f
安装网络组件-Calico
你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
- 注意你的 Pod 网络不得与任何主机网络重叠: 如果有重叠,你很可能会遇到问题。 (如果你发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突, 则应考虑使用一个合适的 CIDR 块来代替, 然后在执行 kubeadm init 时使用 --pod-network-cidr 参数并在你的网络插件的 YAML 中替换它)。
- 常见的网络插件有flannel,Calico,Canal,Weave,各网络组件之间的比较参考资料:Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave_文化 & 方法_Rancher_InfoQ精选文章
Flannel项目地址:https://github.com/flannel-io/flannel
Calico项目地址:https://github.com/projectcalico/calico
本次实验使用Calico组件进行网络配置
cd /root
mkdir -pv k8s/calico
cd k8s/calico
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
sed -i "s|192.168|10.120|" custom-resources.yaml
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml
# #
# kubctl init --pod-network-cidr=10.224.0.0/16 \
# --cri-socket unix:///var/run/cri-dockerd.sock
监测calico各个pods运行状态
应用calico配置文件后,使用watch 监测calico各个pods运行状态,直到所有pods为running。
watch kubectl get pods -n calico-system
加入工作节点到集群
检查控制节点状态是否为ready状态;
kubectl get nodes
由于使用了cri-dockerd,需要指定 cri-socket参数用于加入集群工作节点
kubeadm join 192.168.240.11:6443 --token 0q0uyq.biivqkdgghcp8vl3 \
--discovery-token-ca-cert-hash sha256:02c0f4c894db2e1e00084fa41a8309458c97b3945f545fbb01df3fca3d0ea9ad
检查集群节点状态
kubectl get nodes
从集群删除工作节点
参考资料:安全地清空一个节点
下线待删除节点
在控制节点驱逐待删除的工作节点
# 查询集群中的节点
kubectl get nodes
# 清空指定节点的服务
# 命令格式:
# kubectl drain --ignore-daemonsets <节点名称>
kubectl drain --ignore-daemonsets el7-linux-node-03
# 下线指定节点
# 命令格式:
# kubectl uncordon <node name>
kubectl uncordon el7-linux-node-03
从集群中删除节点
在控制节点执行以下命令
kubectl delete node el7-linux-node-03
清理工作节点
在待退出集群的工作节点执行以下命令
重置节点
kubeadm reset
停止服务
停止kubelet、运行时服务(containerd、docker等)、删除相关的工作目录
# 停止kubelet服务
systemctl stop kubelet
systemctl disable kubelet
# 停止containerd服务
systemctl stop containerd
systemctl disable containerd
# 停止docker运行时
systemctl stop docker docker.socket
systemctl disable docker docker.socket
删除工作目录
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
删除相关网卡
安装网络配置工具
yum -y install net-tools
停用并删除网卡
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
ifconfig vxlan.calico down
ip link delete vxlan.calico
ifconfig docker0 down
ip link delete docker0
持久化存储配置
使用NFS进行持久化存储
从实验角度考虑,使用NFS安装配置方便简单,本文中使用nfs进行持久化存储的配置与使用。假设所有节点使用持久化存储目录均为:/www/server/k8s/data
参考资料:
卷 存储类 K8S持久化存储:NFS+StorageClass实现动态供给
NFS服务安装配置
NFS服务安装
在所有服务器执行
yum -y install nfs-utils
NFS服务配置
在el7-linux-node-01上启用NFS服务,并配置NFS共享;
# 创建共享存储目录
mkdir -pv /www/server/k8s/data
echo "nfs_test" > /www/server/k8s/data/nfs.txt
# 配置nfs共享目录
cat >> /etc/exports << eof
/www/server 192.168.240.0/24(rw,no_root_squash,sync)
eof
exportfs -av
# 启动nfs服务
systemctl start nfs-server
systemctl enable nfs-server
NFS挂载测试
在el7-linux-node-02和el7-linux-node-03上执行以下命令挂载NFS共享目录
# 创建
mkdir -pv /www/server/k8s/data
#mount -t nfs 192.168.240.11:/www/server/k8s/data /www/server/k8s/data
# 写入磁盘挂载配置文件
cat << EOF | tee -a /etc/fstab
192.168.240.11:/www/server/k8s/data /www/server/k8s/data nfs defaults,_netdev 0 0
EOF
cat /etc/fstab
mount -a
查看文件共享内容
ll /www/server/k8s/data/
cat /www/server/k8s/data/nfs.txt
在Pod中挂载NFS
参考资料:NFS卷
直接挂载使用
配置文件如下
# 创建nginx共享目录
mkdir -pv /www/server/k8s/data/nginx/html/
# 创建nginx首页文件
echo "hello k8s nfs test" > /www/server/k8s/data/nginx/html/index.html
# 创建nginx启动配置文件,并挂载nfs到nginx站点目录
cat << EOF | tee /root/k8s/nginx.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx-direct-nfs
spec:
containers:
- image: nginx
name: test-nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
nfs:
server: 192.168.240.11
path: /www/server/k8s/data/nginx/html
readOnly: false
EOF
# 启动pod
kubectl apply -f /root/k8s/nginx.yml
检查挂载结果
# 查看pod运行详情,并查看pod的ip地址
kubectl get pod -o wide nginx-direct-nfs
# 使用curl请求nginx服务,是否输出测试页面内容
curl $(kubectl get pod -o wide nginx-direct-nfs |tail -n 1|awk '{print $6}')
使用持久卷挂载NFS
参考资料:存储类-nfs https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#claims-as-volumesDynamic sub-dir volume provisioner on a remote NFS server.
使用持久卷挂载时,挂载关系如下图所示:Pod -> pvc(持久卷申领[PersistentVolumeClaim]) -> pv(PersistentVolume[provisioner]) -> nfs(StorageClass)
下载NFS subdir 外部驱动
# 下载nfs外部署驱动部署文件
cd /root
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
# 拷贝部署文件到时部署目录
cd nfs-subdir-external-provisioner
cp -a deploy /root/k8s/nfs-subdir-external-provisioner
cd /root/k8s/nfs-subdir-external-provisioner
替换驱动配置文件
# 由于nfs-subdir-external-provisioner镜像仓库地址registry.k8s.io国内无法访问,
# 在此将其替换为公司镜像仓库地址,此镜像已经拉取并上传到公司
sed -i 's|registry.k8s.io/sig-storage|hub.daqsoft.com:5000/daqsoft/k8s|g' deployment.yaml
# 替换nfs服务器配置信息
sed -i 's|10.3.243.101|192.168.240.11|g' deployment.yaml
sed -i 's|/ifs/kubernetes|/www/server/k8s/data|g' deployment.yaml
部署nfs驱动、sc、pv、pvc
kubectl apply -f rbac.yaml
kubectl apply -f deployment.yaml
kubectl apply -f class.yaml
kubectl apply -f test-claim.yaml
kubectl apply -f test-pod.yaml
检查部署状态
kubectl get sc -o wide
kubectl get pv -o wide
kubectl get pvc -o wide test-claim
kubectl get pod -o wide test-pod
检查测试文件
test-pod.yaml文件内容
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.28
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1" #pod运行后在/mnt目录中创建success文件
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
检查nfs服务目录中是否有test-pod创建的文件,持久卷在nfs服务中创建的目录名称为:命名空间-pvc名称-pv名称,相关信息通过get pv进行获取;如我们创建的pvc(test-claim)在default空间下,其对应nfs中的目录名称为:default-test-claim-pvc-234376c4-995b-4f97-b449-952c4a90dd5e
ls /www/server/k8s/data/default-test-claim-pvc-234376c4-995b-4f97-b449-952c4a90dd5e
更多推荐
所有评论(0)