ECS搭建开公网k8s集群
因为业务测试需要低版本的k8s,而ACK不提供v1.20版本以前的k8s集群,所以走上了自建集群的路。但ECS的集群新建的时候都是私网,所以如何建一个公网能连通的集群也是一个问题。
前言
因为业务测试需要低版本的k8s,而ACK不提供v1.20版本以前的k8s集群,所以走上了自建集群的路。但ECS的集群新建的时候都是私网,所以如何建一个公网能连通的集群也是一个问题。
一、云产品准备
1.开通ECS(包括VPC、交换机、安全组)
软硬件 | 配置 |
CPU和内存 | Master:至少2核4G;推荐4核8G Node:至少4核8G |
弹性IP | 所有主机都配上 |
操作系统 | CentOS 7.6 64位 |
-Master节点打算单节点部署就选个多核内存大点的,多节点部署2核4G够了;
-Master节点和Node节点设置在同一片VPC、Switch、安全组;
2.登陆服务器
服务器登录前记得重置实例密码,不然不知道密码。选择远程连接workbench,如果登录不上的话会有指引让开安全组开放白名单。
二、Master节点准备
登陆即将作为Master节点的服务器
1. 配置yum源
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2. 安装docker
$ sudo yum install -y docker-ce docker-ce-cli containerd.io
$ systemctl enable docker --now
3. 配置加速
$ sudo mkdir -p /etc/docker
$ vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
4. 配置基础环境
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
$ sudo setenforce 0
$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭swap
$ swapoff -a
$ sed -ri 's/.*swap.*/#&/' /etc/fstab
#允许 iptables 检查桥接流量
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
5. 下载镜像(v1.20.9可改为想下载k8s版本)
$ vim ./images.sh
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
$ chmod +x ./images.sh && ./images.sh
6. 安装kubelet、kubeadm、kubectl
$ vim /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
exclude=kubelet kubeadm kubectl
$ sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
$ sudo systemctl enable --now kubelet
7. 建立虚拟网卡
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0:1
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=当前服务器的公网IP # 不想去控制台就curl ifconfig.me
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
$ systemctl restart network
$ ip addr # 看看有没有公网ip,一般在eth0那栏
8. 修改kubelet启动参数
$ vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 在末尾添加参数 --node-ip=公网IP
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=xx.xx.xx.xx
9.添加配置文件
$ vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.9 #和前面的k8s版本匹配
apiServer:
certSANs:
- master #请替换为hostname
- xx.xx.xx.xx #请替换为公网IP
- xx.xx.xx.xx #请替换为私网IP
- 10.96.0.1 #不要替换
controlPlaneEndpoint: xx.xx.xx.xx:6443 #替换为公网IP
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
$ kubeadm init --config=kubeadm-config.yaml --ignore-preflight-errors=all
10. kubeconfig配置
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
11. 修改kube-apiserver参数
$ vim /etc/kubernetes/manifests/kube-apiserver.yaml
#定位到13行后
- --advertise-address=xx.xx.xx.xx # 修改为公网IP
- --bind-address=0.0.0.0 # 新增参数
12. 安装flannel网络插件
$ vim flannel.yaml
# 复制文件地址https://github.com/Life-Of-Coding/kubernetes/blob/master/kube-flannel.yaml
# 修改567行附近
args:
- --ip-masq
- --kube-subnet-mgr
- --public-ip=$(公网IP) # 新增
- --iface=eth0 # 新增
# 修改587行附近
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
-name: PUBLIC_IP #新增
valueFrom: #新增
fieldRef: #新增
fieldPath: status.podIP #新增
$ kubectl apply -f flannel.yaml # 创建flannel
$ kubectl get pods -A| grep flannel #查看flannel是否正常运行
三、Node节点准备
1.单节点部署
即使用master节点直接部署,那就在master服务器上执行
kubectl taint node <node_name> <taint>-
#<node_name>替换成自己节点名称,<taint>替换成taint,如:
kubectl taint node xinfeiecs node-role.kubernetes.io/master:NoSchedule-
#别把“-”漏掉
2.多节点部署
如果是多节点部署,那就在Node节点执行第三节的以下内容:
1.配置yum源
2.安装docker
3.配置加速
4.配置基础环境
5.下载镜像(v1.20.9可改为想下载k8s版本)
6.安装kubelet、kubeadm、kubectl
四、Node节点加入集群
去Master节点执行 kubeadm token create --print-join-command得到以下内容,拷贝
去Node节点粘贴,结果
在master节点输入kubectl get nodes,显示两个节点
测试一下,创建deployment ,kubectl create deployment nginx --image=nginx,查看kubectl get pods -o wide
测试网络可达性,curl 10.244.1.2
五、检验K8S公网连通性
1. 先放开安全组白名单
路径:实例详情-安全组-安全组详情,出入方向都打开端口6443
2. 从master节点拷出k8s证书
cat /etc/kubernetes/admin.conf
3.存到本地
vim ~/.kube/config,如果可以kubectl get nodes就可以
更多推荐
所有评论(0)