安装部署K8S集群环境

1 系统初始化配置(所有节点同步操作)
1.1 实验环境
名称 IP 地址 操作系统 配置
k8s-master 10.0.0.100 CentOS7.9 2 核 4G
k8s-node1 10.0.0.101 CentOS7.9 2 核 2G
k8s-node2 10.0.0.102 CentOS7.9 2 核 2G

1.2 关闭防火墙和 SELinux



# 关闭防火墙并设置为开机自动关闭
systemctl disable --now firewalld

# 关闭 SELinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 临时关闭 SELinux
setenforce 0

1.3 配置 hosts 文件域名解析

cat >> /etc/hosts <<EOF
10.0.0.100 k8s-master 
10.0.0.101 k8s-node1
10.0.0.102 k8s-node2
EOF

1.4 修改主机名



# master 节点:
hostnamectl set-hostname k8s-master

# node1 节点:
hostnamectl set-hostname k8s-node1

# node2 节点:
hostnamectl set-hostname k8s-node2


1.5 时间同步



yum install -y chrony
sed -ri 's/^pool.*/#&/' /etc/chrony.conf
cat >> /etc/chrony.conf << EOF pool ntp1.aliyun.com iburst EOF systemctl restart chronyd chronyc sources # 修改时区,如果之前是这个时区就不用修改 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo 'Asia/Shanghai' > /etc/timezone

1.6 关闭交换分区



# 关闭当前交换分区
swapoff -a
# 禁止开机自动启动交换分区
sed -ri 's/.*swap.*/#&/' /etc/fstab


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


cat >> /etc/sysctl.d/kubernetes.conf <

1.8 配置免密登录(可选)



ssh-keygen  # 连续回车三次
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.100
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.101
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.102


测试登录 ssh root@10.0.0.100
无需密码登录即成功
1.9 安装 ipvs 转发支持
在 kubernetes 中 Service 有两种代理模型,一种是基于 iptables 的,一种是基于 ipvs,两者对比 ipvs 的性能要高。默认使用 iptables,所以要手动加载 ipvs。



# 安装依赖包
yum install -y conntrack ipvsadm ipset jq iptables sysstat libseccomp wget 

cat > /etc/sysconfig/modules/ipvs.modules < /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# 获取阿里云 YUM 源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 yum-config-manager 配置工具
yum -y install yum-utils

# 设置 yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 docker-ce 版本,使用最新版本 24.0.7,也可以指定安装版本
yum install -y docker-ce
# 启动并设置开机自启动
systemctl enable --now docker

# 查看版本号
docker --version
# 查看版本具体信息
docker version

# Docker 镜像源设置
# 修改文件 /etc/docker/daemon.json,没有这个文件就创建
# 添加以下内容后,重启 docker 服务:
cat >/etc/docker/daemon.json< /etc/containerd/config.toml

# 配置 containerd cgroup 驱动程序为 systemd
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

# 将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源
sed -i "s#registry.k8s.io/pause:3.6#registry.aliyuncs.com/google_containers/pause:3.9#g"       /etc/containerd/config.toml

# 修改 runtime_type 为 io.containerd.runc.v2
runtime_type = "io.containerd.runc.v2"

# 启动 containerd 并设置开机自启动
systemctl enable --now containerd
# 查看 containerd 状态
systemctl status containerd

说明:

1、dockerd 实际真实调用的还是 containerd 的 api 接口,containerd 是 dockerd 和 runC 之间的一个中间交流组件。所以启动 docker 服务的时候,也会启动 containerd 服务的。

2、kubernets 自v1.24.0 后,就不再使用 docker.shim,替换采用 containerd 作为容器运行时端点。因此需要安装 containerd(在 docker 的基础下安装),上面安装 docker 的时候就自动安装了 containerd 了。这里的 docker 只是作为客户端而已。容器引擎还是 containerd。

2 安装 kubernetes 集群
2.1 配置阿里云上 k8s 的 yum 源(所有节点执行)



cat > /etc/yum.repos.d/kubernetes.repo << EOF
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF

## 查看所有的可用版本
yum list kubelet --showduplicates | sort -r |grep 1.28

2.2 安装 kubectl,kubelet 和 kubeadm(所有节点执行)



# 若不指定版本默认安装最高版本
yum install -y kubectl-1.28.2-0 kubelet-1.28.2-0 kubeadm-1.28.2-0

# 设置 kubelet 为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet

# 准备 k8s1.28.2 所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.2

# 可以提前把镜像下载好,这样安装快
crictl pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
crictl pull registry.aliyuncs.com/google_containers/pause:3.9
crictl pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
crictl pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

2.3 集群初始化(在 master 上执行)



kubeadm init --kubernetes-version=v1.28.2 \
--pod-network-cidr=10.224.0.0/16 \
--apiserver-advertise-address=10.0.0.105 \
--service-cidr=192.168.0.0/16 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all

–apiserver-advertise-address 集群 apiServer 地址(master 节点 IP 即可)

–image-repository 由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址

–kubernetes-version K8s 版本,与上面安装的一致

–service-cidr 集群内部虚拟网络,Pod 统一访问入口

–pod-network-cidr Pod 网络,,与下面部署的 CNI 网络组件 yaml 中保持一致 安装成功会输出以下内容:

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 10.0.0.105:6443 –token 70n2ca.0mug2am9i77gx2wb \
–discovery-token-ca-cert-hash sha256:af51d42c76b4d67e52bccd3369465f8d72d075337b4426bdb0ac6d70dbaaa4c1

2.4 重置后再初始化(可选)
若集群初始化失败,可以通过排障后重新初始化集群



kubeadm reset
rm -fr ~/.kube/  /etc/kubernetes/* var/lib/etcd/*

2.5 配置环境变量



mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 临时生效(退出当前窗口重连环境变量失效)
export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推荐)
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source  ~/.bash_profile

2.6 node 工作节点加入 k8s 集群
根据 master 节点最后输出的内容,直接在 node1 和 node2 节点上执行



kubeadm join 10.0.0.105:6443 --token gxs9lb.jo9dcih5drihlb7w \
  --discovery-token-ca-cert-hash sha256:3522f10099342f88aafd7043b05f3e81cc0ff53873e8a48dbc39e0b1a3d2e67b

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:



kubeadm token list

默认情况下, 令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:



kubeadm token create

再查看



kubeadm token list

如果你没有 –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:



openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

如果执行 kubeadm init 时没有记录下加入集群的命令,可以通过以下命令重新创建 (推荐)一般不用上面的分别获取 token 和 ca-cert-hash 方式,执行以下命令一气呵成:



kubeadm token create --print-join-command

2.7 查看节点状态



[root@k8s-master ~]# kubectl get node
NAME         STATUS     ROLES           AGE   VERSION
k8s-master   NotReady   control-plane   14m   v1.28.2
k8s-node1    NotReady             12m   v1.28.2
k8s-node2    NotReady             12m   v1.28.2

发现节点是 NotReady 状态,说明集群还不可以使用,还需要安装网络插件。

2.8 安装网络插件(master 节点操作)
网络组件有很多种,只需要部署其中一个即可,推荐 Calico。

Calico 是一个纯三层的数据中心网络方案,Calico 支持广泛的平台,包括 Kubernetes、OpenStack 等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供 ACL 功能。

(1)下载 calico 的 yaml 文件



wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml

(2)修改 calico.yaml



# (1)修改 pod 容器网络
sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml
# (2)添加网卡信息
 - name: IP_AUTODETECTION_METHOD
   value: "interface=ens33"

# (3)修改仓库
将 docker.io 修改为 docker.m.daocloud.io

安装部署 K8S 集群环境

(2)安装 calico



kubectl apply -f calico.yaml

2.9 给 node 节点打标签(可选)



kubectl label nodes k8s-node1 node-role.kubernetes.io/worker=worker
kubectl label nodes k8s-node2 node-role.kubernetes.io/worker=worker

2.10 验证集群
(1)查看集群信息



[root@k8s-master ~]#  kubectl cluster-info
Kubernetes control plane is running at https://10.0.0.100:6443
CoreDNS is running at https://10.0.0.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

(2)查看节点信息



[root@k8s-master ~]# kubectl get node
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   39m   v1.28.2
k8s-node1    Ready    worker          38m   v1.28.2
k8s-node2    Ready    worker          38m   v1.28.2

(3)查看 pod 运行状态



[root@k8s-master ~]# kubectl get pods -A

安装部署 K8S 集群环境
(4)测试:创建一个 nginx 服务



# 创建 nginx 的 deployment
kubectl create deployment nginx  --image=docker.m.daocloud.io/nginx:1.25

# 暴露端口
[root@k8s-master ~]# kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort
service/nginx exposed
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   192.168.0.1               443/TCP        4h21m
nginx        NodePort    192.168.190.124           80:31732/TCP   3s


登录测试:http://10.0.0.100:31732

至此,集群已搭建完成并测试可用!

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
评论 抢沙发
  • 武穆逸仙

    昵称

  • 取消回复

    请填写用户信息:

图片正在生成中,请稍后...