写在前面:

本文将以 Kubernetes v1.23 版本为例,使用 kubeadm 在服务器上快速搭建一套完整的 Kubernetes 集群。容器运行时采用 Docker,并使用与之兼容的 CNI 网络插件(如 flannel、calico 等)进行网络通信配置。通过本文,你将能够快速理解并完成一个可用的 Kubernetes 集群环境,为后续的微服务部署和容器化实践打下坚实的基础。

1. 环境规划

操作系统: CentOS 7.9

配置:4vCPU/4G内存

网络模式:NAT模式

主机网络: 192.168.0.0/24

Pod网络: 10.100.0.0/16

Service网络: 10.200.0.0/16

K8S集群角色

IP

主机名

控制节点master

192.168.0.160

k8s-master

工作节点node02

192.168.0.162

k8s-node02

工作节点node03

192.168.0.163

k8s-node03

2. 初始化

初始化的操作需要所有主机都要执行

2.1 修改主机名

## 在192.168.0.160上
[root@k8s-master ~]# hostname set-hosname k8s-master
## 在192.168.0.162上
[root@k8s-node02 ~]# hostname set-hosname k8s-node02
## 在192.168.0.163上
[root@k8s-node03 ~]# hostname set-hosname k8s-node03

2.2 配置主机 hosts 文件,相互之间通过主机名互相访问

## 在所有主机上执行
[root@k8s-master ~]# cat >> /etc/hosts << EOF
192.168.0.160 k8s-master
192.168.0.162 k8s-node02
192.168.0.163 k8s-node03
EOF

2.3 配置主机之间无密码登录

[root@k8s-master ~]# ssh-keygen #一路回车,不输入密码 
## 把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-master ~]# ssh-copy-id -i k8s-node02
[root@k8s-master ~]# ssh-copy-id -i k8s-node03

2.4 关闭swap分区,提升性能

## 所有主机执行
## 临时关闭
[root@k8s-master ~]# swapoff -a 

## 永久关闭
[root@k8s-master ~]# vim /etc/fstab
#如果是克隆的虚拟机,需要删除 UUID
#/dev/mapper/centos-swap swap swap defaults 0 0

2.5 修改内核参数

## 所有主机都要执行
[root@k8s-master ~]# modprobe br_netfilter 
[root@k8s-master ~]# echo "modprobe br_netfilter" >> /etc/profile 
[root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf <<EOF 
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.ipv4.ip_forward = 1 
EOF 
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf

2.6 关闭防火墙

## 所有主机上执行
[root@k8s-master ~]# systemctl stop firewalld ; systemctl disable firewalld

2.7 关闭selinux

[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效 
[root@k8s-master ~]# getenforce
Disabled

3. 安装docker

### 在所有主机上执行
--- 1.安装必要的一些系统工具
[root@k8s-master ~]# yum install -y yum-utils

--- 2.添加软件源信息
[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

--- 3.显示Docker 版本
[root@k8s-master ~]# yum list docker-ce --showduplicates

--- 4.安装docker版本,最好的20.10的版本,高版本的docker和K8S的版本会不兼容
[root@k8s-master ~]# yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24
[root@k8s-master ~]# yum -y install bash-completion
[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion

--- 5. 配置docker 优化
[root@k8s-master ~]# cat /etc/docker/daemon.json 
{ 
 "registry-mirrors":["https://docker.xuanyuan.me/"],
 "exec-opts": ["native.cgroupdriver=systemd"] 
}

--- 6. 配置docker开机自启动
[root@k8s-master ~]# systemctl enable --now docker
[root@k8s-master ~]# systemctl status docker

4. 安装kubeadm

4.1 配置软件源

### 所有主机都需要
[root@k8s-master ~]# cat /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0

4.2 安装kubeadm的版本(将来你要安装的K8S时请所有组件版本均保持一致!)

--- 1. 查看kubeadm的版本
[root@k8s-master ~]# yum -y list kubeadm --showduplicates | sort -r

--- 2. 安装kubeadm,kubelet,kubectl软件包
[root@k8s-master ~]# yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0

--- 3. 启动kubelet服务(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!
[root@k8s-master ~]# systemctl enable --now kubelet
[root@k8s-master ~]# systemctl status kubelet

4.3 使用kubeadm初始化master节点

--- 1. 初始化master节点
[root@k8s-master ~]#  kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers  --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16  --service-dns-domain=xingzhibang.top

--- 2. 拷贝授权文件,用于管理K8S集群
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

--- 3. 查看集群节点
[root@k8s-master ~]# kubectl get componentstatuses 
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
scheduler            Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""} 

--- 4. 在master 节点上查看加入节点的命令
[root@k8s-master ~]# kubeadm token create --print-join-command  
## 每个人的token都不一样哦,讲下面的命令直接在两台 node节点上执行即可
kubeadm join 192.168.0.160:6443 --token 7h6ftb.5ntnmjxnousjlf5j --discovery-token-ca-cert-hash sha256:542342ea9bbc38ded1e20f1a12cffe7515946edfa0fd42e3846d1d467450b000 

--- 5. 在master上查看集群节点状况
[root@k8s-master ~]# kubectl get nodes
## 这里的STATUS是正常的,因为还没有安装网络插件
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   2m59s   v1.23.17
k8s-node02   NotReady   <none>                 2m38s   v1.23.17
k8s-node03   NotReady   <none>                 2m31s   v1.23.17

--- 6. 可以把node02 和node3 的 ROLES 变成 work
[root@k8s-master ~]# kubectl label k8snode02 xianchaonode1 node-role.kubernetes.io/worker=worker
[root@k8s-master ~]# kubectl label k8snode03 xianchaonode1 node-role.kubernetes.io/worker=worker

相关参数说明:

  • --kubernetes-version:指定K8S master组件的版本号。

  • --image-repository:指定下载k8s master组件的镜像仓库地址。

  • --pod-network-cidr:指定Pod的网段地址。

  • --service-cidr:指定SVC的网段

  • --service-dns-domain:指定service的域名。若不指定,默认为"cluster.local"

5. 安装网络插件Calico

可以先下载calico的镜像,我这边有下载好的镜像:calico.tar.gz

calico的通用的yaml文件:calico.yaml

## 导入镜像,每个节点都需要导入镜像文件
[root@k8s-master ~]# docker load -i calico.tar.gz
[root@k8s-master ~]# docker apply -f calico.yaml
## 等待pod 变为running

## 查看node节点
[root@k8s-master ~]# kubectl get nodes 
NAME         STATUS   ROLES                  AGE    VERSION
k8s-master   Ready    control-plane,master   151m   v1.23.17
k8s-node02   Ready    worker                 150m   v1.23.17
k8s-node03   Ready    worker                 150m   v1.23.17

6. 测试

--- 1. 编写pod 资源
## 编写nginx的配置文件,这里使用的镜像地址是我的私有镜像地址
[root@k8s-master ~]# cat nginx.yaml 
apiVersion: v1  
kind: Pod  
metadata:  
  name: demo-pod  
  namespace: default  
  labels:
    app: myapp  
    env: uat    
spec:
  containers:      
  - name:  tomcat-pod-java 
    ports:
    - containerPort: 80 
    image: '192.168.0.77:32237/uat/nginx:1.22'

--- 2. 使用service将端口暴露出来用于测试
[root@k8s-master ~]# cat nginx-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  type: NodePort
  ports:
    - port: 80
      nodePort: 30080
  selector:
    app: myapp
    env: uat

--- 3. 浏览器访问主机加30080端口测试