[toc]

K8s搭建流程-使用kubeadm

1 准备环境

1.1 服务器要求:

建议最小硬件配置:2核CPU、2G内存、20G硬盘,服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点。

1.2 软件环境:

软件版本
操作系统CentOS 7.7.1908 (Core)
Docker24.0.4 (当前最新版)
Kubernetes1.23

1.3 服务器规划:

服务器名称服务器IP备注
master10.39.40.124u/93G/755G 同时作为node节点
node110.39.40.232u/132G/3.6T
node210.39.40.364u/141G/1.1T

部署使用root账号, 非root账号很多命令相对麻烦

2. 主机名解析

编辑所有节点服务器的 /etc/hosts 文件 ,添加主机名, 执行命令:

cat >> /etc/hosts  << EOF
10.39.97.19  master
10.39.97.20  node1
EOF

用sudo cat追加文件出错_iteye_2225的博客-CSDN博客

设置每台节点的hostname, 分别执行

master节点:

hostnamectl set-hostname master

node1节点:

hostnamectl set-hostname node1

3.时间同步

启动chronyd服务

systemctl start chronyd 
systemctl enable chronyd 
date

如果没有安装 chronyd , 可以使用 yum install chrony -y 安装

4.禁用selinux和firewalld服务

关闭firewalld服务,并 设置开机不启动

systemctl stop firewalld 
systemctl disable firewalld

关闭selinux服务,重启后生效

sed -i 's/enforcing/disabled/' /etc/selinux/config

selinux - linux的安全系统, 可以尽可能的控制权限最小化

5.禁用swap分区

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭

6.添加网桥过滤和地址转发功能

cat >> /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

#然后执行
sysctl --system  

为使之前的配置生效,重启所有节点服务器

reboot

7.docker安装

7.1 安装docker依赖

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

这里使用阿里的镜像一键安装, 默认装最新版, 如果是要指定版本,就采用手动安装的方式, 会帮我们做如下操作

  1. 安装yum-utils

  2. 设置docker仓库镜像为阿里的

  3. 安装 docker-ce / docker-ce-cli / containerd.io / docker-compose / makecache

    CentOS Docker 安装 | 菜鸟教程 (runoob.com)

7.2 配置docker 镜像加速器和默认存储目录

cat <<EOF> /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "data-root": "/app/docker-home",
  "registry-mirrors": ["https://registry.docker-cn.com", "https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn","https://alzgoonw.mirror.aliyuncs.com"]
}
EOF

【简记】修改Docker数据目录位置,包含镜像位置 - 东北小狐狸 - 博客园 (cnblogs.com)

7.3 启动Docker

# 设置开机启动
systemctl enable docker 
# 启动docker
systemctl start docker

7.4 验证

docker version 检查版本

可以看到 docker版本, 容器数, 镜像数, root dir 路径, 镜像仓库 等等

docker run hello-world

执行一个 hello-world , 如果能运行成功, 则表示安装成功, 第一次运行要pull 镜像, 可能会慢一点, 等一会它

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

7.5 安装cri-dockerd

从v1.24起,Docker不能直接作为k8s的容器运行时 ,因为在k8s v1.24版本移除了叫dockershim的组件,这是由k8s团队直接维护而非Docker团队维护的组件,这意味着Docker和k8s的关系不再像原来那般亲密,开发者需要使用其它符合CRI(容器运行时接口 )的容器运行时工具(如containerd, CRI-O等),当然这并不意味着新版本的k8s彻底抛弃Docker(由于Docker庞大的生态和广泛的群众基础,显然这并不容易办到),在原本安装了Docker的基础上,可以通过补充安装cri-dockerd ,以满足容器运行时接口的条件,从某种程度上说,cri-dockerd就是翻版的dockershim。

本篇的k8s 刚好在 1.23版本, 所以不用特意安装

Kubernetes最新版2023.07v1.27.4安装和集群搭建保姆级教程 - 知乎 (zhihu.com)

8.kubernetes的Yum源切换成国内源

cat >> /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

9.安装指定版本 kubeadm,kubelet和kubect

yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
#设置kubelet开机启动
systemctl enable kubelet

10. 通过 kubeadm 部署Kubernetes

10.1 部署master节点

Kubernetes 初始化,下面的操作只需要在master节点上执行即可

kubeadm init \
  --apiserver-advertise-address=10.39.40.1 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=192.168.128.0/17 \
  --pod-network-cidr=192.168.0.0/17 \
  --ignore-preflight-errors=all

–apiserver-advertise-address #集群通告地址(master 机器IP) –image-repository #由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址 –kubernetes-version #K8s版本,与上面安装的一致 –service-cidr #集群内部service网络 –pod-network-cidr #集群内部pod网络,与下面部署的CNI网络组件yaml中保持一致

搭建k8s时service-cidr是根据自己本地得ip地址写得 (aliyun.com) img

成功后末尾输出信息如下

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

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.39.40.1:6443 --token 1j3dl9.1z8wjckd94xluwh6 \
    --discovery-token-ca-cert-hash sha256:c464e3ebd7f432f094bacf06269003730f010b431c3fb76acade4f43d4740

创建客户端授权文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

授权kubectl 客户端能连接上 k8s, 这里只在master配置, 如果需要在其他节点配置, 就把 /etc/kubernetes/admin.conf 文件复制到其他节点上

10.2 将node节点加入集群

在所有node节点上执行以下命令(初始化master 得到的命令)

kubeadm join 10.39.40.1:6443 --token 1j3dl9.1z8wjckd94xluwh6 \
    --discovery-token-ca-cert-hash sha256:c464e3ebd7f432f094bacf06269003730f010b431c3fb76acade4f43d4740

11.部署容器网络(CNI)

pod之前需要网络通信, 但是k8s没有具体实现, 只是开了CNI能力, 所以需要其他方案来完善

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。 官方的部署文档使用的是 flannel

Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave_文化 & 方法_Rancher_InfoQ精选文章

Master 节点下载Calico YAML 文件

curl https://docs.projectcalico.org/v3.7/manifests/calico.yaml -O

下载完后修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init 的 –pod-network-cidr 指定的一样

image-20230802201055835

创建calico网络,Master节点上执行

kubectl apply -f calico.yaml

查看网络状态

kubectl get pods -n kube-system -w

等待一段时间,calico 和 coredns 相关pod处于ready状态, 这个过程要等好几分钟

NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-dbd6bd945-vlqxh   1/1     Running   0          4m51s
kube-system   calico-node-hkp5s                         1/1     Running   0          4m51s
kube-system   calico-node-ksxg8                         1/1     Running   0          4m51s
kube-system   calico-node-srd2r                         1/1     Running   0          4m51s
kube-system   coredns-7f6cbbb7b8-svhdg                  1/1     Running   0          22h
kube-system   coredns-7f6cbbb7b8-vmm2h                  1/1     Running   0          22h
### 上面这些
kube-system   etcd-k8s-master                           1/1     Running   0          22h
kube-system   kube-apiserver-k8s-master                 1/1     Running   0          22h
kube-system   kube-controller-manager-k8s-master        1/1     Running   0          22h
kube-system   kube-proxy-4dvgq                          1/1     Running   0          22h
kube-system   kube-proxy-5jhkj                          1/1     Running   0          22h
kube-system   kube-proxy-5jtwf                          1/1     Running   0          22h
kube-system   kube-scheduler-k8s-master                 1/1     Running   0          22h

查看节点状态,处于 ready 状态

[root@master01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   21h   v1.23.4
node1   Ready    <none>                 16h   v1.23.4
node2   Ready    <none>                 16h   v1.23.4
[root@master01 ~]# 
可以看到所有节点的状态已经变为是Ready了。

至此K8s已经部署完成,已可以简单使用,但是缺少NFS,不支持灵活的数据持久化

12.其他维护事项

重新申请 join token 24小时有效

kubeadm token create --print-join-command

master 节点同时设置为 node节点

kubectl taint node master node-role.kubernetes.io/master-

恢复 master only

kubectl taint node master node-role.kubernetes.io/master="":NoSchedule

K8s搭建流程-使用kubeadm (flowus.cn)

kubernetes(k8s)环境搭建 - 知乎 (zhihu.com)

Kubernetes最新版2023.07v1.27.4安装和集群搭建保姆级教程 - 知乎 (zhihu.com)

Windows Docker 安装 | 菜鸟教程 (runoob.com)