在 Linux 内公网、云服务器搭建一套 K8s 集群
前言
本文讲述如果在 Linux 搭建内/公网 Kubernetes 集群的详细步骤,解决搭建过程中的问题。
准备工作
- Linux CentOS 7.x 两台及以上,本文用的 7.6
- 本文配置默认是在内网环境下,即服务器在同一个局域网环境,公网的差异配置有额外标注 [差异-序号],在后面可看到对应配置。
- 如果是云服务器记得提前在安全组中放开使用到的端口 [主节点 6443] [工作节点测试使用的 80]。
- 安装步骤多个节点可以并行操作,注意某些操作仅主/工作节点执行。
- 部署成功后可以尝试使用 Kubesphere 或 Rancher 容器管理平台进行管理。
Linux 环境设置
# 停止、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
# 永久
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时
setenforce 0
# 关闭 Swap
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 临时
swapoff -a
- 设置主机名
# 示例 hostnamectl set-hostname k8s-master
# 示例 hostnamectl set-hostname k8s-node1
hostnamectl set-hostname <hostname>
- 将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
- 添加 hosts【仅主节点执行】差异-1
cat >> /etc/hosts << EOF
192.168.2.1 k8s-master
192.168.2.2 k8s-node1
# 192.168.2.3 k8s-node2 ...
EOF
- 使以上配置生效
sysctl --system
- 时间同步
yum install ntpdate -y
ntpdate time.windows.com
Docker 安装
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
# 设置开机启动 && 启动
systemctl enable docker && systemctl start docker
# 查看版本
docker --version
- 设置 Docker 仓库地址。可直接用,也可自己在阿里云创建账号用自己的地址
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
- 重启 Docker
systemctl restart docker
K8s 组件安装
- 添加 yum 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
- 安装Kubeadm、Kubelet、Kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet
- Kubeadm 初始化【仅主节点执行】差异-2
kubeadm init \
# 主节点 IP
--apiserver-advertise-address=192.168.2.1 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
# service、pod 网段设置,不冲突即可
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
- Kubectl 设置,Kubeadm 初始化成功后控制台会打印这些指令(一模一样)【仅主节点执行】
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 查看节点
kubectl get nodes
- 执行 join 脚本,kubeadm 初始化成功后控制台会打印出这些脚本【仅工作节点执行】
kubeadm join 192.168.1.1:6443 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
- 如果忘记了 join 脚本,可以在主节点执行以下命令重新生成
kubeadm token create --print-join-command
- 安装 Pod 网络插件(CNI)【仅主节点执行】
# 也可以将 kube-flannel.yml 下载到当前目录执行以下语句
# kubectl apply -f kube-flannel.yml
kubectl apply -f <kube-flannel.yml 链接,网上很多>
测试
# 部署 nginx (deployment,pod)
kubectl create deployment nginx --image=nginx
# 暴露 nginx 端口给外网访问 (service)
kubectl expose deployment nginx --port=80 --type=NodePort
# 获取 pod 和 service 信息
kubectl get pod,svc
# 访问地址:http://NodeIP:<service随机暴露的端口>
外网差异配置
- 差异-1 hosts 配置
cat >> /etc/hosts << EOF
<外网 IP> k8s-master
<外网 IP> k8s-node1
# <外网 IP> k8s-node2 ...
EOF
- 差异-2 kubeadm 初始化
kubeadm init \
# 主节点 IP
--apiserver-advertise-address=<外网 IP> \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
# service、pod 网段设置,不冲突即可
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行完上面的初始化脚本后会卡在 etcd 初始化的位置,因为 etcd 绑定端口的时候使用了外网 IP,而云服务器外网 IP 并不是本机的网卡,而是网关分配的一个供外部访问的 IP,从而导致初始化进程一直重试绑定,长时间卡住后失败。
解决办法:在卡住过程中,修改初始化生成的 etcd.yaml 中的配置成示例图一样,进程会自动重试并初始化成功。
# - --listen-client-urls=https://0.0.0.0:2379
# - --listen-peer-urls=https://0.0.0.0:2380
vim /etc/kubernetes/manifests/etcd.yaml
- [差异-3] 集群内部互相访问不通
集群按上面步骤搭建好后,Pod 之间互相访问不了,StatefulSet 也无法通过 <podName.serviceName> 这种方式直接访问,但是通过 NodePort 暴露给外部访问确是可以访问到的目标服务的。
主节点执行 kubectl exec -it bash 进入 Pod 命令会连接超时最终失败,并打印出超时信息,显示使用的 IP 是工作节点的内网 IP,它们不在同一个局域网中自然是访问不通的。
如果网络互通,进入 Pod 容器直接 ping 其他 Pod/Service 的 IP 或者 StatefuSet 虚拟 DNS 地址 [PodName].[ServiceName].[Namespace].svc.cluster.local 是可以通的。
解决办法:使用 iptables IP 重定向,如这种情况下让系统访问工作节点内网 IP 时转而访问工作节点的外网 IP。
iptables -t nat -A OUTPUT -d <内网 IP> -j DNAT --to-destination <外网 IP>
其他问题
警告 Cgroup Driver 不一致
节点加入集群会警告 docker 和 kubelet 的 Cgroup Driver 不一致,但是暂未发现影响,如图:
解决办法:修改 docker 的 Cgroup Driver 为 systemd
vim /usr/lib/systemd/system/docker.service
# 修改下面这项,后面加上 --exec-opt native.cgroupdriver=systemd
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd
# 重新加载并重启
systemctl daemon-reload
systemctl restart docker
# 查看当前 Docker Cgroup 驱动
docker info | grep Cgroup
重复 init/join 集群报错
比如:主节点初始化失败,再次尝试报错;加入集群时出错了修改后再次加入报错;主节点删除了工作节点,工作节点再次加入报错等情况。如图:
解决办法:使用 kubeadm 重置后再执行 Join 命令
# 询问时输入 y 回车
kubeadm reset
forward 策略为 drop
我不确定这个会不会引发集群问题,先记录下
解决办法:就是修改 iptables forward 策略为 ACCEPT。可以在系统中直接改,但是重启后又会复原。可以通过修改docker配置达到永久生效的目的
vim /lib/systemd/system/docker.service
# 在[Service]标签下加入如下参数
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
# 重新加载并重启
systemctl daemon-reload
systemctl restart docker
# 前后查看 iptables 策略
iptables -nL
Rancher安装
- Master 节点执行以下指令就行,官网有 快速开始 介绍
- Rancher 是一个容器管理平台,可以直接创建集群,也可以将原有集群添加进去交给它管理。通过UI界面创建集群中各个容器/组件非常方便。
- 安装好后通过 80/443 端口访问,云服务器记得开放这两个端口
sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
参考
在 Linux 内公网、云服务器搭建一套 K8s 集群的更多相关文章
- 使用三台云服务器搭建真正的Redis集群
三台云服务器搭建redis集群# 今天花了一天的时间弄集群redis:遇到了很多坑,从头开始吧 环境讲解: 两台配置:1核2G,另一台:1核1G: 操作系统:Centos 7.6 Redis:3.2. ...
- 快速搭建一套k8s集群环境
参考官网 kubeadm是官方提供的快速搭建k8s集群的开源工具,对于非运维人员学习k8s,kubeadm方式安装相对更简单. kubeadm创建一个集群:https://kubernetes.io/ ...
- 云主机搭建Kubernetes 1.10集群
一.基础环境 云主机 下载软件包 将所有软件下载至/data目录 # 链接:https://pan.baidu.com/s/13DlR1akNBCjib5VFaIjGTQ 密码:1l69 # 链接:h ...
- 带你自行搭建虚拟机和Redis集群环境,值得收藏!
前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...
- Spring Cloud Alibaba(7)---docker-compose搭建nacos1.4.0集群
docker-compose搭建nacos1.4.0集群 有关Nacos之前写过四篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba ...
- k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
非常非常抱歉,新年上班第一天, 在今天阿里云上气候突变情况下,由于我们开船技术差,在今天 10:15~12:00 左右的访问高峰,我们竟然把船给开翻了,造成近2个小时整个博客站点无法访问,由此给您带来 ...
- 用云服务器搭建frp服务(超详细)
初学.没有云服务器的时候总想着怎样才能让别人访问到自己的项目. 在查阅了百度,逛过了一些论坛之后,了解到了 内网穿透 这个词. 经过一番钻研,通过 手机 + KSWEB + 电脑 成功将内网服务映射出 ...
- 基于腾讯Centos7云服务器搭建SVN版本控制库
基于腾讯Centos7云服务器搭建SVN版本控制库 最近在和小伙伴组队参加一个关于人工智能的比赛,无奈不知道怎么处理好每个人的代码托管问题,于是找到了晚上免费svn托管服务器的服务,但是所给的免费空间 ...
- 阿里云服务器搭建SVN
简单步骤介绍 1:安装svn apt-get install subversion 2. 开启svn服务器 svnserve -d 检查是否开启:ps aux | grep svnserve 若出现如 ...
- Linux博客系统服务器搭建
linux(CentOS)服务器搭建 前言 拿到购买的服务器信息后,会给出一个服务器的账号的密码,看你自己设置,账号一般为root. 拿到后,可在阿里云官网登录进入服务器.然后就可以进行一下的流程从而 ...
随机推荐
- react文件分片上传
参考文档: https://blog.csdn.net/weixin_39887846/article/details/113492372 https://juejin.cn/post/6844904 ...
- centos7 硬盘扩容
参考 linux系统下,新加硬盘并把现有的/home目录扩容 最后加的容量在/目录 而不是在/home目录,而我本来把/home目录独立挂载在一个分区了 创建逻辑卷.可用使用命令 pvcreate / ...
- Python中RSA的PKCS#1、PKCS#8,MD5加密
一.Python-RSA RSA库只支持PKCS#1的密钥格式 需要安装第三方库rsa pip install rsa python-rsa官方地址:https://stuvel.eu/python- ...
- SQL Server 解析Json(单层/多层)
一,单层Json数据取出 1.取出取出@JsonData字符串中的 __type,DocNo,OrderPriceTC,Organization_Code 字段 DECLARE @JsonData ...
- sql-labs less34--less41
less 34 汉 addslashes() 函数返回在预定义的字符前添加反斜杠的字符串. 预定义字符是: 单引号(') 双引号(") 反斜杠(\) NULL 提示:该函数可用于为存储在数据 ...
- texstudio设置外部浏览器及右侧预览不能使用问题
刚装的texstudio,今天不知什么原因右侧显示的pdf文件一直是以前的,百度了下没找到,自己摸索了下,只需要把构建里面pdf查看器更改下即可 如果想更改外部pdf查看器,只需要设置下命令里面外部p ...
- jsp第4个作业(2)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- JMeter MD5加密 默认小写 转换为大写
出处:https://www.cnblogs.com/scholars-xian/p/11718854.html 使用内置函数加密 1)使用 ${__MD5(123,)} 进行MD5加密(32位小写) ...
- 磊磊零基础打卡算法:day17 c++堆排序
5.20 前言吐槽: 今天是5.20啦,但是作为单身修狗的我只能和代码过啦...继续加油算法打卡!!! 堆排序: 堆就是一棵完全二叉树 二叉堆是一种支持插入,删除,查询最值的数据结构.他其实是一棵满足 ...
- ASP.NET WEBAPI oken验证
看了下网上关于.net webAPI 的案例全是坑 验证成功了不被微信服务器接收 微信客服有找不到,提问也没人回 自己测试好几个小时 终于发现返回结果只要个string 双引号都不用加 public ...