写在前面:
本文将以 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
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-node032.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
EOF2.3 配置主机之间无密码登录
[root@k8s-master ~]# ssh-keygen #一路回车,不输入密码
## 把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-master ~]# ssh-copy-id -i k8s-node02
[root@k8s-master ~]# ssh-copy-id -i k8s-node032.4 关闭swap分区,提升性能
## 所有主机执行
## 临时关闭
[root@k8s-master ~]# swapoff -a
## 永久关闭
[root@k8s-master ~]# vim /etc/fstab
#如果是克隆的虚拟机,需要删除 UUID
#/dev/mapper/centos-swap swap swap defaults 0 02.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.conf2.6 关闭防火墙
## 所有主机上执行
[root@k8s-master ~]# systemctl stop firewalld ; systemctl disable firewalld2.7 关闭selinux
[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@k8s-master ~]# getenforce
Disabled3. 安装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 docker4. 安装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=04.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 kubelet4.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.176. 测试
--- 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端口测试
评论