网上搜到的公网搭建k8s都不太一致, 要么说的太复杂, 要么镜像无法下载, 所以写了一个简洁版,小白也能一次搭建成功
使用的都是centos7,k8s版本为1.23.0 使用二台机器搭建的, 三台也是一样的思路
1.所有节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
2.所有节点都修改 hosts
vim /etc/hosts
# 外网设置对应地址
1.12.245.xxx node1
139.159.140.xxx master
3.所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
4.所有节点将桥接的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
5.所有节点时间同步
yum install ntpdate -y
ntpdate time.windows.com
6.所有节点配置一个虚拟网卡
vim /etc/profile
#公网地址
sudo ifconfig eth0:1 1.12.245.xxx up
7.所有节点添加安装源
yum默认下载慢, 使用aliyun Yum源repo文件
#Centos-7, 我使用的是centos7 就是7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
更新缓存
yum clean all
yum makecache
# 添加 k8s 安装源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/
# 添加 Docker 安装源
# 先安装yum-config-manager
yum -y install yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
8.所有节点安装所需组件
使用的是1.23版本
yum install -y kubelet-1.23.0-00 kubectl-1.23.0-00 kubeadm-1.23.0-00 docker-ce
并设置开机自启
systemctl enable kubelet
systemctl start kubelet
systemctl enable docker
systemctl start docker
9.所有节点修改 docker 配置
# kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了
# 镜像源可以使用https://docker.1panel.live 来加速
cat <<EOF > daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://docker.1panel.live"]
}
EOF
mv daemon.json /etc/docker/
# 重启生效
systemctl daemon-reload
systemctl restart docker
10.所有节点开放端口
其实有些端口node节点不用的, 但是还是都打开, 免得因为端口不通通信失败
注意最后一个是UDP端口
协议 | 方向 | 端口范围 | 目的 |
---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API server |
TCP | 入站 | 2379-2380 | etcd server client API |
TCP | 入站 | 10250 | Kubelet API |
TCP | 入站 | 10259 | kube-scheduler |
TCP | 入站 | 10257 | kube-controller-manager |
UDP | 入站 | 8472 | Overlay 也就是Flannel通信端口 |
11.所有节点修改启动参数
先找这个配置在哪里, 不同版本存放目录可能不一样
find / -name 10-kubeadm.conf
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
然后添加在ExecStart最后添加--node-ip=<公网IP>
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
12.主节点 master 用 kubeadm 初始化集群
需要替换为你自己机器的公网ip 139.159.140.xxx
sudo kubeadm init \
--apiserver-advertise-address=139.159.140.xxx \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--control-plane-endpoint=139.159.140.xxx \
--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 139.159.140.xxx:6443 --token bhywug.i7bj42ecbuvxxx
--discovery-token-ca-cert-hash sha256:50b856221954fe4183e2a9a7ba29679bdfd316b526ccfee144f6xxx
如果过期了可以重新获取:
kubeadm token create --print-join-command
13.修改主节点 master 的kube-apiserver 参数
vim /etc/kubernetes/manifests/kube-apiserver.yaml
command下添加 , 标注 的ip也要核对是否正确
- --bind-address=0.0.0.0
14.node节点加入
使用上述提到的命令
kubeadm join 139.159.140.xxx:6443 --token bhywug.i7bj42ecbuxxx --discovery-token-ca-cert-hash sha256:50b856221954fe4183e2a9a7ba29679bdfd316b526ccfee144f6d13bc3xxx
15.将master节点配置信息同步到node节点
一般在$HOME/.kube 或者 ~/.kube/config 下,将config 文件复制到子节点对应目录就行了
16.master 节点安装CNI网络插件
使用flannel, 在master节点执行
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改args添加之前配置的网卡
vim kube-flannel.yml
- --public-ip=$(PUBLIC_IP)
- --iface=eth0
并添加
env:
- name: PUBLIC_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
对应部分整体如下
containers:
- name: kube-flannel
image: docker.io/flannel/flannel:v0.25.4
command:
- /opt/bin/flanneld
args:
- --public-ip=$(PUBLIC_IP)
- --iface=eth0
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: PUBLIC_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
然后运行
kubectl apply -f kube-flannel.yml
17.检查状态
kubectl get node
显示ready, 如果不是, 检查需要开放的端口是否开放, CNI网络插件pod是否运行正常
kubectl get pod -n kube-system -o wide
18.让master主节点调用pod
因为主节点存在不可调度污点, 查看命令
kubectl describe node master
让master能运行pod
kubectl taint nodes master node-role.kubernetes.io/master-
#或者所有节点
kubectl taint nodes --all node-role.kubernetes.io/master-
恢复污点
kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule
19.给node节点打上role标识
kubectl label node node1 node-role.kubernetes.io/worker=worker