kubeadmFlannel基于公网IP搭建K8s集群
CentOS 7.6 系统主机 3 台,基于公网 IP 搭建 1 主 2 从的 Kubernetes 集群一、准备工作1.版本信息
Docker
20.10.21
Kubernetes
1.21.0-0
Flannel
0.20.22.集群角色规划
3 台 CentOS 7.6 主机,集群角色规划如下
Master
Worker01
Worker02
公网 IP
139.196.219.92
1.116.156.102
121.37.169.103
内网 IP
172.21.253.164
10.0.4.15
192.168.0.89
服务器厂商
阿里云
腾讯云
华为云 3.修改 hosts 文件
设置 master 主机的 hostname 为 m sudo hostnamectl set-hostname m
分别设置 2 台 worker 主机的 hostnamesudo hostnamectl set-hostname w1 sudo hostnamectl set-hostname w2
分别修改 3 台主机的 hosts 文件,这里配置的是公网 IP。因为云服务器厂商不同,无法搭建局域网 K8s 集群vim /etc/hosts 139.196.219.92 m 1.116.156.102 w1 121.37.169.103 w24.创建虚拟网卡
3 台主机分别填写对应的公网 IP # 打开文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0:1 # 填入内容 NAME=eth0:1 DEVICE=eth0:1 TYPE=Ethernet ONBOOT=yes BOOTPROTO=static NETMASK=255.255.255.0 IPADDR= # 重启网络 systemctl restart network.service
创建虚拟网卡前,查看 eth0 [root@w1 network-scripts]# ip a | grep eth0 2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 inet 10.0.4.15/22 brd 10.0.7.255 scope global eth0
创建虚拟网卡后,查看 eth0,可以发现多了一条记录 eth0:1 [root@w1 ~]# ip a | grep eth0 2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000 inet 10.0.4.15/22 brd 10.0.7.255 scope global eth0 inet 1.116.156.102/24 brd 1.116.156.255 scope global eth0:1
华为云主机通过上述方式添加虚拟网卡时失败,改为使用 Tunctl 安装虚拟网卡,参考这篇文章:CentOS 7 Tunctl 安装 虚拟网卡_tom.ma的博客-CSDN博客_tunctl
但需要注意的是,需要将这篇文章中的 tap0 改为 eth0:1,命名与其他主机保持一致 5.云服务器安全组设置
搭建 K8s 集群需要对云服务器安全组入方向规则进行配置,开启相应的端口
master 节点
协议
端口
作用
使用者
TCP
2379~2380
etcd 客户端 API
kube-apiserver, etcd
TCP
6443
api-server API
所有组件
UDP
8472
VxLan Overlay 网络通信
Flannel 网络插件
TCP
10250
kubelet API
kubelet, Control Plane 组件
TCP
10251
kube-scheduler
kube-scheduler
TCP
10252
kube-controller-manager
kube-controller-manager
worker 节点
协议
端口
作用
使用者
UDP
8472
VxLan Overlay 网络通信
Flannel 网络插件
TCP
10250
kubelet API
kubelet, Control Plane 组件
TCP
30000~32767
NodePort 服务
所有组件
二、系统基础配置1.更新并安装依赖
准备好 3 台主机后,每台主机均需要更新并安装依赖sudo yum -y update sudo yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp sudo yum install -y yum-utils2.基础配置
关闭防火墙systemctl stop firewalld && systemctl disable firewalld
关闭 SELinux (Security Enhanced Linux)setenforce 0 sed -i "s/^SELINUX=enforcing$/SELINUX=permissive/" /etc/selinux/config
关闭 swapswapoff -a sed -i "/swap/s/^(.*)$/#1/g" /etc/fstab
配置 iptables 的 ACCEPT 规则iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
设置系统参数cat < /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
三、安装 Docker1.配置阿里云镜像源sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 查看 Docker-CE yum list | grep docker-ce # 更新 yum 缓存 sudo yum makecache fast2.安装 Docker
安装指定版本 20.10.21sudo yum install -y docker-ce-20.10.21 docker-ce-cli-20.10.21 containerd.io3.启动 Docker# 启动 Docker sudo systemctl start docker # 设置开机启动 Docker sudo systemctl enable docker
四、安装 Kubernetes 集群所需组件(一) 安装 kubeadm, kubelete, kubectl1.配置 yum 源cat < /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 EOF2.开始安装# 确认 yum 中是否有指定版本 yum list kubeadm --showduplicates | sort -r # 安装 1.21.0-0 yum install -y kubeadm-1.21.0-0 kubelet-1.21.0-0 kubectl-1.21.0-03.Docker 和 K8s 设置为同一个 cgroup(1) 修改 daemon.json vim /etc/docker/daemon.json 设置 cgroup "exec-opts": ["native.cgroupdriver=systemd"] (2) 重启 Docker systemctl restart docker (3) 检查 kubelet,如果在输出信息中发现 No such file or directory,说明没问题 sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf4.修改 kubelet 启动参数
每台主机都要添加并指定对应的公网 IP,然后才能使用公网 IP 进行集群间通信vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
在 KUBELET_KUBECONFIG_ARGS 后面追加 --node-ip=
w2 节点的改动如下图所示
修改之后执行 daemon-reload 让修改生效systemctl daemon-reload5.启动 kubelet / 重启 kubelet
启动 kubeletsystemctl enable kubelet && systemctl start kubelet
重启 kubeletsystemctl restart kubelet(二) 拉取 kube-proxy, scheduler 等镜像
需要通过国内镜像源下载镜像1.查看 kubeadm 所需镜像kubeadm config images list
输出信息如下k8s.gcr.io/kube-apiserver:v1.21.14 k8s.gcr.io/kube-controller-manager:v1.21.14 k8s.gcr.io/kube-scheduler:v1.21.14 k8s.gcr.io/kube-proxy:v1.21.14 k8s.gcr.io/pause:3.4.1 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns/coredns:v1.8.0
遗憾的是需要科学上网才能下载这些镜像2.尝试用国内镜像源拉取镜像docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.14
经过测试,可以正常拉取,因此编写一个 Shell 脚本,通过国内镜像源拉取 kubeadm 所需镜像
切换到一个目录,编写 kubeadm_image.sh,用于从阿里云镜像源拉取镜像 / 重新打 tag / 删除原镜像#!/usr/bin/env bash # 镜像处理过程中,如果遇到错误,立即退出 set -e # 版本定义 readonly KUBE_VERSION=v1.21.0 readonly PAUSE_VERSION=3.4.1 readonly ETCD_VERSION=3.4.13-0 readonly CORE_DNS_VERSION=v1.8.0 readonly OFFICIAL_URL=k8s.gcr.io readonly ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers # 镜像列表 imageList=(kube-apiserver:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-proxy:${KUBE_VERSION} pause:${PAUSE_VERSION} etcd:${ETCD_VERSION} coredns:${CORE_DNS_VERSION}) # 镜像转换操作 for imageItem in ${imageList[@]} ; do # 从国内镜像源拉取镜像 docker pull $ALIYUN_URL/$imageItem # 给镜像重新打一个标签,命名为 kubeadm 所需的镜像 docker tag $ALIYUN_URL/$imageItem $OFFICIAL_URL/$imageItem # 删除原有镜像 docker rmi $ALIYUN_URL/$imageItem done # coredns 的镜像比较特殊,单独处理 docker tag ${OFFICIAL_URL}/coredns:${CORE_DNS_VERSION} ${OFFICIAL_URL}/coredns/coredns:${CORE_DNS_VERSION} docker rmi ${OFFICIAL_URL}/coredns:${CORE_DNS_VERSION}
运行脚本sh ./kubeadm_image.sh
五、搭建 Kubernetes 集群(一)用 kubeadm 初始化 master 节点1.执行 kubeadm initkubeadm init --kubernetes-version=1.21.0 --apiserver-advertise-address=139.196.219.92 --pod-network-cidr=10.244.0.0/16 -v=5
输出日志中出现如下信息时,说明 master 节点已经初始化成功了
Your Kubernetes control-plane has initialized successfully!
将末尾的 kubeadm join 信息保存起来,后面的步骤中需要在 worker 节点执行
2.集群健康检查
执行如下命令mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
集群健康检查# 检查集群状态 kubectl cluster-info # 健康检查 curl -k https://localhost:6443/healthz3.修改kube-apiserver 配置
kube-apiserver 添加 --bind-address=0.0.0.0,确认 --advertise-addres=<公网 IP>vim /etc/kubernetes/manifests/kube-apiserver.yaml
修改后如下图所示
(二)安装网络插件 Flannel1.当前集群状态kubectl get pods -n kube-system kubectl get nodes
可以看到,两个 coredns 还是 Pending 状态,此时还缺少网络插件2.安装 Flannel 网络插件
Kubernetes 为了让网络功能更加灵活,制定了 CNI 规范,由第三方实现网络的细节功能。目前有多种网络插件可供选择,使用较多的是 Calico 和 Flannel,其他的网络插件参考官方文档:https://kubernetes.io/docs/concepts/cluster-administration/addons/
由于公网环境使用 Calico 网络插件配置比较复杂,也没有调试成功,因此本文使用 Flannel 网络插件,安装命令如下,在 master 节点执行# 进入一个目录,假设为 /var/local/k8s wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改 kube-flannel.yml,新增 2 个配置vim kube-flannel.yml
第 1 处containers: - name: kube-flannel #image: flannelcni/flannel:v0.20.2 #for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.2 command: - /opt/bin/flanneld args: - --public-ip=$(PUBLIC_IP) - --iface=eth0 - --ip-masq - --kube-subnet-mgr
第 2 处env: - name: PUBLIC_IP valueFrom: fieldRef: fieldPath: status.podIP
修改后的配置如下
执行安装命令kubectl apply -f kube-flannel.yml(三)用 kubeadm 将从节点加入集群
执行如下命令,将 worker 节点加入集群kubeadm join 139.196.219.92:6443 --token o0zxc6.fmmh2sn8wlbt9onm --discovery-token-ca-cert-hash sha256:a52cec58178c402ecaecc74375d49495c1bf13661dd0b25b158e7caf5d619fa6 -v=5
输出日志中出现如下信息时,说明 worker 节点已经成功加入集群
This node has joined the cluster
将 2 个从节点都加入集群后,集群状态如下
可以看到,3 个节点都处于可用状态,3 个 Flannel pod 也是绑定的公网 IP
六、自定义 Pod 测试
pod-nginx.ymlapiVersion: apps/v1 kind: ReplicaSet metadata: name: my-nginx labels: tier: frontend spec: replicas: 6 selector: matchLabels: tier: frontend template: metadata: name: my-nginx labels: tier: frontend spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-nginx-service spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP nodePort: 30992 selector: tier: frontend
执行# 切换到 pod-nginx.yml 所在目录 kubectl apply -f pod-nginx.yml
查看 my-nginx 对外暴露的端口# 查看已暴露的端口 kubectl get services
w1 节点的公网 IP 为 1.116.156.102,w2 节点的公网 IP 为 121.37.169.103,NodePort 对外暴露的端口为 30992,访问结果如下
测试通过,K8s 集群搭建成功
七、参考文档
CentOS 7 Tunctl 安装虚拟网卡
选择 Kubernetes 网络插件
公网环境搭建 K8s 集群
耳鸣不一定是身体虚,找对中医辩证,仅需7味药,耳鸣不再叫!说起耳鸣,很多人都认为是身体虚了,需要补!但实际上,并不是这样的。耳鸣的类型有多种,今天就给大家讲一讲有一类耳鸣比较常见。案例一位让我印象很深的耳鸣患者,年龄47岁,双侧耳鸣将近一
大便溏稀,胃口不佳,浑身乏力,是时候搭配一些祛湿中成药了!大便溏稀,胃口不佳,浑身乏力,是时候搭配一些祛湿中成药了!中医认为,在冬季,人们是比较容易被湿邪入侵的,而且冬季往往会伴随着寒风,给人们带来健康问题。湿为阴邪,容易损伤阳气,身体健
滕哈格带领曼联取得8连胜3比0拿下弱旅查尔顿之后,曼联已经取得了各项赛事的8连胜,虽然这当中基本没有面对豪门的胜利,且绝大多数都不是大比分的结果,但积分到手远比以上这些内容要重要得多。更关键的是,球队基本
西亚卡姆2887猛龙胜黄蜂,鲍尔24分14助罗切尔空砍33分猛龙132120击败黄蜂,猛龙全场命中20记三分。开场西亚卡姆连进两球,特伦特打四分,阿奴诺比又命中三分,猛龙116领先。罗齐尔鲍尔华盛顿连中4记三分,西亚卡姆阿奴诺比也对飚远投,
桐乡学校善用短视频,提高家长带娃能力来源嘉兴日报嘉兴在线感谢爸爸妈妈这么办系列策略短视频,实用又简单明了,通过学习,我们掌握了在寒假期间如何正确带领孩子进行有效阅读的方法。今天,桐乡市濮院茅盾实验小学一名家长在学校新
2022东莞市监十大事件发布!每一件都关系你我他老舍说生活是种律动,须有光有影,有左有右,有晴有雨,滋味就含在这变而不猛的曲折里。2022年是极不平凡的一年,是历经考验笃定前行的一年。东莞市市场监管局在艰难中应对考验,在危中求机
1200万打水漂了,又一支球队被勇士坑了勇士可以说是当下最成功的NBA球队了,以现阶段的核心板底,他们在最近9年拿到了4座NBA总冠军奖杯,上赛季他们并不被看好,但最终还是凭借能力更强的核心球员以及更为先进全面的体系夺得
今日全国尿素出厂报价2023年1月11日哈喽,大家好!这里是化肥价格行情!关注我每天看最新尿素复合肥磷铵钾肥价格行情!今天(2023年1月11日)下面我们说说今天国内尿素价格行情!今日国内尿素市场大稳小动,部分价格小幅下
神农架景区对全国军人和三属免收门票1月9日,湖北文旅集团发布消息,对持优待证的退役军人和烈士遗属因公牺牲军人遗属病故军人遗属到湖北文旅集团旗下景区和酒店给予优惠优待。全国范围内持有中华人民共和国退役军人优待证的退役
杨凌人,陕西全民健康保上线!100元享最高450万保障来源杨凌融媒体中心近日,陕西人专属的普惠型补充医疗保险陕西全民健康保已正式上线继2021年以来全国28省200多个地市相继推出惠民保类产品后陕西人也有自己专属的政府部门指导的省级惠
尽管已经解封来瑞士的中国游客为何迟迟未到?瑞士德语广播电视台日前报道,尽管中国结束了此前新冠清零防疫政策,但来自中国的旅游热潮暂时不太可能实现。在这次政策放宽前的三年间,前往中国的旅行需要耗费大量的耐心和金钱,出发前需要进