Skip to content
On this page

目标:利用下面三台服务器搭建出 k8s 集群环境

规格分类IP
2c4gMaster Node150.158.84.188
2c4gWorker Node 11.117.70.6
1c2gWorker Node 2119.45.246.56

参考文章: https://blog.csdn.net/weixin_43988498/article/details/122639595

一、前置工作

PS: 需要在每台主机执行

1.1、创建虚拟网卡

参考文章:Centos7 创建虚拟网卡(tun/tap)

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    # 永久

根据规划设置主机名

shell
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

安装 kubeletkubeadmkubectl 即可

shell
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入站6443Kubernetes API server所有
TCP入站2379-2380etcd server client APIkube-apiserver, etcd
TCP入站10250Kubelet API自身, 控制面
TCP入站10259kube-scheduler自身
TCP入站10257kube-controller-manager自身

工作节点

协议方向端口范围目的使用者
TCP入站10250Kubelet API自身, 控制面
TCP入站30000-32767NodePort Services自身

所有节点

协议方向端口范围目的使用者
UDP入站8472vxlan Overlay 网络通信Overlay 网络

1.5、修改启动参数

修改systemd管理的kubectl, 添加 kubelet的启动参数--node-ip=公网IP, 每个主机都要添加并指定对应的公网ip, 添加了这一步才能使用公网 ip来注册进集群

shell
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 初始化

shell
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>

shell
sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml

margin-right

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 配置文件,添加两处地方:

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
yaml
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