前言

        因为业务测试需要低版本的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就可以

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐