[toc]
K8s搭建流程-使用kubeadm
1 准备环境
1.1 服务器要求:
建议最小硬件配置:2核CPU、2G内存、20G硬盘,服务器最好可以访问外网,会有从网上拉取镜像需求,如果服务器不能上网,需要提前下载对应镜像并导入节点。
1.2 软件环境:
软件 | 版本 |
---|---|
操作系统 | CentOS 7.7.1908 (Core) |
Docker | 24.0.4 (当前最新版) |
Kubernetes | 1.23 |
1.3 服务器规划:
服务器名称 | 服务器IP | 备注 |
---|---|---|
master | 10.39.40.1 | 24u/93G/755G 同时作为node节点 |
node1 | 10.39.40.2 | 32u/132G/3.6T |
node2 | 10.39.40.3 | 64u/141G/1.1T |
部署使用root账号, 非root账号很多命令相对麻烦
2. 主机名解析
编辑所有节点服务器的 /etc/hosts 文件 ,添加主机名, 执行命令:
cat >> /etc/hosts << EOF
10.39.97.19 master
10.39.97.20 node1
EOF
设置每台节点的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
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
这里使用阿里的镜像一键安装, 默认装最新版, 如果是要指定版本,就采用手动安装的方式, 会帮我们做如下操作
安装yum-utils
设置docker仓库镜像为阿里的
安装 docker-ce / docker-ce-cli / containerd.io / docker-compose / makecache
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
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中保持一致
成功后末尾输出信息如下:
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 指定的一样
创建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
kubernetes(k8s)环境搭建 - 知乎 (zhihu.com)