目标:利用下面三台服务器搭建出 k8s 集群环境
规格 | 分类 | IP |
---|---|---|
2c4g | Master Node | 150.158.84.188 |
2c4g | Worker Node 1 | 1.117.70.6 |
1c2g | Worker Node 2 | 119.45.246.56 |
参考文章: https://blog.csdn.net/weixin_43988498/article/details/122639595
一、前置工作
PS: 需要在每台主机执行
1.1、创建虚拟网卡
1.2、系统设置
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
关闭 swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
根据规划设置主机名
hostnamectl set-hostname <hostname>
添加 hosts
(换成自己的IP)
cat >> /etc/hosts << EOF
<公网IP1> master
<公网IP2> node1
<公网IP3> node2
EOF
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
将桥接的IPv4
流量传递到iptables
的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
时间同步
yum install ntpdate -y
# 统一时区,为上海时区
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash -c "echo 'Asia/Shanghai' > /etc/timezone"
# 统一使用阿里服务器进行时间更新
ntpdate ntp1.aliyun.com
1.3、安装安装包
安装 docker
添加阿里云的 Docker
镜像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
修改 docker 配置
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": { "max-size": "100m" },
"storage-driver": "overlay2",
"registry-mirrors": [
"https://cwv6ddlx.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
重启 docker
systemctl start docker
systemctl enable docker
安装下载 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
安装 kubelet
、 kubeadm
、kubectl
即可
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
# 启动kubelet
systemctl enable kubelet && systemctl start kubelet
1.4、开放端口
控制面/master
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API server | 所有 |
TCP | 入站 | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
TCP | 入站 | 10259 | kube-scheduler | 自身 |
TCP | 入站 | 10257 | kube-controller-manager | 自身 |
工作节点
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | 自身, 控制面 |
TCP | 入站 | 30000-32767 | NodePort Services | 自身 |
所有节点
协议 | 方向 | 端口范围 | 目的 | 使用者 |
---|---|---|---|---|
UDP | 入站 | 8472 | vxlan Overlay 网络通信 | Overlay 网络 |
1.5、修改启动参数
修改systemd管理的kubectl, 添加 kubelet的启动参数--node-ip=公网IP, 每个主机都要添加并指定对应的公网ip, 添加了这一步才能使用公网 ip来注册进集群
find / -name 10-kubeadm.conf # 查找配置文件
sudo vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
添加 --node-ip=<公网IP>
重启服务:systemctl daemon-reload
二、搭建启动
2.1、master 初始化
sudo kubeadm init \
--apiserver-advertise-address=150.158.84.188 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--control-plane-endpoint=150.158.84.188 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
--v=5
初始化成功后会给出提示,执行以下操作让 Master
主机上所有用户可以使用 kubectl
命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
还给出了其他节点加入集群的命令:
kubeadm join 150.158.84.188 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
token 是存在有效期的,过期后可重新获取
kubeadm token create --print-join-command
2.2、master 节点设置
在 master
节点,kube-apiserver
添加--bind-address=0.0.0.0
和修改--advertise-addres=<公网IP>
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
2.3、worker 节点加入
在每个 work node
上执行一下上面的join
指令即可:
kubeadm join 150.158.84.188 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
2.4、安装CNI网络插件
在master
节点执行
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改 yaml 配置文件,添加两处地方:
containers:
- name: kube-flannel
image: rancher/mirrored-flannelcni-flannel:v0.16.1
command:
- /opt/bin/flanneld
args:
- --public-ip=$(PUBLIC_IP)
- --iface=eth0 # 替换成你的网卡名称
- --ip-masq
- --kube-subnet-mgr
env:
- name: PUBLIC_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
注意 --iface=eth0
需要替换成你的真实网卡名,也就是前面创建虚拟网卡那步创建的
同时:实操的时候发现,需要在每个节点安装网络插件,不仅仅是在 master
节点
2.4、状态检查
检查集群状态: kubectl get nodes
[root@master /]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 7d11h v1.23.6
node1 Ready <none> 6d11h v1.23.6
node2 Ready <none> 7d11h v1.23.6
检查系统Pods状态:kubectl get pod -n kube-system -o wide
[root@master /]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-64897985d-gr4kv 1/1 Running 0 7d11h 10.244.0.3 master <none> <none>
coredns-64897985d-svs5l 1/1 Running 0 7d11h 10.244.0.2 master <none> <none>
etcd-master 1/1 Running 164 7d11h 150.158.84.188 master <none> <none>
kube-apiserver-master 1/1 Running 0 7d11h 150.158.84.188 master <none> <none>
kube-controller-manager-master 1/1 Running 1 (7d11h ago) 7d11h 150.158.84.188 master <none> <none>
kube-proxy-8bwrd 1/1 Running 0 7d11h 119.45.246.56 node2 <none> <none>
kube-proxy-nwrvj 1/1 Running 0 7d11h 150.158.84.188 master <none> <none>
kube-proxy-pdtx6 1/1 Running 0 5d15h 10.0.4.5 node1 <none> <none>
kube-scheduler-master 1/1 Running 3 (7d11h ago) 7d11h 150.158.84.188 master <none> <none>
三、常见问题
3.1、worker 节点执行 kubectl get nodes 出错
The connection to the server localhost:8080 was refused -did you specify the right host or port?
参考资料:
解决办法:
scp /etc/kubernetes/admin.conf root@ip:/etc/kubernetes/
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
3.2、集群重置
如果安装失败想重新安装需要卸载集群
删除之前的环境(每个节点):
sudo kubeadm reset
rm -rf /root/.kube/
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/kubelet/
sudo rm -rf /var/lib/dockershim
sudo rm -rf /var/run/kubernetes
sudo rm -rf /var/lib/cni
sudo rm -rf /var/lib/etcd
sudo rm -rf /etc/cni/net.d
注意,即使这样也没有删除掉k8s对本机网卡iptables转发的配置,完全的删除还需要执行:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm -C
ipvsadm --clear