K8s: 裸机初始化Kubernetes集群环境
目前可用的 k8s版本在 1.29,每个版本配置不一样,最新版本基于 containerd.io 的, 删除了docker运行时。也可以使用 docker 的运行时,但配置比较麻烦,所以,我们使用 1.22.4版本,这是一个简单的版本。如果在 阿里云等云产品上,还需要配置安全组, 配置安全组类似于这样。还有需要了解 master 节点不跑任务,都是在 工作节点来跑。删除之前服务器上的一些 相关软件
环境准备
- 这里要先准备 linux 环境,提供一下几种方案
- 1 )在云产品上购买一台裸机
- 2 )选择一台刚安装好的 linux 服务器
- 3 )选择虚拟机安装 linux
- 这里,我选择linux的环境为 centos
在安装了 centos 的裸机上进行搭建
1 )在所有节点上禁用 selinux
- 查看 selinux 状态: $
getenforce
- 修改
/etc/selinux/config
文件,将SELINUX=enforcing
改为SELINUX=disabled
- 重启 $
shutdown -r now
或 $init 6
或 $reboot
2 ) 关闭 Firewalld 防火墙
- 查看防火墙状态: $
systemctl status firewalld
- 关闭防火墙: $
systemctl stop firewalld
- 开机禁用防火墙: $
systemctl disable firewalld
3 )关闭 swap
- 临时关闭:$
sudo swapoff -a
- 永久关闭:$
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
(选择这个)
4 )同步时间
- 4.1 )centos 8 之前可以使用 ntpdate
- 安装软件: $
sudo yum -y install ntpdate
- 同步: $
ntpdate 0.asia.pool.ntp.org
- 注意:之后版本,上述不能使用,使用
- 4.2 )较新版本的 centos 采用如下方案
- 检查当前时间设置:$
timedatectl status
- 更改时区:$
timedatectl set-timezone Asia/Shanghai
这时候基本可以了 - 使系统时间自动与网络时间服务器同步:$
timedatectl set-ntp true
5 )配置hostname
- 查看hostname: $
hostname
- 为节点配置hostname: $
hostnamectl set-hostname k8s.master
(推荐) - 永久修改方式: $
vi /etc/hostname
配置ip 和 域名,比如:k8s.master 这个需要重启 - 配置完成后,执行第一个进行验证
- 注意,上面配置的是 主节点,工作节点也类似配置
6 )为所有节点添加配置 hosts
- $
vi /etc/hosts
11.11.11.11 master 22.22.22.22 node1 33.33.33.33 node2
- 注意:集群内的所有主机都要配置
- 之后相互 ping 一下,比如 在 master 上执行 ping node1
- 上面ip使用你真实的ip地址
- 11 代表 master, 22 代表 node1, 33 代表node2 这里是模拟(假设的ip)
7 )为所有节点进行安装
-
目前可用的 k8s版本在 1.29,每个版本配置不一样,最新版本基于 containerd.io 的, 删除了docker运行时
-
也可以使用 docker 的运行时,但配置比较麻烦,所以,我们使用 1.22.4版本,这是一个简单的版本
-
除了配置有些不一样,用法都基本一样
-
开始配置 k8s 安装源
# 添加 k8s 安装源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
- 如遇到权限问题,换种方式, 自行处理,
- 如 $
sudo vi /etc/yum.repos.d/kubernetes.repo
[kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
-
配置 Docker 安装源
# 添加 Docker 安装源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 如果没有 命令,执行 $
yum -y install yum-utils
- 备注:集群内所有节点均执行
- 如果没有 命令,执行 $
-
删除之前服务器上的一些 相关软件,(裸机的话,不用执行)
yum remove docker-ce docker-ce-cli containerd.io -y
- 备注:所有节点均执行
-
开始正式安装
sudo yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce docker-ce-cli containerd.io
- 这里没有指定 docker-ce, docker-ce-cli, containerd.io 的版本,安装最新版
-
注意
- 主节点需要组件
docker
(也可以是其他容器运行时)kubectl
集群命令行交互工具kubeadm
集群初始化工具
- 工作节点需要组件
docker
(也可以是其他容器运行时)kubelet
管理 Pod 和容器,确保他们健康稳定运行kube-proxy
网络代理,负责网络相关的工作
- 所有节点均可执行上述安装命令,不需要特别区分
- 主节点需要组件
-
如果是最新版本,还需要配置
cri-dockerd
和containerd
, 这里不做演示 -
启动 kubelet、docker,并设置开机启动
sudo systemctl enable kubelet sudo systemctl start kubelet sudo systemctl enable docker sudo systemctl start docker
-
修改 docker 配置: $
sudo vi /etc/docker/daemon.json
# kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了 { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"] }
-
重启生效
sudo systemctl daemon-reload sudo systemctl restart docker
- 注意:所有节点执行
-
在 master 节点上执行,创建集群
sudo kubeadm init --kubernetes-version=1.22.4 --apiserver-advertise-address=11.11.11.11 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
- 在这执行完成后,会再 log 日志中 提示你 一个 加入集群的命令
- 这个命令在其他节点上执行, 类似于如下
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 11.11.11.11:6443 --token 37xcrq.ksdfs6l8rqkounif \ --discovery-token-ca-cert-hash sha256:1cb2eabf2b0259b1ce09b8ba52340ea7bfb799444edf2afe362affb71ea81668
-
接着创建相关目录和文件
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群 # 复制授权文件,以便 kubectl 可以有权限访问集群 # 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
-
接着,在主节点上将 /etc/kubernetes/admin.conf 文件拷贝到 工作节点上
sudo scp /etc/kubernetes/admin.conf root@k8s.node1:/etc/kubernetes/admin.conf
- 复制的时候,可能需要输入密码
- 这里会有拷贝权限问题, 自行处理
- 比如:$
sudo chmod +r /etc/kubernetes/admin.conf
- 或者分两步移动,可以先拷贝到 node1 节点的 ~/admin.conf, 之后再mv过去
-
现在工作节点上,也有这个文件了, 在工作节点上 执行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
-
在工作节点上,加入集群
sudo kubeadm join 11.11.11.11:6443 --token 37xcrq.ksdfs6l8rqkounif --discovery-token-ca-cert-hash sha256:1cb2eabf2b0259b1ce09b8ba52340ea7bfb799444edf2afe362affb71ea81668
- 如果这个命令忘记了,或者遗失了
- 重新获取方式,在 master 节点上执行:$
kubeadm token create --print-join-command
-
验证节点: $
kubectl get nodes
- 可以看到 有 master 和 node1 但是 not ready
8 ) 配置flannel网络
-
安装网络插件 flannel, 现在都是 not ready 的状态, 需要安装 flannel
# 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 这个只在 主节点 上 安装即可
-
之后获取状态验证: $
kubectl get nodes
- 这时候发现已经是 ready 的状态了 (需要等一小会儿)
-
验证:$
ifconfig |grep flan
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
-
下面的配置可忽略,仅作为可能性问题的解决
-
如果你后续在运行 $
kubectl describe pod/nginx
发现 Events 中有下面这个错误networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory
- Flannel是由CoreOS开源的针对k8s的网络服务
- 其目的是为解决k8s集群中各主机上Pod之间的通信问题
- 其借助etcd维护网络IP地址分配,并为每个Node节点分配一个不同的IP地址段
- 在每个节点创建文件
/run/flannel/subnet.env
写入以下内容,配置后等待一会就好了 - $
vi /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16 FLANNEL_SUBNET=10.244.0.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=true
- 注意,所有节点执行,而且这个文件在重启后可能会消失
- 如果这个文件消失,就是在初始化的时候的问题
- 按照上述init不会出问题,重启后也不会丢失这个文件
-
基于以上,k8s 环境基本搭建完成
-
还有需要了解 master 节点不跑任务,都是在 工作节点来跑
9 ) 重新 init
- 会有重新init集群的场景,如果需要重置,需要特别注意
- $
sudo kubeadm reset
注意,按照日志上的提示,删除必要的目录文件 - 之后重新走上面的 kubeadm init … 的流程
- 注意了:如果主节点重新初始化,工作节点也要执行 reset, 并重新执行上述相关配置
10 )启动pod
-
运行 nginx 应用任务, 在工作节点来运行
kubectl run nginx --image=nginx:latest
-
再执行 $
kubectl get pod -o wide
查看pod状态 -
也可以按照之前说的 通过
kubectl describe pod/nginx
查看具体创建状态 -
让外部可访问
kubectl port-forward --address 0.0.0.0 pod/nginx 8000:80 # 将本机80端口转发至Pod的 80 端口
- 注意在 centos9 上能使用80端口会有权限问题
- 这里使用 8000 来对应pod中的80端口
- 这样,在 外部,通过
22.22.22.22:8000
即可访问了
11 ) 云主机特别注意
- 如果在 阿里云等云产品上,还需要配置安全组, 配置安全组类似于这样
- 入站规则,添加规则
- 类型:自定义
- 来源:0.0.0.0/0
- 协议端口: TCP:80
- 策略: 允许
- 备注: 80
更多推荐
所有评论(0)